Der Vogel und der Elephpant

Das Twitter-API und seine Verwendung mit PHP
Kommentare

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.

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:

http:///.

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:

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.

// URL die Aktion, Authentifizierung und das Rückgabeformat angibt
$strAufruf = "curl -u phpmag:phpmag http: //twitter.com/statuses/friends_timeline.json";

// Externer Aufruf des cURL Kommandozeilenprogramms
exec($strAufruf, $arAusgabe);

// Rückgabe mit json_decode in einen PHP Objektarray dekodieren
$oRueckgabe = json_decode(implode($arAusgabe));

// Die erste Meldung ausgeben
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.

// Authentifizierungsdaten
$username = 'phpmag';
$password = 'phpmag';

// URL, die die Aktion definiert
$strAufrufURL = 'http: //twitter.com/statuses/friends_timeline.json';

// cURL initiieren
$curl = curl_init();

// URL angeben
curl_setopt($curl, CURLOPT_URL, $strAufrufURL);

// Wichtig für Anfragen bei denen der Rückgabewert verarbeitet werden soll
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// Authentifizierung setzen
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");

// Rückgabe holen und dekodieren
$Rueckgabe = json_decode(curl_exec($curl));

// cURL schließen
curl_close($curl);

// Die erste Meldung ausgeben
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.

[ header = Seite 2: Übergabe von Parametern an den Web Service ]

Ü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 derupdate-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.

// Authentifizierungsdaten
$username = 'phpmag';
$password = 'phpmag';

// URL, die die Aktion definiert
$strAufrufURL = 'http: //twitter.com/statuses/update.json';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $strAufrufURL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");

// POST Parameter definieren und angeben
$Statusmeldung = "Neue Meldung, gesetzt mit PHP und cURL ...";
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "status=".$Statusmeldung);

// Rückgabe analog zu Listing 4 verarbeiten
$Rueckgabe = json_decode(curl_exec($curl));
echo $Rueckgabe->text;

curl_close($curl);

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

Nutzen von externen Klassen

Möchte man nun mit Twitter arbeiten, so ist es nicht zwingend notwendig, die einzelnen API-Anfragen selbst zu schreiben. Es gibt auch schon diverse Klassen, die diese Funktionalität anbieten. David Billingham stellt in seinem Blog unter blog.slawcup.com eine einfache Klasse vor, die die meisten API-Funktionen unterstützt. Die Klasse verwendet auch die cURL-Bibliotheken, gibt aber die Rückgaben als XML zurück. Wird von der PHP-Installation SimpleXML unterstützt, so wird das Ergebnis zusätzlich als SimpleXMLElement-Objekt zurückgegeben. Listing 4 zeigt die Verwendung der Klasse, um Meldungen zu lesen und zu schreiben.

require_once ("twitter.class.phps");

$Twitter = new twitter();
$Twitter->username = "phpmag";
$Twitter->password = "phpmag";

// Status setzen
$Twitter->update("Twitter Meldung mit der Twitter Klasse von David Billingham");

// Letzte Meldung ausgeben
$xml = $Twitter->friendsTimeline();
echo $xml->status[0]->text;

Im PEAR (PHP Extension and Application Repository) gibt es auch ein Paket, das die Verwendung des Twitter-APIs ermöglicht. Das Paket Services_Twitter wurde von Joe Stump und David Jean Lois entwickelt und befindet sich noch im Beta-Status. Das Paket ist noch nicht in PEAR dokumentiert, aber auf den externen Projektseiten auf Google Code finden sich ein paar Beispiele. Die Anwendung ist dabei ähnlich der bereits beschriebenen Klasse, weswegen ich hier nicht näher darauf eingehen will.

Die Twitter-API-Funktionen (Auszug) Hier sehen sie eine Übersicht über die wichtigsten Twitter-API-Funktionen. Methoden, die als Rückgabewert RSS und Atom für News Reader unterstützen, habe ich mit RSS gekennzeichnet. Statusmethoden

  • public_timeline: Zeigt die neuesten Statusmeldungen von öffentlichen Usern an
  • friends_timeline: Zeigt die Meldungen des Users und deren Freunden an
  • user_timeline: Zeigt die letzten Meldungen eines Users an
  • show: Zeigt eine einzelne Meldung durch Angabe der Status-ID an
  • update: Aktualisiert die Meldung eines Users
  • replies: Gibt die letzten Antwortmeldungen eines Users zurück
  • destroy: Löscht eine eigene Meldung

