Der oft belächelte Twitter-Service taugt nicht nur zur eitlen Selbstdarstellung, sondern lässt sich mit Hilfe des angebotenen API programmieren und damit zweckentfremden .
Wozu bitte braucht man Twitter? Keine ganz einfach zu beantwortende Frage. Denn warum um Gottes willen sollte man der Welt per Handy mitteilen, dass man mit Freunden beim Pizzaessen weilt, im Fitnessstudio ochst oder gerade mit dem Flugzeug gelandet ist?
Die von Twitter oder in der freien Variante auch von Identi.ca angebotene Plattform fürs so genannte Microblogging hat aber ganz erstaunliche Nebeneffekte. Wer herausfinden will, was die Menschheit im Augenblick bewegt, dem helfen weder Googles Suchmaschine noch Wikipedia weiter, aber ein Blick auf die Startseite (Abbildung 1) des Twitter-Service.

Abbildung 1: Wozu bitte braucht man Twitter? Die Startseite des trotz dieser Ratlosigkeit beliebten Internetdienstes verrät es nicht direkt, hat zumindest aber brandaktuelle Äußerungen parat.
Dort zwitschern Leute, die vor Ort politische Unruhen, Naturphänomene, den neuesten Kinofilm oder Sportereignisse erleben – und das alles noch bevor die Redaktionen von Tageszeitungen oder Fernsehsender die Nachrichten auch nur erfassen können (Abbildung 2).
Dass Twitter überhaupt funktioniert, grenzt an ein Wunder. Der Service bietet nur minimale Funktionen und seine Infrastruktur ist so wackelig, dass Ausfälle zur Tagesordnung gehören. Und trotzdem füttern 6 Millionen Nutzer das zerbrechliche Geschöpf unermüdlich mit Nachrichten, lassen es mit brandaktuellen Informationen pulsieren und halten es seit 2006 am Leben. Das Twitter-Team fügt nur sehr zögerlich neue Funktionen hinzu, und zwar meist auch erst dann, wenn die treuen Twitter-Fanatiker dem simplen Riesen über abenteuerlich kreative Umwege neue Funktionen abgeluchst haben.
Twitter kann nämlich eigentlich sehr wenig: Nutzer mit einem Account dürfen 140 Zeichen lange Kurznachrichten an den Service schicken, die dieser dann veröffentlicht. Sie erscheinen sowohl in einer Public Time Line als auch unter dem Account des Users.
In Kombination mit mobilen Telefonen über SMS oder Web entsteht so eine zwar oberflächliche, aber brandaktuelle Kommunikation. Wen interessiert, was ein User so von sich gibt, der trägt sich als dessen Follower (Verfolger) ein, erhebt diesen damit zum “Freund” und bekommt dessen Nachrichtenstrom in den eigenen eingespielt. Typischerweise folgt jeder User einigen anderen Leuten und andere verfolgen umgekehrt ihn. Ein unausgeglichenes Verhältnis deutet auf ein Problem hin: So verfolgen Spammer sehr viele Nutzer, aber niemand himmelt sie an oder liest ihre Nachrichten.
Twitter kostet nichts, setzt aber vermutlich irgendwann doch die Daumenschrauben an, um dann Geld zu verdienen. Der freie Klon Identica.org (Abbildung 3) kommt optisch leicht unterschiedlich daher, bietet aber exakt die gleichen Funktionen, und zwar bis ins Detail und ins URL-Layout. Das hat zur Folge, dass zum Beispiel das Perl-Modul Net::Twitter mittels eines einzigen Parameters auf das Konkurrenzprogramm Identi.ca umstellen kann, indem es einfach [http://twitter.com] durch [http://identi.ca] ersetzt.
Zögerlich mit neuen Features
Twitter zögert wie gesagt mit neuen Features und lässt die User die 140 verfügbaren Zeichen pro Nachricht als eine Art Programmiersprache zweckentfremden, um neue Funktionen auszutesten. Re-tweets, also zitierwürdige Nachrichten, die Verfolger eines Twitterers wiederum an ihre Verfolger weiterleiten, sind so ein Beispiel. Da eine derartige Funktion im ursprünglichen Twitter nicht existierte, brachten findige User die Buchstabenfolge »RT@Username« in der Nachricht unter, bis sich Twitter endlich erbarmte und den so geschaffenen Quasi-Standard anerkannte.
Twitter bietet eben nur grobe Bauklötzchen, und dies spiegelt sich auch in dem schlanken API wieder. Um so erstaunlicher ist es daher, dass der O\’Reilly-Verlag gar ein knapp 400 Seiten starkes Buch zum Thema [2] herausgab, das nicht nur die Programmierschnittstelle erklärt, sondern auch ein knappes Tutorial zur Webprogrammierung und eine ganze Reihe erfolgreicher Twitter-Applikationen von Drittanbietern vorstellt.
Alles ausradiert
Wozu nun das API? Klarerweise könnte man damit recht einfach einen weiteren Client mit grafischer oder auch textbasiertem GUI schreiben, doch auch zur Behebung von Twitter-Fehlern ist es recht nützlich. Beim Anlegen des Test-Accounts »perlsnapshot« muss ich wohl die falsche Taste erwischt haben, denn auf einmal tauchten dort sage und schreibe 20 Freunde auf, von denen ich noch nie im Leben gehört hatte. Diese einzeln zu löschen wäre im Browser eine Tortur gewesen, aber zum Glück ratterte das in fünf Minuten zusammengeklopfte Skript in Listing 1 durch die Liste der falschen Freunde und warf sie samt und sonders wieder aus meinem Leben.
|
Listing 1: |
|---|
01 #!/usr/bin/perl
02 use strict;
03 use Net::Twitter;
04
05 my $nt = Net::Twitter->new(
06 traits => [qw/API::REST/],
07 ssl => 1,
08 username => "perlsnapshot",
09 password => "*******",
10 );
11
12 my $friends = $nt->following();
13
14 for my $friend (@$friends) {
15 print "$friend->{screen_name}n";
16 $nt->destroy_friend( $friend );
17 }
|
Passwort weg, Holland in Not
Wer Wert auf Sicherheit legt, dem fällt sicher gleich das im Programmcode in Zeile 9 stehende Passwort auf, mit dem das Skript sich gegenüber dem Twitter-Service authentifiziert. Wegen der gesetzten Option »ssl« geht das Passwort allerdings nicht im Klartext über die Leitung, da das verwendete Perl-Modul Net::Twitter in diesem Fall mit Twitter via Https-URLs kommuniziert.
Doch wo Applikationen wie Pilze aus dem Boden schießen, stellt sich bald die Frage, wie man es am besten vermeidet, jedem beliebigen Drittanbieter sein geheimes Passwort mitzuteilen. Denn befindet sich in der Kette auch nur ein einziger Schlamper, der das Passwort verschusselt, dann ist Holland in Not.
Zur Behebung dieses Problems eignet sich das von Twitter neuerdings angebotene Oauth. Es räumt verschiedenen Applikationen Rechte an einem Benutzerkonto ein. Statt den Nutzernamen samt Passwort an diverse Anbieter weiterzuleiten und zu hoffen, dass kein einziger Schindluder damit treibt, erhält jeder Anbieter einen einzigartigen Token, den der Nutzer aber auch jederzeit widerrufen kann, ohne andere Anbieter zu beeinträchtigen, die separate Token verwenden.
Das Perl-Modul Net::Twitter unterstützt Oauth, doch besteht Twitter darauf, die Applikation unter [4] zu registrieren, bevor es die notwendigen Daten für Token Consumer Key und Consumer Secret herausrückt. Das heißt: Falls der Service gerade funktioniert, was zum Zeitpunkt der Entstehung dieses Artikels mal wieder nicht der Fall war.
Twitter als Logdatei
Eine weitere Anwendung des Twitter-API zeigt Listing 2, ein Perl-Modul, das sich in andere Perl-Prozesse einbinden lässt, um mit der von ihm bereitgestellten Funktion »twit()« Nachrichten an Twitter zu senden. In typischer Perl-Manier akzeptiert die Funktion entweder eine Nachricht als String oder eine Referenz auf einen Hash, der ein Feld namens »message« mit sich führt. Ein zweiter Parameter »home« deutet für den Fall, dass der Root-User den gerade laufenden Befehl ausführt (wie zum Beispiel ein Backup-Programm), auf das Homeverzeichnis des Users, in dem eine Yaml-Datei mit dem Passwort des Twitter-Accounts liegt.
Wozu das Ganze? Die in [5] vorgestellte Bewässerungsanlage für meine Balkonpflanzen tut auch nach mehr als zwei Jahren noch klaglos ihren Dienst, aber hin und wieder würde ich im Urlaub doch gerne einen Blick auf ihre Aktivitäten werfen. Was liegt also näher, als die Pumpenaktivität auf Twitter zu melden, von wo sie dann aus dem Internetcafé einsehbar ist oder auf dem Mobiltelefon landet?
Das Modul »TwitSend.pm« in das damals beschriebene Skript »water« zur Pflanzenbewässerung einzubinden und die Funktion »twit()« mit einer Nachricht und dem Pfad zu einer Yaml-Datei mit dem Account-Passwort für »perlsnapshot« aufzurufen war in 5 Minuten erledigt.
Die Implementierung sieht aus wie im Beispielskript »twitsend« (Listing 3), das Ergebnis auf Twitter wie in Abbildung 4 dargestellt. Die morgendliche Bewässerungsdauer der Pflanzen an einem warmen Augusttag betrug demnach 60 Sekunden und die Datensicherung auf meinem Entwicklungsrechner war exakt um 11:49 beendet.
|
Listing 3: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use MyTwitSend qw(twit);
04
05 twit({
06 message => "This is yet another test message.",
07 home => "/home/mike",
08 });
|
Passwortschutz
Das Verfahren funktioniert ähnlich wie der vom Kolumnenkollegen Charly Künast in [3] kürzlich vorgestellte »ttytter«-Client. Das Skript benötigt nur noch die Yaml-Datei ».twitsend« im Homeverzeichnis »/home/mike«. Sie sollte mit den Rechten »0500« angelegt sein, damit sie nur für den Accountbesitzer selbst les- und schreibbar ist. Sie enthält nur die Zeile »password: ****« mit dem Passwort (Abbildung 5). Die im Modul »TwitSend.pm« in Zeile 37 (Listing 2) auskommentierte »identica«-Direktive nordet Skripte übrigens statt auf Twitter auf den freien Klon Identi.ca ein.

Abbildung 5: Die Konfigurationsdatei für »TwitSend.pm«, die das User-Passwort des verwendeten Twitter-Accounts setzt.
|
Listing 2: |
|---|
01 package TwitSend;
02 use strict;
03 use Net::Twitter;
04 use YAML qw(LoadFile);
05 use base qw(Exporter);
06 our @EXPORT_OK = qw(twit);
07
08 ###########################################
09 sub twit {
10 ###########################################
11 my($message) = @_;
12
13 my $opts = {};
14
15 if(ref($message) eq "HASH") {
16 $opts = $message;
17 $message = $opts->{message};
18 }
19
20 if(! defined $message) {
21 die "No message given!";
22 }
23
24 if(length $message > 140) {
25 die "Message needs to be < 140 chars";
26 }
27
28 my $home = $opts->{home};
29
30 ($home) = glob "~" unless defined $home;
31
32 my $yaml = LoadFile( "$home/.twitsend" );
33
34 my $nt = Net::Twitter->new(
35 traits => [qw/API::REST/],
36 ssl => 1,
37 # identica => 1,
38 username => "perlsnapshot",
39 password => $yaml->{password},
40 );
41
42 $nt->update( $message );
43 }
44
45 1;
|
Doppelt fällt durch
Zu beachten ist noch, dass Twitter identische Nachrichten stillschweigend ignoriert. Ein Cronjob, der täglich einmal »Backup fertig« aussendet, erzielt also nicht das gewünschte Ergebnis, aber mit einem Datumsstempel versehen wird ein Schuh daraus.
Es wäre außerdem denkbar, verschiedene Prozesse unter mehreren Twitter-Accounts zwitschern zu lassen und diese dann von einem persönlichen Account aus über Twitters Follow-Funktion selektiv zu verfolgen. Aus dem Urlaub zurückgekehrt führt dann ein »unfollow« auf der Twitter-Webseite wieder zur Entkopplung der gezwitscherten Logs vom restlichen Nachrichtenstrom der leibhaftigen Freunde.
Das über Net::Twitter ansprechbare API bietet außerdem noch eine Reihe weiterer Funktionen. So ist es mit ihm ohne Weiteres möglich, Tweets zu löschen, administrative Funktionen wie »follow()« und »unfollow()« oder »block()« auszuführen, private Nachrichten zu senden, den öffentlichen Nachrichtenstrom anzuzapfen und noch vieles mehr. Twitter beschränkt die Anzahl der Zugriffe dabei auf 100 pro Stunde – was in aller Regel aber wohl ausreichen sollte – und verfolgt die Aktivitäten sowohl per IP als auch per Account.
Installation zu Fuß
Leider sind Net::Twitter und der Rattenschwanz notwendiger Zusatzmodule vom CPAN nicht als Ubuntu-Packages erhältlich. Deshalb bleibt nichts andres übrig, als sie manuell zu installieren. Aber eine mit »perl -MCPAN -eshell« aufgerufene CPAN-Shell erledigt das mit Hilfe des Kommandos »install Net::Twitter« zuverlässig. Es spielt alle notwendigen abhängigen Module automatisch auf. Weil Net::Twitter auch noch das mächtige Perl-Objektsystem Moose verwendet und zudem Oauth unterstützt, kann sich das Einrichten allerdings zeitlich etwas in die Länge ziehen. Deshalb sei dem Installateur an dieser Stelle eine Kaffeepause angeraten. (jcb)
|
Infos |
|---|
|
[1] Listings zu diesem Artikel: [ftp://www.linux-magazin.de/pub/listings/magazin/2009/10/Perl] [2] Kevin Makice, “Twitter API, Up and Running”: O\’Reilly 2009 [3] Charly Kühnast, “Zwitschermaschine”: Linux-Magazin07/2009, S. 71 [4] Twitter Oauth Application Registration: [http://twitter.com/oauth_clients] [5] Michael Schilli, “Der Mörder ist nimmer der Gärtner”: [https://www.linux-magazin.de/heft_abo/ausgaben/2007/03/der_moerder_ist_nimmer_der_gaertner] |
|
Der Autor |
|---|
|
Michael Schilli arbeitet als Software-Engineer bei Yahoo! in Sunnyvale, Kalifornien. Er hat “Goto Perl 5” (deutsch) und “Perl Power” (englisch) für Addison-Wesley geschrieben und ist unter [mschilli@perlmeister.com] zu erreichen. |









