Tutorial: Twitter API mit PHP-Bordmitteln

Um mit einem PHP Script auf  die Twitter API via OAuth zuzugreifen und einfache Aktionen durchzuführen, z. B. ein Tweet oder eine direct message zu versenden ist kein aufwendiges Framework oder SDK erforderlich, insbesondere, wenn man nur eine „Single User“ Lösung basteln möchte. Das Ganze geht auch mit PHP Bordmitteln – wie genau erklärt das folgende Tutorial.

Mit „Single User“ sind hier kleine individualisierte Tools oder Scripte gemeint, die nur von einem User genutzt werden. Dadurch kann bei der Programmierung auf die etwas aufwendigere OAuth-Benutzerauthentifizierung und Generieung der Token verzichten kann. Stattdessen ist es hier einfacher, die Zugangsdaten (Tokens und Keys) manuell zu generieren Als erstes müssen Sie Ihr „Application“ bei Twitter registrieren:

  1. Surfen Sie auf http://dev.twitter.com
  2. Loggen Sie sich mit dem Twitter-Account ein, mit dem auch das Script ausgeführt werden soll.
  3. Füllen Sie das Registrierungs-Formular aus. Application-Type: Browser, Callback-URL: leer lassen, Read&Write auswählen.
  4. Jetzt sehen Sie den Consumer Key und das Consumer Secret der Applikation.
  5. Klicken Sie auf „My Access Token“. Dadurch genrieren Sie das Access Token sowie das Access Token Secret für den aktuell eingeloggten User.

Das PHP Script sieht folgendermaßen aus (mit Absicht wurde hier auf OOP verzichtet, um PHP Einsteigern das Verständnis zu erleichtern):

#!/usr/local/bin/php5

<?php

// Tutorial: Twitter via OAuth mit PHP Bordmitteln
//   

echo "OAuth Tutorial";
echo "nn";

// OAuth Tokens
$accesstoken = "???";
$accesssecret = "???";

// OAuth Keys
$consumerkey ="???";
$consumerkeysecret="???";

// Beispiel: direct message an Simon_A_Frank
$APIurl = "https://api.twitter.com/1/direct_messages/new.xml";

// Parameter, bei direct messag user und text
$params="user=Simon_A_Frank&text=";
// doppelt codieren, sonst gehen Umlaute, Sonder- und Leerzeichen nicht
$params.=rawurlencode(utf8_encode("Hallöchen Simon wie geht's?"));
$reqmethod = "POST";

// Request bauen ...
$srequest="oauth_consumer_key=".$consumerkey;
$srequest.="&oauth_nonce=".rand(10000001,99999999);            
$srequest.="&oauth_signature_method=HMAC-SHA1";
$srequest.="&oauth_timestamp=" . time();        
$srequest.="&oauth_token=" . $accesstoken;
$srequest.="&oauth_version=1.0";
if ($params!="") {
    $srequest.="&".$params;
}    

// Alle Parameter müssen sortiert sein
$sr=explode("&",$srequest);
sort($sr);    
$srequestSorted=implode("&",$sr);    

// Basestring und Key:
$key=$consumerkeysecret."&".$accesssecret;      
$basestring=strtoupper($reqmethod)."&".rawurlencode($APIurl).
    "&".rawurlencode($srequestSorted);

// Signatur erzeugen
$sig=rawurlencode(base64_encode(hash_hmac('sha1', $basestring, $key, true)));    

// Signatur einfügen - für den Request muss diese
// scheinbar nicht sortiert sein    
$srequest.="&oauth_signature=$sig";

// Der Request ist fertig und sieht so aus:
echo "nRequest: $srequestnn";

// mit file_get_contents versenden
$opts = array('http' =>
    array(
      'method'  => $reqmethod,
      'header'  => 'Content-type: application/x-www-form-urlencoded',
      'content' => $srequest
    )
);
// Das Ergebnis ausgeben
$result = file_get_contents($APIurl, false, 
  stream_context_create($opts));
