Mittwoch, 23. Mai 2012


Artikel

April 2009 | Artikel

Das Twitter-API und seine Verwendung mit PHP

(Link zum Artikel: http://www.entwickler.de/php//002219)

Der Vogel und der Elephpant

Text: Daniel Schmitzer
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Wissen, was die anderen gerade tun, darum geht es bei Twitter. Die Nutzer schreiben dabei SMS-ähnliche Kurzmitteilungen von maximal 140 Zeichen, die andere Nutzer abonnieren können. Die Nachrichten können über die Weboberfläche von Twitter oder über verschiedene Twitter-Clients eingegeben werden. Sie nutzen das Twitter-API, das auch von PHP genutzt werden kann. Der Artikel soll die Möglichkeiten des APIs und seiner Anwendung mit PHP erläutern.

Teil 1   Teil 2   

Der Twitter Web Service arbeitet mit einer REST- (Representational-State-Transfer-)Architektur. Einfach ausgedrückt heißt das, dass die Anfragen über den URL definiert werden. Eine Anfrage besteht bei REST aus dem Host, der die Anfrage entgegennehmen soll, der Aktion, die durchgeführt werden soll, und möglichen Parametern, die über die GET-Methode angehängt werden. Einige Funktionen benötigen zusätzlich noch eine Übergabe von POST-Parametern. Zusätzlich wird über die Anfrage noch das Rückgabeformat definiert. Hier das allgemeine Aussehen einer REST-Anfrage an den Twitter-Webservice:

  1. http://<server>/<action>.<format><GETParameter>

Um das Twitter-API zu testen, können sie cURL (Client for URLs) verwenden. cURL ist ein Programm, ähnlich zu Wget, um Daten ohne Browser aus dem Internet zu transferieren. Im folgenden Beispiel sehen sie eine Beispielanfrage mit cURL, die die 20 letzten Meldungen eines Users im XML-Format zurückgibt:

  1. curl -u phpmag:phpmag http://twitter.com/statuses/friends_timeline.xml

Der Parameter -u gibt dabei den Nutzernamen und das Passwort des Nutzers an, für den die letzten Meldungen angezeigt werden sollen.

Authentifizierung und Einschränkungen des Web Service

Die Authentifizierung erfolgt über HTTP und ist für alle Aktionen bis auf public_timeline erforderlich. Sie haben oben gesehen, wie die Nutzerdaten bei der Verwendung von cURL angegeben werden. Die Anfragen unterliegen dabei allerdings (auf Seiten von twitter.com) Einschränkungen, so sind nur 100 Anfragen in 60 Minuten möglich. Bei unautorisierten Anfragen werden die Anfragen pro IP gezählt und bei autorisierten pro anfragenden Nutzer.

Rückgabeformate des Web Service

Der Web Service unterstützt die folgenden Rückgabeformate:

  • XML (Extensible Markup Language)
  • JSON (JavaScript Object Notation)

Für die Weiterverarbeitung mit PHP eignet sich in meinen Augen JSON am besten, da es ab der PHP-Version 5.2.0 möglich ist, das JSON-Format ohne zusätzliche Bibliotheken zu verarbeiten. Dazu wird einfach die Rückgabe des Web Service an die json_decode-Funktion übergeben, diese wandelt den JSON-String dann in einen PHP-Datentyp um. Alternativ kann man auch das Rückgabeformat XML nutzen und mit einem XML-Parser wie SimpleXML (ab PHP Version 5, allerdings wegen seines APIs mitunter umstritten) verarbeiten. Für einige Funktionen, für die es sinnvoll ist, bietet das Twitter-API zusätzlich die Rückgabeformate RSS und ATOM. Mit diesen Formaten ist die Verarbeitung mit einem News Reader direkt möglich, für die Verarbeitung in einer PHP-Applikation sind diese Formate allerdings nicht geeignet.

Den Web Service mit PHP verwenden

Eine Möglichkeit, den Webservice mit PHP zu nutzen, wäre jetzt der Aufruf von cURL aus PHP heraus, dies könnte wie in Listing 1 dargestellt aussehen.

Listing 1: Aufruf des Web Services aus PHP heraus über cURL
  1. // URL die Aktion, Authentifizierung und das Rückgabeformat angibt
  2. $strAufruf = "curl -u phpmag:phpmag http://twitter.com/statuses/friends_timeline.json";
  3. // Externer Aufruf des cURL Kommandozeilenprogramms
  4. exec($strAufruf, $arAusgabe);
  5. // Rückgabe mit json_decode in einen PHP Objektarray dekodieren
  6. $oRueckgabe = json_decode(implode($arAusgabe));
  7. // Die erste Meldung ausgeben
  8. echo $oRueckgabe[0]->text;

Diese Lösung ist aber nicht sehr elegant, zudem unterstützt PHP cURL ab der Version 4.0.2 direkt. Der gleiche Aufruf mit der PHP-internen cURL-Funktion würde wie in Listing 2 dargestellt aussehen.

Listing 2: Aufruf des Web Services mit der PHP-internen cURL-Funktion
  1. // Authentifizierungsdaten
  2. $username = 'phpmag';
  3. $password = 'phpmag';
  4. // URL, die die Aktion definiert
  5. $strAufrufURL = 'http://twitter.com/statuses/friends_timeline.json';
  6. // cURL initiieren
  7. $curl = curl_init();
  8. // URL angeben
  9. curl_setopt($curl, CURLOPT_URL, $strAufrufURL);
  10. // Wichtig für Anfragen bei denen der Rückgabewert verarbeitet werden soll
  11. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  12. // Authentifizierung setzen
  13. curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
  14. // Rückgabe holen und dekodieren
  15. $Rueckgabe = json_decode(curl_exec($curl));
  16. // cURL schließen
  17. curl_close($curl);
  18. // Die erste Meldung ausgeben
  19. echo $Rueckgabe[0]->text;

Beide Varianten nutzen die cURL-Bibliothek, die auf dem Server installiert sein muss. Zudem muss PHP mit der Option –with-curl[=DIR] kompiliert sein. DIR zeigt dabei auf das Verzeichnis mit den cURL-Bibliotheken.

Übergabe von Parametern an den Web Service

Einige Aktionen benötigen Parameter, die über GET oder POST an den Web Service geschickt werden. Möchte man zum Beispiel seine Statusmeldung aktualisieren, so erreicht man dies mit der update-Aktion. Diese Aktion benötigt als POST-Variable status für die neue Statusmeldung. Eine solcher cURL-Aufruf mit den internen PHP-Funktionen würde wie in Listing 3 aussehen. Als Rückgabewert gibt die update-Aktion dabei die neue Meldung im angegebenen Format zurück.

Listing 3: Aktualisieren der Statusmeldung über das PHP-interne cURL
  1. // Authentifizierungsdaten
  2. $username = 'phpmag';
  3. $password = 'phpmag';
  4. // URL, die die Aktion definiert
  5. $strAufrufURL = 'http://twitter.com/statuses/update.json';
  6. $curl = curl_init();
  7. curl_setopt($curl, CURLOPT_URL, $strAufrufURL);
  8. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  9. curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
  10. // POST Parameter definieren und angeben
  11. $Statusmeldung = "Neue Meldung, gesetzt mit PHP und cURL ...";
  12. curl_setopt($curl, CURLOPT_POST, 1);
  13. curl_setopt($curl, CURLOPT_POSTFIELDS, "status=".$Statusmeldung);
  14. // Rückgabe analog zu Listing 4 verarbeiten
  15. $Rueckgabe = json_decode(curl_exec($curl));
  16. echo $Rueckgabe->text;
  17. curl_close($curl);

Welche Funktionen das Twitter-API unterstützt und welche Parameter es benötigt, können sie im Twitter-API-Wiki nachlesen.

Teil 1   Teil 2   

Kommentare

Gravatar Tim 06.07.2009
um 21:59 Uhr
Super! Vielen dank. Hat mir SEHR geholfen!!! #zitieren
Gravatar FLHH 07.09.2009
um 16:22 Uhr
Sehr hilfreich vielen Dank! #zitieren
Gravatar Gerhard 18.10.2009
um 13:24 Uhr
Da habe ich auch noch ein super Tutorial dazu gefunden: http://www.ajaxel.de/webwissen/php/26-twitter-api-anzapfen.html #zitieren
Gravatar Jürgen Schulze 15.03.2010
um 16:01 Uhr
Danke für die kleine Einführung.
Aber wahrscheinlich werde ich doch auf eine fertig Twitter-Klasse zurückgreifen.
#zitieren
Gravatar kony1994.co.cc 16.03.2010
um 21:58 Uhr
Danke, hat mir sehr gut geholfen! #zitieren
Gravatar Marco 20.04.2010
um 18:01 Uhr
Hi,
das sind ja alles beispiele iwe ich vom eigenen account daten abrufe, wie mache ich das jedoch wenn ich von einem anderen User die Daten möchte.
Sprich, ich möchte Aktuelle Tweets von einem User X abrufen und anzeigen lassen?
#zitieren
Gravatar Webdesigner 26.04.2010
um 13:52 Uhr
Wie liest man anhand des Usernames einen Twitter-Stream aus, ohne sich mit Passwort anzumelden, ist das überhaupt möglich? #zitieren
Gravatar Bronco 29.04.2010
um 16:15 Uhr
Das ist das Handwerkszeug um den REST Service in PHP anzufragen.
Bei Fragen zur API sollte man diese bemühen!
http://apiwiki.twitter.com/Twitter-API-Documentation

Da findet man auch das folgende:
http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=[User]
Alternativ dann mit .json statt .xml bevor jemand fragt wie man den dann das xml verarbeiten kann.
#zitieren
Gravatar Frank 06.05.2010
um 10:41 Uhr
Danke für diese Doku - hat mir geholfen... #zitieren
Gravatar MyXoToD 10.08.2010
um 09:23 Uhr
Vielen dank, hat mir weitergeholfen. #zitieren
Gravatar Mausi 14.09.2010
um 15:48 Uhr
ps. gibt es inzwischen eine Neufassung hier zu wegen "Basic authentication is not supported" -> http://www.seoratio.de/twitter-api-umstellung/ ? #zitieren
Gravatar Bronco 14.09.2010
um 15:56 Uhr
Da hast Du doch schon die Lösung gepostet? Was brauchst Du denn da noch?
An der OAuth Anmeldung kommst Du nicht vorbei, aber der Link beinhaltet doch ein Tutorial.
#zitieren
Gravatar Mausi 14.09.2010
um 16:02 Uhr
... ja, sorry. Manchmal ist man echt verpeilt :) #zitieren
Gravatar Klaus-Dieter 13.03.2011
um 11:52 Uhr
Die Dokumentation ist sehr gut und verständlich, aber : Einige Hoster unterstützten ( aus Sicherheitsgründen ?? ) kein curl.
Was macht man dann ?
Danke für Tipps.
#zitieren