PHP meets Twitter


php meets twitter

Ich habe mich in letzter Zeit des öfteren mit der Integration von Twitter in PHP beschäftigt. Nun habe ich eine, wie ich finde, gute Lösung gefunden.

Meine Zielsetzung war es, die Twittertimeline des angemeldeten Users, die Möglichkeit Tweets abzusetzen und zu löschen in eine PHP Seite einzubinden.

So schaut nun das Ergebniss aus:


Ergebniss



Zum absetzen eines Tweets nutze ich:

Twitteroauth 

Twitteroauth ist eine Open Source PHP Library, welche OAuth für die Twitter REST-API unterstützt. Zu finden ist das ganze bei

github - https://github.com/abraham/twitteroauth. Die Wahl viel auf Twitteroauth, da es relativ einfach zu implementieren ist und man die Möglichkeit hat, die Library an seine Gegebenheiten anzupassen.


OAuth

OAuth ist ein offenes Protocol zur Authentifizierung von Anwendungen mittels einer bereit gestellten API. Durch diese offene Struktur, kann der Enduser sich bei Anwendungen anmelden, ohne das die Anwendung die Userdaten verwalten muss.

Wenn nun der Twitteruser einer, ausserhalb von Twitter liegenden Anwendung, den Zugriff auf seine Twitterdaten (inkl.den Rechten Tweets abzusetzen) erlauben möchte, muss der Anbieter der Anwendung dazu eine Möglichkeit schaffen. Es gibt ein paar Kriterien die dazu erfüllt sein müssen. Zum einen muss die Anwendung bei Twitter registriert sein. Durch diese Registrierung bekommt die Anwendung einen Consumer_Key und ein Consumer_Secret. Neben diesen beiden Keys, wird noch ein User Access Token von OAuth benötigt.

Der Consumer_Key und das Consumer_Secret wird von der Anwendung übergeben. Der User Access Token wird von OAuth, bei erfolgreicher Anmeldung, der Anwendung übergeben und ist auch nur für den einen spezifischen User zeitbegrenzt gültig.


REST-API

Die Twitter REST API stellt dem Entwickler Methoden um auf die Twitter Core-Daten zu zugreifen. Dazu zählt das Update der Timelines, die Status Daten und die User Informationen.

Die API unterstützt im Moment die folgenden Datenformate:

  • XML
  • JSON
  • und das RSS und Atom Syndication Format.