echo "nResult:n" . $result;
echo "n... das war's!n";

?>

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, PHP, Programmierung, Social Networks, Twitter abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

20 Kommentare zu Tutorial: Twitter API mit PHP-Bordmitteln

  1. Hallo Simon!
    Danke für dieses super Tutorial. Dein Skript habe ich vor einer Weile schon erfolgreich zum Laufen bekommen, leider versagt es mir seit neuestem den Dienst, obwohl ich nichts daran geändert habe. Es wird folgender Fehler ausgeworfen:

    Warning: file_get_contents(https://api.twitter.com/1/direct_messages/new.xml): failed to open stream: HTTP request failed! HTTP/1.0 410 Gone
    in /Users/mattef/Desktop/new.php on line 69

    Danach habe ich versucht, wie oben von dir erklärt, die APIurl auszutauschen:

    $APIurl = „https://api.twitter.com/1.1/direct_messages/new.json“;

    Doch auch da kommt folgender Fehler:

    Warning: file_get_contents(https://api.twitter.com/1.1/direct_messages/new.json): failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized
    in /Users/mattef/Desktop/new.php on line 69

    Auch ein Erneuern der AccesTokens usw. brachte keinen Erfolg.

    Funktioniert bei dir zur Zeit dein Skript? Vielleicht liegt es ja an Twitter?
    Ich komme jedenfalls gerade nicht weiter und würde mich über Hilfe freuen 🙂

    Beste Grüße
    Matthais

    • Tja, wie es so oft ist: Das Problem hat sich irgendwie von alleine gelöst. Jetzt funktioniert das Skript wieder. Danke trotzdem!
      Beste Grüße
      Matthias

    • Simon A. Frank sagt:

      Hallo Matthias, Danke für das Feedback 🙂 Probleme, die sich von selbst lösen, sind die besten, oder? Wahrscheinlich einfach ein temporäres Problem mit den Twitter-Servern!

  2. MasterJedi sagt:

    Gibt es auch eine Möglichkeit direkt Bilder mit zu übergeben? Ich möchte ein Bild an den Tweet hängen was bei mir auf dem Rechner liegt.

    • Simon A. Frank sagt:

      Hallo Master Jedie, entschuldige die späte Antwort, ich hatte das überlesen. An Tweets kann man nicht direkt Bilder anhängen. Wenn Du einen Tweet mit einem Link zu einem Bild postest, dann wird der bei vielen Twitter-Clients und auf der Twitter-Website so angezeigt, wie wenn da ein Bild angeängt würde – dabei wird es einfach beim Anzeigen des Tweets von der Quelle geladen. Ich hoffe, das hilft Dir weiter?

  3. Simon A. Frank sagt:

    Hallo Guido,

    gerne – eigentlich ist nur eine Sache zu Ändern: XML ist als Response nicht mehr möglich sondern nur noch JSON, deshalb heißt es bei 1.1:

    $APIurl = „https://api.twitter.com/1.1/direct_messages/new.json“;

    Ansonsten sind – soweit ich das sehe – keine Änderungen notwendig!

    Schöne Grüße,

    Simon

  4. Hallo Simon,

    Kannst Du das nochmal für das API 1.1 umschreiben oder ergänzen? Danke schon mal für Deine Mühe, bin schon weit gekommen!

  5. Simon A. Frank sagt:

    Hallo Richard, vielen Dank für die Hinweise, sehr gute Ergänzungen 🙂 Ich werde in Kürze sowieso mal ein Update posten, Dank OAuth 2 ist es inzwischen eigentlich noch einfacher geworden!

  6. Richard sagt:

    Danke für das Tutorial. ich habe das Script an zwei Stellen verändern müssen, damit es für mich läuft.

    1: Twitter reagiert äußerst gereizt (403 Forbidden) wenn man mehrmals hintereinander den selben Text über die API verschicken will. Daher:
    … $params=“user=Simon_A_Frank&text=“;
    // den String eindeutig machen. Hier mit Datum und Uhrzeit
    $params.=date(„Ymd-His-„);
    … $params.=rawurlencode(utf8_encode(„Hallöchen Simon wie geht’s?“));

    2: Firefox zeigt $result ohne Punkt und Komma an. Daher:
    echo „Result:“;
    echo “, htmlentities($result), “;
    echo „… das war’s!“;

  7. Simon A. Frank sagt:

    kein Problem, gerne!

  8. xiz sagt:

    Ich hab es hingekriegt! Wahnsinn.. Dummer fehler von mir im Code! Danke nochmals für deine Antworten..

  9. Simon A. Frank sagt:

    Hallo xiz, nein, da fehlt nichts mehr, dann liegt es doch an Twitter. Prüfe nochmals, ob Du die Berechtigung „Read&Write“ gewählt hast und generiere die Tokens und Keys neu (das geht ebenfalls unter dev.twitter.com, vgl. oben). Dann müsste es funktionieren!

  10. xiz sagt:

    Hi Simon, danke für deine Antwort. Ich habe den Code ausführen lassen und es hat funktioniert! Ich habe ebenso in der php.ini datei reingeschaut und die ist auf „on“ gesetzt. Merkwürdig das der Code nicht funktioniert.. Oder habe ich was vergessen was auszufüllen? Ich habe nur diese Felder eingetragen:

    // OAuth Tokens
    $accesstoken = „???“;
    $accesssecret = „???“;

    // OAuth Keys
    $consumerkey =“???“;
    $consumerkeysecret=“???“;

    mehr habe ich nicht eingetragen. Oder fehlt irgendetwas?

  11. Simon A. Frank sagt:

    Hallo xiz, das könnte ein allgemeines Problem mit file_get_contents() bei Deiner Installation sein, z. B. durch ein Firewall. Probiere mal zuerst in einer anderen Datei aus, ob dies funktioniert:

    < ?php $homepage = file_get_contents('http://www.frank-it-beratung.de/'); echo $homepage; ?>

    Falls nein ist es die PHP-Installation (vgl. mein Kommentar vom 24.5.) oder ein Netzwerkproblem (Personal Firewall oder an einer Netzwerkkomponente). Ich hoffe, das hilft weiter?

  12. xiz sagt:

    Hi Simon, wenn ich das Skript laufen lasse und die entsprechenden Felder fülle, erscheint diese meldung bei mir! (Ich teste es mit Apache bzw. lokal auf dem rechner)

    OAuth TutorialnnnRequest:
    Warning: file_get_contents(https://api.twitter.com/direct_messages/new.xml) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /Applications/XAMPP/xamppfiles/htdocs/test/twitter_login.php on line 65
    nResult:nn… das war’s!n

  13. Simon A. Frank sagt:

    Hallo Ronny, nein, meine Scripts die auf diesem Code basieren laufen bestens. Hast Du „Read&Write“ ausgewählt? Manchmal hilft auch, die Tokens und Secrets neu zu generieren. Hast Du auch getestet, ob file_get_contents bei Deiner PHP-Installation richtig konfiguriert ist? Dafür einfach in der php.ini folgende Zeile einfügen bzw. von false auf true setzen:

    allow_url_fopen = true

  14. Ronny sagt:

    hat twitter an der Api irgendwas umgestellt , weil 1 zu 1 übernommen und kommt Meldung

    OAuth TutorialnnnRequest:nResult:nn… das war’s!n , aber leider passiert nichts

  15. Adrian sagt:

    Vielen Dank! toll genau das was ich gesucht habe. Hätte ich auch selber schreiben können, aber so spar ich mir n Haufen Zeit. DANKE!

  16. Versehentlich hatte ich diesen Artikel die letzten Wochen auf „unsichtbar“ gestellt, jetzt ist er wieder online!

Kommentar verfassen