Meine kleine Datensicherungssoftware für Twitter,
Twacbak muss dringend
aktualisiert werden: die Benutzerauthentifizierung mittels Name und Kennwort
("Basic Authentication") wird zum 30.06.2010 abgeschaltet. Statt dessen soll
das OAuth-Protokoll verwendet werden, bei dem Name und
Kennwort nur durch Twitter selbst verwaltet werden und Benutzer einzelnen
Anwendungen das Recht geben, auf ihre Daten bei Twitter zuzugreifen. An sich
eine gute Idee, da keine Kennworte mehr bei externen Anwendungen gespeichert
werden.
Twacbak nutzt noch das bisherige Verfahren, bei dem über HTTP Basic
Authentication Name und Kennwort mittels
Base64 verschleiert übertragen werden.
Dabei beruhigt höchstens die mögliche Übertragung per SSL. Das Modul zur
direkten Kommunikation habe ich nicht selbst entwickelt. Statt dessen passte
ich die Python Twitter Tools (PTT) an meine
Bedürfnisse an.
Der 30.06.2010 näherte sich, besonders letzte Woche. Der Author der PTT
scheint gerade OAuth zu implementieren, aber ob er bis zum 30.06.2010 fertig
wird, bleibt offen. Und dann bräuchte ich ja noch Zeit, die Änderungen in
Twacbak zu integrieren. Eine einfache Risikoabschätzung zeigt: besser etwas
anderes.
OAuth ist kein triviales Protokoll. Es gibt für die unterschiedlichsten
Szenarien Möglichkeiten der Anbindung. In den meisten Beispielen wird davon
ausgegangen, dass die Anwendung, die auf Twitter zugreifen möchte, selbst eine
für jeden zugänglich Webanwendung ist. Twacbak ist aktuell eine reine
Konsolenanwendung. Und selbst wenn Twacbak einmal eine Webanwendung wird,
würde es bei mir nur im lokalen Netz laufen.
Das ist die Situation: Twacbak muss bis Ende Juni 2010 an OAuth angepasst
werden, OAuth ist ein komplexes Protokoll, mein bisheriges Modul zur
Kommunikation mit Twitter unterstützt kein OAuth.
Mitte November 2009 stolperte ich über
Tweepy. Damals war es nicht besonders
ausgereift, kein Vergleich zu PTT. Zum Glück hatte ich es in meinem
Brain einsortiert und schaute es mir letzte Woche noch
einmal im Detail an. Etwas anders aufgebaut als PTT unterstützt es nun recht
ausgereift OAuth.
Bleibt das Problem, wie man sich in einer Konsolenanwendung bei Twitter über
OAuth authentifiziert. Die Beispiele im Web gaben nicht viel her. Ein wenig
herumexperimentieren, Python’s
REPL half immens, kam
heraus, dass es recht einfach ist:
auth = tweepy.auth.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url()
webbrowser.open(auth_url)
pin = getline('Enter PIN: ').strip()
if pin:
access_token = auth.get_access_token(pin)
# sichere access_token.key und access_token.secret für
# zukünftige Zugriffe, z.B. in einer Datenbank
Die Werte für CONSUMER_KEY und CONSUMER_SECRET erhält man nach der
Registrierung einer Anwendung bei
Twitter.
Mittels get_authorization_url() erhält man von Twitter eine URL, unter der
ein Benutzer die Anwendung authorisieren kann. Nach der Authorisierung erhält
der Benutzer auf der Webseite eine PIN, die er dann in der Konsolenanwendung
angeben muss. Diese dient dazu, dass die Anwendung über Twitter ein sog.
Access Token erhält. Damit authentifiziert sich die Anwendung später
gegenüber Twitter. Das Access Token ist benutzer- und anwendungsspezifisch und
damit wesentlich sicherer als ein Kennwort.
Der spätere Zugriff ist dann wieder einfach:
auth = tweepy.auth.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
# lese key und secret aus Datenbank
auth.set_access_token(key, secret)
api = tweepy.API(auth, parser=tweepy.parsers.JSONParser())
Über das Objekt api können dann die Methoden der Twitter-API authentifiziert
aufgerufen werden. Fertig.
Fertig? Nein. Tweepy hat eine leicht andere Philosophie als PTT. Aber zum
Glück ist Python nicht statisch typisiert. Sonst hätte ein Großteil von
Twacbak angepasst werden müssen (Ja, ich weiß: geringere Kopplung ...). Dank
Duck Typing, eines der besonders
angenehmen Merkmale von Python, und der guten Konfigurierbarkeit Tweepy’s
musste ich nur einige wenige Stellen anpassen. Nach kurzer Zeit war ich dann
wirklich fertig mit der Umstellung.
Twacbak arbeitet nun mindestens so gut wie vorher. Subjektiv scheint es sogar
schneller mit Twitter zu kommunizieren. Aber das kann auch daran liegen, dass
Twitter die Kommunikation mittels OAuth bevorzugt abwickeln könnte.
Jetzt kann ich wieder in Ruhe darüber nachdenken, wie sich Twacbak weiter
entwickeln soll. Vermutlich in Richtung Webanwendung ;-)
Schlagworte: Twacbak, Tweepy, Twitter, Wartung, python.