Dem Entwickler stehen 106, in 20 Kategorien geordnete, Methoden zur Interaktion mit Twitter zur Verfügung.
Die für mich relevanten Methoden sind folgende:
Resource Description
GET account/verify_credentials Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful; returns a 401 status code and an error message if not. Use this method to test if supplied user credentials are valid.
POST statuses/destroy/:id Destroys the status specified by the required ID parameter. The authenticating user must be the author of the specified status. Returns the destroyed status if successful.
(Twitter REST API Resources - URL: https://dev.twitter.com/docs/api Abruf: 08.08.2011 11:40 Uhr->Hier sind bei Bedarf auch die anderen Methoden zu finden)

Einbindung in PHP
Um den Zugriff auf die REST API zu realisieren, nutze ich die PHP Library "Twitteroauth". Dazu lädt man sich zunächst unter https://github.com/abraham/twitteroauth/archives/master die Library runter und entpackt sie im gewünschten Ort innerhalb seiner Webanwendung.
Die Voraussetzungen zur Nutzung von Twitteroauth sind folgende:
  • PHP 5.2.x
  • cURL
  • OpenSSL
  • PHP sessions - enabled
Nachdem die Voraussetzungen erfüllt sind und die Library entpackt ist, öffnet man das File: config.php und trägt dort den Consumer Key, das Consumer Secret und die OAuth Callback URL der Anwendung ein. Mit der OAuth Callback URL ist die URL zur callback.php der Library gemeint.Nun sind alle Voraussetzungen gegeben mit Twitter zu kommunizieren.

Twitteroauth liefert auch eine, mittelmäßige, Dokumentation mit. Diese liefert einen groben Überblick über die Funktionalität (https://github.com/abraham/twitteroauth/blob/master/DOCUMENTATION). Allerdings liefert die Library auch Beispiel Code, welcher meiner Meinung nach sich um einiges besser als Dokumentation eignet.

Für das Auslesen der Twitter-Timeline nutze ich ein Widget von TweetGrid (http://tweetgrid.com/widget/), welche ich so angepasst habe, das es auch die Möglichkeit gibt den angezeigten Tweet zu löschen.

Die generelle Einbindung der Timeline läuft wie folgt ab (innerhalb des Header-Tags):

[code lang="js"]

[/code]


Meine angepasste Version schaut wie folgt aus:

[code lang="js"]
<script type="text/javascript" language="javascript>

/ widget config /

var jtw_search = 'from:<?php print_r(twittername()); ?>'; / keywords or phrase to send to search.twitter.com and display /

var jtw_anmeldename = '<?php print_r(twittername()); ?>';

var jtw_widget_refresh_interval = 0;

<script src=">// <![CDATA[window.alert("'.$user->error.'")// ]]>');
print('');
}

return $user->screen_name;

}
[/code]



Wenn der User nicht angemeldet ist, wird er automatisch auf die Twitter OAuth Anmeldeseite und nach erfolgreicher Anmeldung zurück geleitet. Damit dies funktioniert, habe ich in der widget.js Änderungen vorgenommen:

widget.js

  • Line 456
Zum löschen der einzelnen Tweet habe ich in
  • Line 302
    • eine Zeile hinzugefügt, welche ein Link mit der Bezeichnung "Delete" hinter jeden Tweet schreibt. Dem Link übergebe ich den Counter der for-Schleife.
      • Tweet 1 = id 0
      • Tweet 2 = id 1 usw.
Wenn nun der Delete Link geklickt wurde, bekomme ich die ID des zu löschenden Tweets mittels eines GET Parameters geliefert. Wenn der Parameter gesetzt ist, wird die entsprechende Funktion aufgerufen:

[php]
// Weitergabe des Tweetloeschbefehls

if(isset($_GET["delete_id"]))
{
$delete_id = twitterid();
twitterdelete($delete_id[$_GET["delete_id"]]);
}
[/php]



Wie man nun sieht, werden hierzu 2 Funktionen aufgerufen. Zum einen

      • twitterid()
        • Diese Funktion liefert ein Array zurück, welches die Tweet ID's in der Reihenfolge der Timeline beinhaltet.

[php]
// CURL Initialisierung
$twitter_curl = curl_init();
$twitter_name = twittername();

// URL zum Abruf der Timeline in XML
$timeline_url = 'https://twitter.com/status/user_timeline/'.$twitter_name.'.xml';

// der abzurufende URL; kann auch beim initialisieren der session mittels curl_init() gesetzt werden
curl_setopt($twitter_curl, CURLOPT_URL, $timeline_url);

/

  • Diese Funktion liefert die ID's der ausgelesenen Tweets
  • @return integer $twitter_ids gibt die ID's der Tweets zurueck
  • */

function twitterid()
{
// TRUE oder 1 um den header in die Ausgabe aufzunehmen
curl_setopt($twitter_curl, CURLOPT_HEADER, 0);

// TRUE oder 1 um den tranfer als string zurückzuliefern, anstatt ihn direkt auszugeben. WICHTIG !!
curl_setopt($twitter_curl, CURLOPT_RETURNTRANSFER, true);

// eine cURL-session ausfuehren
$twitter_stream = curl_exec($twitter_curl);

// eine cURL-Session beenden
curl_close($twitter_curl);

// übersetzt einen XML-string in ein objekt
$twitter_xml = simplexml_load_string($twitter_stream);

//$last_id = utf8_decode($twitter_xml->status->id);
$counter = 0;

//global $twitter_ids;

foreach ($twitter_xml->status as $status)
{
    $twitter_ids[$counter] = $status->id;
    $counter++;
}

return $twitter_ids;

}
[/php]

  • twitterdelete($delete_id[$_GET["delete_id"]])
  • <li>Diese Funktion löscht aus der Timeline die übergebene Tweet ID. Dazu muss ich der Funktion die ID des zu löschenden Tweets übergeben. Da wir nun aus der Funktion twitterid() die Tweet ID's in der Reihenfolge der Timeline bekommen haben, können wir die mittels $_GET["delete_id"] übergebene delete_id nutzen (welche ja einfach die Position des Tweets in der Timeline wiederspiegelt) um die dazu gehörige Tweet ID herrauszufinden ($delete_id[$_GET["delete_id"]]). Da wir nun die richtige Tweet ID des zu löschenden Tweets haben, kann die Funktion ihren Dienst tun.</li>

    [php]
    /**

    • Funktion zum loeschen von Tweets
    • @param integer $delete_id Tweetid des Tweets welcher geloescht* werden soll.
    • */

    function twitterdelete($delete_id)
    {
    this.$delete_id = $delete_id;

    require_once('./twitteroauth/twitteroauth/twitteroauth.php');
    require_once('./twitteroauth/config.php');
    
    // Wenn der acces token von Twitter nicht vorhanden ist, gibt es ein redirect
    // auf die connect page von Twitter
    
    if (empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret']))
    {
        header('Location: ./clearsessions.php');
    }
    
    // Holt sich den user access token aus der Session
    $access_token = $_SESSION['access_token'];
    
    // Erstellt ein Twitter Oauth object mittels des user tokens
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
    
    // Uebergibt der Twitter API den Loeschbefehl
    $status = $connection->post('statuses/destroy/'.$delete_id.'');
    
    // Redirect

    print('');
    }
    [/php]


    Da leider Wordpress nicht so wirklich (trotz Code-Tags) vom reinen Anzeigen des Codes begeistert ist, werde ich den Code als Download zur Verfügung stellen.

    Nun haben wir die Funktionen Twitter Timeline auslesen und Tweets löschen beleuchtet. Fehlt uns also noch die Funktion


    Tweets absetzen

    Dazu braucht man natürlich eine Funktion, welche die Eingabemaske liefert
    [php]
    // Maske zum schreiben eines Twitterbeitrages
    function twitter_write()
    {
    ?>

    max. Anzahl Zeichen : 140


    Die Javascript Funktion zaehlen() zählt die eingegebenen Zeichen, da ein Tweet nur 140 Zeichen lang sein darf
    [code lang="js"]
    function zaehlen()
    {
    max = 140;
    anz = document.formular.tweet.value.length+1;

    aktuell = max - anz;
    
    zeichen = "max. Anzahl Zeichen : " + aktuell;
    document.getElementById("anzeige").innerHTML = zeichen ;
    if(anz > max)
    {
        alert("Maximum erreicht !!!");
        document.getElementById("tweet").style.color="#ff0000";
    
        document.getElementById("submitbutton").setAttribute("disabled", 0);
    }
    else
    {
        document.getElementById("submitbutton").removeAttribute("disabled", 0);
    }

    }
    [/code]


    Wenn nun ein Tweet mittels der Eingabemaske abgeschickt wurde, frage ich dies ab und übergebe den Text der Funktion, welche den Tweet an die Twitter API übergibt.

    [php]
    if(isset($_REQUEST["tweet"]))
    {
    include("./twitterwrite.php");
    twitterwrite($_REQUEST["tweet"]);
    }
    [/php]


    twitterwrite($tweet) ist nun der letzte Schritt, welcher für die Kette LESEN, SCHREIBEN, LÖSCHEN notwendig ist.

    [php]
    /* Diese Funktion übertraegt den übergebenen Tweet an

    • die Twitter API.
    • @param String $tweet
    • */
      function twitterwrite($tweet)
      {
      this.$tweet = $tweet;
      // laden der benoetigten Files des Twitterframeworks

      require_once('../twitteroauth/twitteroauth/twitteroauth.php');
      require_once('../twitteroauth/config.php');

      // Wenn der acces token von Twitter nicht vorhanden ist, gibt es ein redirect
      // auf die connect page von Twitter
      if (empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret']))
      {
      header('Location: ../twitteroauth/clearsessions.php');
      }

      // Holt sich den user access token aus der Session
      $access_token = $_SESSION['access_token'];

      // Erstellt ein Twitter Oauth object mittels des user tokens
      $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

      $content = $connection->get('account/verify_credentials');

      // Uebertragen des Tweets an die Twitter API
      $connection->post('statuses/update', array('status' => $tweet));
      print('');
      }
      [/php]


    Unter Files_Twitter_Read_Write_Delete.zip findet ihr die Files, welche den Source enthalten.

    Für Fragen und konstruktive Kritik, bin ich immer zu haben. Am besten in Form eines Kommentars zum Artikel.

    Back…