Prof. Dr. Detlef Kreuz

Twitter und Python: Erste Entscheidung

Ich habe heute ein wenig mit verschieden Python-Bibliotheken zum Zugriff auf der Twitter herum gespielt. Ich wollte mir klar werden, was diese Bibliotheken können und was nicht. Eine erste Recherche (Suche nach "python twitter") lieferte mir schon vor einiger Zeit de facto zwei erst zu nehmende Kandidaten. Beide kapseln die Twitter-API, jedoch mit einer jeweils anderern Philosophie.

Mein erster Kandidat ist python-twitter. Damit hatte ich vor einiger Zeit meine damals 1818 Tweets gesichert. python-twitter stellt als Start die Klasse Api zur Verfügung, mit deren Methoden so gut wie alle Aufrufe durchgeführt werden. Diese Aufrufe liefern meistens Listen von Datenobjekten, wie z.B. Status, DirectMessage oder User. Mit denen kann man dann weiterarbeiten. Als Beispiel der Code, um die Texte der eigenen Timeline, mitsamt der eigenen Freunde darzustellen:

import twitter
api = twitter.Api(username='username', password='password')
timeline = api.GetFriendsTimeline()
for status in timeline:
    print status.text

Um meine Tweets zu sichern hatte ich folgenden Code ausgeführt:

import twitter
import pickle
api = twitter.Api()
timeline = api.GetUserTimeline('dkreuz', count=1818)
datei = open('sicherung.pickle', 'w')
pickle.dump(datei, timeline)
datei.close()

Alles schön handlich und gut gekapselt. Aber mit zwei Nachteilen, doch dazu später. Und wie ich später las: es klappte zufällig. Egal.

Der andere Kandidat sind die Python Twitter Tools. Hier werden nur die Aufrufe sehr grob gekapselt, die Ergebnisse sind meistens Listen von Dictionaries (a.k.a. HashMaps, für die Java-affinen Leser ;-) ). Die Implementierung orientiert sich an der des Python-Moduls xmlrpclib. Dies funktioniert, das die Twitter-API sehr einheitlich aufgebaut ist. Die Python Twitter Tools sind so generisch, dass die meisten zu erwartenden Änderungen der Twitter-API nicht zu Änderungen der Bibliothek führen, evtl. aber zum aufrufenden Programmcode. Methodenaufrufe werden über einen netten Python-Trick abgefangen und direkt auf die Twitter-API abgebildet. Auch hier das Beispiel zur Darstellung der Texte der eigenen Timeline:

import twitter
api = twitter.Twitter('username', 'password')
timeline = api.statuses.friends_timeline()
for status in timeline:
    print status['text']

(Achtung: auch Python Twitter Tools stellt ein Modul mit dem Namen twitter bereit, genau wie python-twitter. Es sind aber unterschiedliche Module!)

Analog der xmlrpclib wird der Aufruf statuses.friends_timeline auf die Twitter-API statuses/friends_timeline abgebildet. Die Python Twitter Tools definieren, im Gegensatz zu python-twitter, keine eigenen, an der Twitter-API orientierten Methoden.

Tja, welche Bibliothek ist nun die geeignete?

Die Bibliothek python-twitter hatte ich wegen der netten Abstraktionen ausgewählt, um meine Tweets zu sichern. Das ging ganz gut. Bis ich mir die Twitter-API im Detail angesehen habe. Zum Beispiel erlaubt es die Methode statuses/user_timeline eine minimale und eine maximale Tweet-ID anzugeben. Die Methode GetUserTimeline() von python-twitter erlaubt dagegen nur eine minimale Tweet-ID. Entweder wurde die Angabe einer maximalen Tweet-ID vom Autoren von python-twitter für nicht notwendig befunden oder diese Möglichkeit wurde erst vor kurzem von Twitter eingeführt, aber noch nicht in python-twitter nachvollzogen. Entsprechendes gibt es von der Klasse User zu berichten: Twitter liefert das Datum, wann der Benutzer sich bei Twitter angemeldet hat, aber nicht python-twitter.

Der andere Punkt, der gegen python-twitter spricht, ist seine Bindung an den Dienst Twitter. Im Quellcode ist fest und schwer änderbar für jede Methode die URL "http://twitter.com/" hineincodiert. Zum Beispiel bei GetFriendsTimeline die Zeichenkette "http://twitter.com/statuses/friends_timeline.json ". Das ist solange nicht problematisch, so lange man nur den Dienst Twitter nutzen möchte. Ich selbst nutze parallel den Dienst Identi.ca. Schließlich weiß man ja nie, was irgendwann mal mit Twitter wird. Identi.ca basiert auf einem quelloffenen PHP-System. Und: Identi.ca bietet eine Twitter-kompatible API an. Software, wie z.B. Gravity nutzen dies, um mehrere Accounts sowohl bei Twitter als auch bei Identi.ca zu verwalten.

Der einzige Unterschied zwischen API-Zugriffen auf Twitter und Identi.ca sind unterschiedliche Präfixe der URL für den HTTP-Aufruf. Für Twitter ist es der Präfix "http://twitter.com", für identi.ca ist es "http://identi.ca/api". Der mobile Client Twibble erlaubt sogar die Einstellung eines eigenen Präfix, z.B. wenn man eine identi.ca-Implementierung selbst betreibt.

Und hierbei scheitert python-twitter. Eines meiner Anwendungsszenarien ist das selbstbestimmte Spiegeln von Tweets zwischen Twitter und Identi.ca (dort heißen Tweets "Dents", aber das ist eine andere Geschichte).

Der andere Vorteil der Python Twitter Tools ist, dass ich per Programm an alles herankomme, was mir die API bietet. Und nicht auf das beschränkt bin, was mir die Bibliothek genehmigt.

Einen Nachteil haben allerdings beide: Kommunikation ist nur über HTTP möglich, nicht über HTTPS. Aber das kann man ja ändern ;-)

Es geht weiter mit den Python Twitter Tools.