Am 30. August 2010 hat das Team von Twitter nun endgültig den Basic Auth Zugang abgestellt. Eigentlich eine gute Idee, denn OAuth ist eine feine Sache (natürlich nicht ohne Nachteile, aber das ist ein anderes Thema).
Auf jeden Fall muss man nun alle Scripts und Tools, die mit Basic Auth laufen entsprechend umstellen. So funktioniert beispielsweise mein Tutorial „Direct Message versenden mit Perl“, das ich vor einigen Monaten hier in dieses Blog eingestellte habe so nicht mehr, auch das müsste auf OAuth umgerüstet werden.
Eine komplette Umstellung auf OAuth ist eine aufwendige Sache. Im Folgenden wird nur ein schneller und einfacher Weg beschrieben, der erklärt, wie man einfache Scripts, die von nur einem Twitter-Account „benutzt“ werden, mit OAuth versorgt. (Bei komplexeren Angelegenheiten empfiehlt es sich sowieso, fertige Twitter-Module für Perl, z. B. Net::Twitter zu verwenden).
Als erstes müssen Sie Ihr „application“ bei Twitter registrieren:
- Surfen Sie auf http://dev.twitter.com
- Loggen Sie sich mit dem Twitter-Account ein, mit dessen Account später auch das Script ausgeführt werden sollen (Wenn Sie also ein Script schreiben, dass direct messages von „peter_panter“ an dessen Follower senden soll, loggen Sie sich als „peter_panter“ ein).
- Füllen Sie das Registrierungs-Formular aus. Application-Type: Browser, Callback-URL: leer lassen, Read&Write auswählen (kann ggf. später noch geändert werden, kann aber Probleme geben, vgl. Anmerkungen unten).
- Jetzt erhalten Sie den Consumer Key und das Consumer Secret (dies sind die Zugangsschlüssel für die Anwendung, die sich nicht ändern würden, wenn Sie einen anderen Benutzer das Script ausführen lassen – in unserem Fall: Würden Sie das Script ändern, dass nicht „peter_panter“ sondern „theo_tiger“ direct messages versenden soll würde sich der Consumer Key und das Consumer Secret nicht ändern).
- Klicken Sie auf „My Access Token“. Da erhalten Sie das Access Token sowie das Access Token Secret für den aktuell eingeloggten User (in unseren Beispiel „peter_panter“. Würde Sie das Script ändern, dass „theo_tiger“ direct messages versenden soll müssen sie dessen Access Token und Access Token Secret generieren – dies ginge nicht so einfach mit dev.twitter.com, da müssten Sie dann oAuth komplett implementieren und nicht wie hier in einem „Workaround“).
Nun müssen Sie Ihr Script anpassen.
- Installieren Sie das Perl-Modul Net::OAuth (ist in CPAN, deshalb einfach in die Shell ‚perl –MCPAN –e ‚install NET::OAuth‘ tippen).
- Der Ausgangspunkt für folgendes Beispiel ist dieses Script aus dem alten Tutorial, das derzeit noch mit Basic Auth verschickt.
- Mit OAuth sieht es dann so aus:
#!/usr/bin/perl use LWP::UserAgent; use Encode; use Net::OAuth; $Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A; # OAuth: Tokens für den Twitter-User my $accesstoken = "???"; my $accesssecret = "???"; # OAuth: Keys für die App my $consumerkey ="???"; my $consumerkeysecret="???"; # Allgemeines my $APIurl = 'https://twitter.com/direct_messages/new.xml'; my $reqmethod = 'POST'; # Name des UserAgent - eigentlich egal my $UAname="myTwitterScript"; # 8stellige Zufallszahl für nonce my $zufallszahl = int(rand(90000000))+ 10000000; # direct message vorbereiten $empfaenger="Simon_A_Frank"; $nachricht="Hallo Simon!"; # OAuth request vorbereiten my $request = Net::OAuth->request("protected resource")->new( consumer_key => $consumerkey, consumer_secret => $consumerkeysecret, request_url => $APIurl, request_method => $reqmethod, signature_method => 'HMAC-SHA1', timestamp => time, nonce => '$zufallszahl', token => $accesstoken, token_secret => $accesssecret, extra_params => { text => decode_utf8($nachricht), user => $empfaenger } ); # OAuth signieren $request->sign; #sinnvolle LWP Settings - siehe doku my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; # http Request vorbereiten und senden my $httpheader = HTTP::Headers->new('User-Agent' => $UAname); my $httprequest = HTTP::Request->new($reqmethod, $APIurl, $httpheader, $request->to_post_body); my $httpresponse = $ua->request($httprequest); # Erfolg? if ($httpresponse->is_success) { #Hat geklappt! print "DM erfolgreich verschickt!nn"; print "nContent: " . $httpresponse->content . "n"; } else { #ging nicht ... print "Nicht erfogreich, Fehler: " . $httpresponse->status_line; }
Noch ein paar Anmerkungen:
- Das ist eine quick&dirty Lösung für kleine Scripts, ansonsten sollte man mit den Tokens und Keys (insbesondere den geheimen) sorgsamer umgehen.
- Wenn Sie keine direct message sondern ein Update senden möchten sind folgende zwei Änderungen notwendig:
my $APIurl = ‚https://twitter.com/statuses/update.xml‘;
extra_params => { status => decode_utf8($nachricht) } - Wenn Sie bei der Registrierung der App nur „Read“ auswählen wird der falsche Access Token generiert bzw. mit dem Token kann man nur Lesen – auch wenn man das später umstellt; entfernen Sie die Verbindung der Anwendung zu dem Account und stellen Sie diese wieder her; mit dem neuen Token geht es dann.
P.S.
Probleme? Fragen? Anregungen? Ich helfe jederzeit und gerne – einfach einen Kommentar oder Mail schreiben, die Antwort kommt schnellstmöglich. Unternehmen, die Unterstützung, Beratung oder Schulung bei der API- oder Webprogrammierung, der Social-Media-Entwicklung oder dem Social-Media-Management benötigen finden zudem entsprechende Angebote meiner Firma auf der Website www.Frank-IT-Beratung.de
Achtung: Im Oktober 2012 hat sich die APIUrl geändert – Details siehe http://frank-it-beratung.com/blog/2012/10/11/twitter-api-ressource-urls-ohne-versionsnummer-seit-heute-ungultig/
Noch ein kleiner Tipp (wegen der vielen Anfragen): Bei Problemen mit den Umlauten kann es sein, dass Ihre „Quelle“ nicht UTF8 sondern ISO-LAT1 ist, dann ist Folgendes zu empfehlen:
text => decode(„iso-8859-1“,$nachricht)
Pingback: Facebook Pinnwandeinträge mit einem Perl-Script erzeugen – ein kurzes Tutorial « Frank IT Consulting&Training
Leider nein, bei mir läuft dies auch für Statusupdates bestens. Vielleicht ein Tippfehler? Haben Sie http:// statt https:// in der $APIUrl geschrieben? Oder den extra_param vergessen (siehe oben unter Anmerkungen, 2. Punkt)?
Vielen Dank für Ihre Mühe, das Skript läuft bei mir einwandfrei für direkte Nachrichten. Bei Statusupdates bekomme ich ein „403 Forbidden“. Haben Sie eine Idee, was das sein kann?
… habs gefunden, habe bei extra_params ‚text‘ nicht auf ’status‘ umgeändert. Ich kann die API-Konsole unter http://dev.twitter.com/console nur empfehlen.
Na dann, wunderbar 🙂
Interessante Seite, gibt es einen Newsletter den ich abonnieren kann, damit ich immer auf dem neusten Stand bin?
Keine Newsletter, aber einen RSS Feed!