Benutzermethoden

  • friends: Gibt die Freunde des Benutzers zurück
  • followers: Gibt die Nutzer zurück, die der Nutzer beobachtet
  • show: Gibt detaillierte Informationen über einen Nutzer zurück

Funktionen für die direkten Nachrichten

  • direct_messages: Gibt die letzten 20 Direktnachrichten zurück, die dem Nutzer geschickt wurden
  • sent: Gibt die letzten 20 Direktnachrichten zurück, die der Nutzer gesendet hat
  • new: Sendet eine Direktnachricht an einen User
  • destroy: Löscht eine Direktnachricht

Methoden für die Freundschaftsbeziehungen

  • create: Markiert zwei Nutzer als Freunde
  • destroy: Beendet eine Freundschaft zwischen zwei Nutzern
  • exists: Prüft, ob zwischen zwei Benutzern eine Freundschaft besteht

[ header = Seite 3: Twittern mit Zend ]

Twittern mit Zend

Wer eine Anwendung mit dem Zend Framework entwickelt, kann auch auf Zend-Funktionen zurückgreifen, um mit Twitter zu kommunizieren. Im Zend Framework gibt es dabei die Klassen ausZend_Rest, allerdings unterstützt diese Klasse noch keine Authentifizierung. Da die REST-Architektur aber auf HTTP-Anfragen beruht, kann man auch die Klassen aus Zend_Http_Client verwenden. Listing 5 zeigt, wie man mit der Klasse Zend_Http_Client eine Anfrage an das Twitter-API stellt.

// Zend Klassen laden
require_once('Zend/Http/Client.php');

// Aktion und Rückgabeformat
$strAufrufURL = 'http: //twitter.com/statuses/friends_timeline.json';

// Clienten initieren
$http_client = new Zend_Http_Client($strAufrufURL);

// Username und Passwort setzen
$http_client->setAuth("phpmag", "phpmag");

// Anfrage absenden und Rückgabe verarbeiten
$http_response = $http_client->request();
$oRueckgabe = json_decode($http_response->getBody());

// Ausgabe der ersten Meldung
echo $oRueckgabe[0]->text;

Der Vorteil der Zend-Klassen liegt darin, dass man die Parameter einfach über Methodenaufrufe definieren kann. Dafür gibt es die Methoden setParameterPost und setParameterGet der KlasseZend_Http_Client. Listing 6 zeigt die Verwendung der setParameterPost-Methode, um die Mitteilung eines Benutzers zu setzen. Wichtig ist bei Anfragen, die Parameter über POST benötigen, dass man die Anfragemethode bei dem request-Aufruf mit angibt.

// Zend Klassen laden
require_once('Zend/Http/Client.php');

// Aktion und Rückgabeformat
$http_client = new Zend_Http_Client('http: //twitter.com/statuses/update.json');

// Username und Passwort setzen
$http_client->setAuth("phpmag", "phpmag");

// POST Parameter angeben
$http_client->setParameterPost("status", "Twitter Status neu gesetzt mit der Zend_Http_Client Klasse  des Zend Frameworks");

// Anfrage abschicken
$http_response = $http_client->request("POST");

Im Zend Framework sind bereits spezielle Klassen für viele andere Web-2.0-Anwendungen wie Delicious oder Amazon integriert. Für das Twitter-API gibt es auch bereits eine Implementierung, die es aber noch nicht ins Framework geschafft hat. Wer die Klasse schon verwenden möchte, findet am Ende des Artikels den Link zu den Quellen im Zend-Framework-Wiki.

Fazit

In diesem Artikel haben Sie die grundlegende Funktionsweise des Twitter-APIs kennengelernt. Als ich angefangen habe, diesen Artikel zu schreiben, habe ich mich gefragt, welchen Sinn es eigentlich macht, von einer PHP-Applikation auf die Twitter-Funktionen zuzugreifen. Beim Schreiben des Artikels sind mir allerdings zahlreiche Anwendungsfälle in den Kopf gekommen, für die sich Twitter eignen würde. Es ist doch schick, wenn man zum Beispiel in einem Onlineshop die täglichen Statistiken als Tweet lesen kann, oder auch über Tweets benachrichtigt wird, wenn Programmfehler auftreten. In einigen Ländern wie den USA, Kanada und Indien ist der automatische SMS-Versand von Tweets noch möglich, so können sich die User in diesen Ländern über SMS informieren lassen, was ihre PHP-Anwendung gerade tut.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -