Tutorial: Twitter-API Programmierung mit Perl (neue Version)

Vor gut zwei Jahren wurde ich von der österreichischen Perl-Zeitung gefragt, ob ich auf Grundlage der in diesem Blog veröffentlichen Posts  ein kurzen zusammenfassenden Beitrag über Twitter mit Perl schreiben könne, was ich gerne gemacht habe (Details siehe mein Blogpost vom 3. März 2012). Inzwischen hat sich bei der Twitter-API einiges getan (z. B. wurde die XML-Unterstützung eingestellt) und mein damals veröffentlichtes Beispiel würde so nicht mehr funktionieren – deshalb heute ein Update.

Tutorial: Twitter-API Programmierung  mit Perl am Beispiel einer „Single-User-Lösung“ (neue Version von Februar 2014)

Im Folgenden soll kurz erklärt werden, wie eine einfache „Single-User-Lösung“ mit Perl realisiert werden kann. In meinem Beispiel soll durch ein Script diverse Tweets  im Namen eines bestimmten Twitter-Account verschickt werden. Das ist deshalb eine „Single-User-Lösung“, da auf die Authentifizierung verzichtet wird und das Script eben nur im Namen dieses einen Twitter-Accounts die API nutzen kann. Möchte man eine komplexere Multi-User-Lösung, empfiehlt es sich, fertige Twitter-Module für Perl, z. B. Net::Twitter zu verwenden und nicht wie hier nur eine Minimallösung zu realisieren.  Aber für einfache Aufgaben, etwa um mit einem crontab gesteuertem Script automatisch News aus irgendwelchen Quellen auszulesen und in Tweets zu verwandeln, um einen Retweet-Bot oder eine Twitter-Wall zu bauen ist folgende „Single-User-Lösung“ bestens geeignet.

Als erstes muss die eigene „Application“ bei Twitter registriert werden:

  1. Dafür ruft man  die Developer-Seite von Twitter auf: http://dev.twitter.com
  2. Als nächstes meldet man sich mit dem Twitter-Account an, mit dem später auch das Script ausgeführt werden sollen.
  3. Jetzt wählt man „Create App“ und denkt sich einen schönen Namen sowie eine Beschreibung für seine App aus (diese können Nutzer u. U. zu Gesicht bekommen, je nach Client wird diese Info unter den Tweets angezeigt).
  4. Auch eine URL ist anzugeben (z. B. die Homepage der Firma oder des Entwicklers), die Callback-URL muss leer gelassen werden.
  5. Jetzt ist die App erstellt. Unter „Setting“ muss man nur noch „Read&Write“ auswählen, sonst hat man nur Lesezugriff auf Twitter und kann keine Tweets versenden.
  6. Auf der Seite „Details“ findet man nun den OAuth-Consumer-Key und -Secret. Diese werden später benötigt (es sind die Zugangsschlüssel für die Anwendung, die sich nicht ändern würden, wenn man einen anderen Benutzer das Script ausführen lassen will).
  7. Unter „Details“ klickt man auf „Create my access token“. Darauf erhält man das OAuth-Access-Token und -Secret für den aktuell eingeloggten Twitter-User. Achtung: Möchte man, dass nicht nur ein User, sondern unterschiedliche das Script nutzen, braucht man eine „Multi-User-Lösung“. Dafür müsste dann die OAuth-Authentifizierung komplett implementieren, was nicht Inhalt dieses Tutorials ist (vgl. oben).

Bevor die Programmierarbeit beginnen kann muss ggf. nur Net::OAuth installiert werden – zu finden auf CPAN, deshalb einfach in die Shell

perl –MCPAN –e  ‘install NET::OAuth’

tippen. Und so sieht der Programmcode aus:

#!/usr/bin/perl

use strict;
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="???";

# Beispiel 1: Eine direct message senden
my $APIurl 
 = 'https://api.twitter.com/1.1/direct_messages/new.json';
my $empfaenger="Simon_A_Frank";
my $nachricht="Und nochmals: Hallöchen Simon!";

# Beispiel 2: Ein Tweet senden
#my $APIurl 
#  = 'https://api.twitter.com/1.1/statuses/update.json';
#my $nachricht="Hallo dies ist ein Test-Tweet!"; 

# OAuth request vorbereiten
my $request = Net::OAuth->request("protected resource")->new(
      consumer_key     => $consumerkey,
      consumer_secret => $consumerkeysecret,
      request_url => $APIurl,
      request_method => 'POST',
      signature_method => 'HMAC-SHA1',
      timestamp => time,
      nonce => int(rand(9000) + 1000),
      token => $accesstoken,
      token_secret => $accesssecret,
      extra_params => { 
         text => decode("iso-8859-1",$nachricht),
         user => $empfaenger 
      }
); 

# für Beispiel 2:
#extra_params => { 
#      status => decode_utf8($nachricht)
#}

# OAuth signieren
$request->sign;

#sinnvolle LWP Settings - siehe LWP-Doku
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;

# http Request vorbereiten und senden
my $httpheader = HTTP::Headers->new(        
 'Authorization' => $request->to_authorization_header,
 'Content-Type' => 'application/x-www-form-urlencoded'          
);
my $httprequest = HTTP::Request->new('POST', $APIurl, 
 $httpheader, $request->to_post_body);
my $httpresponse = $ua->request($httprequest);

# Erfolg?
if ($httpresponse->is_success) {
   print "Erfolgreich!\n\n";
   print "\nContent: " . $httpresponse->content . "\n";
}
else { 
 print "Nicht erfogreich, Fehler: " 
  . $httpresponse->status_line;
 print "\nContent: " . $httpresponse->content . "\n";
}

Noch ein paar Tipps:

  • Für das Versenden von Tweets gibt es noch etliche weitere Parameter, die in der ausführlichen offiziellen Doku zu finden sind , Details siehe https://dev.twitter.com/docs/api/1.1/post/statuses/update
  • Natürlich kann man mit der Twitter REST-API nicht nur Tweets versenden sondern vieles mehr: z. B. Tweets auslesen, direct messages versenden, Followers hinzufügen usw., Details siehe: https://dev.twitter.com/docs/api
  • Bei der Registrierung der App ist die Standardeinstellung inzwischen „Read“. Dies muss man vor der Erstellung der Access Token umstellen (vgl. oben). Hat man dies vergessen muss man nach der Änderung der Zugriffseinstellungen auf „Recreate my acccess token“ klicken.
  • Fehler bei der Übertragung können auch daran liegen, dass die $nachricht nicht richtig codiert ist und deshalb der gesamte Request nicht korrekt signiert wird. Statt status => decode_utf8($nachricht) kann man es für erste Tests einfach auch mal ohne ein „decode“ probieren status => $nachricht wenn man darauf achtet, dass die $nachricht keine Umlaute, Satz-, Sonder- und Leerzeichen enthält.
  • Beim Testen sollte man daran denken, dass Twitter zwei gleichlautende Tweets hintereinander ablehnt, deshalb empfiehlt es sich, bei jedem Testlauf eine andere $nachricht zu versenden. Außerdem ist auf das API-Limit zu achten – derzeit erlaubt Twitter ca. 350 API-Calls pro Stunde. Möchte man seine Follower mit Test-Tweets nicht verärgern, empfiehlt es sich zudem, den Test mit direct message statt mit Tweets durchzuführen.

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

 

Dieser Beitrag wurde unter API, Perl, Programmierung, Social Networks, Twitter veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Ein Kommentar zu Tutorial: Twitter-API Programmierung mit Perl (neue Version)

  1. Pingback: Twitter API mit Perl: Tweet mit Bild | Socialweb Dev-Blog // Frank-IT-Beratung.de

Kommentar verfassen

This site uses Akismet to reduce spam. Learn how your comment data is processed.