Die Twitter API – einfach Tweets auslesen und weiterverarbeiten

Tweets und Follower von @seafollych

Tweets und Follower von @seafollych

Unser Kunstprojekt seafolly.ch hat einen Twitter User und ich wollte die Tweeterei irgendwie teilautomatisieren. Dazu probierte ich IFTTT aus (Ein Automat für #kunstprojekt) und das Ergebnis war schon beeindruckend. Der Haken an Services wie IFTTT ist, dass „nur“ vordefinierte Funktionen zur Verfügung stehen. Und wenn mir die nicht ausreichen oder ich einen anderen Anwendungsfall habe, dann geht es eben nicht.

Aber wie könnte man das anders machen?

Twitter API

Twitter bietet eine Schnittstelle (API) an, auf die man mit unterschiedlichen Programmiersprachen zugreifen kann. Man kann Daten abfragen, auf dem eigenen Server verarbeiten und dann damit „machen, was ich will“.
Die Anzahl der Zugriffe auf die Twitter API ist beschränkt, reicht jedoch für unsere Anforderungen aus.

We divide the rate limit window into 15 minute chunks per endpoint, with most individual calls allowing for 15 requests in each window. In most cases, you can query the API on a per endpoint basis more than the v1 API, and other widely used calls have been increased to 180 requests per window.
Twitter API Dokumentation

Das Prinzip dahinter: Kleinere Zugriffsmengen sind kostenlos, grössere nicht.

Damit das kontrolliert werden kann, muss man sich mit seinem Twitter User entsprechend registrieren.

Früher war das alles mal einfacher, da konnte jeder öffentlich Anfragen an Twitter stellen und erhielt Daten zurück (wie sich twitter mit der twitter-api 1.1 einigelt).
Als freie Alternative zu Twitter gibt es beispielsweise pump.io (pump.io – die Basis für dezentrale soziale Netzwerke?).

Die Twitter-API liefert Ergebnisse in XML und JSON Format, ist also grundsätzlich von jeder Programmiersprache aus nutzbar. Meistens werden die Sprachen PHP, Python oder Ruby benutzt.

Ziel

Für den Anfang möchte ich die Tweets von @seafollych auf einer Website einbinden.
Als nächsten Schritt würde ich gern Tweets mit dem Hashtag #kunstprojekt retweeten.

Twitter Account einrichten und App registrieren

Einen Twitter Account habe ich bereits (@seafollych).
Auf der Website https://apps.twitter.com/ muss ich für mein Vorhaben eine Application anlegen. Name und Description (Beschreibung) sind frei wählbar, das Website Feld enthält die URL zum Ihrem Angebot. Ich arbeite auf unserem Testserver.

Twitter App erstellen
Twitter App erstellen
Die Callback URL kann in unserem Fall leer bleiben.
Sie müssen das „Developer Agreement“ bestätigen (und auch lesen) und können dann die Twitter Application erstellen.

Im nächsten Schritt müssen Sie sich Access Tokens erzeugen.

Twitter App Keys and Access Tokens
Twitter App Keys and Access Tokens
Die Keys (Schlüssel) und das Access Token (Zugriffscode) benötigen Sie für Ihre spätere Abfrage um sich gegenüber Twitter zu identifizieren.

Twitter API mit PHP abfragen

Ich nutze als Programmiersprache PHP und eine leere PHP Datei.

PHP-Datei erstellen

Legen Sie in einem Unterverzeichnis Ihrer Wahl eine Datei twitter.php mit folgendem Inhalt an.

<?php
echo "<h2>seafolly.ch Tweets</h2>";
?>

Wenn Sie die Datei in Ihrem Browser aufrufen (z.B. https://serverblogger.ch/seafolly/twitter.php) und den Text sehen, kann es weitergehen.

Twitter API für PHP

Sie benötigen eine passende PHP Bibliothek. Die wohl bekannteste ist die von J7mbo (https://github.com/J7mbo/twitter-api-php/).
Laden Sie sie herunter, packen Sie sie aus und kopieren Sie die Datei TwitterAPIExchange.php in das Verzeichnis, in dem auch Ihre twitter.php Datei liegt.

Das Programm

In Ihrer twitter.php Datei müssen Sie nun folgende Schritte in PHP codiert ausführen.

  1. Twitter API Bibliothek einbinden
  2. Twitter Access Token und Key angeben
  3. Art der Anfrage festlegen
  4. HTTP Methode festlegen
  5. Abfrage starten und die Rückgabe in einem Array speichern
  6. Array durchlaufen und die Tweets ausgeben

Hört sich doch gar nicht so kompliziert an.
In PHP-Code sieht das so aus:

1. Twitter API Bibliothek einbinden

Wenn die Datei im gleichen Verzeichnis liegt, läd die require_once() Funktion die gewünschte Datei.

require_once('TwitterAPIExchange.php');

Twitter Access Token und Key angeben

Die Variable $settings ist ein Array und es werden die vier Werte darin gespeichert

$settings = array(
  'oauth_access_token' => "IHR_WERT",
  'oauth_access_token_secret' => "IHR_WERT"
  'consumer_key' => "IHR_WERT",
  'consumer_secret' => "IHR_WERT"
);

Art der Anfrage festlegen

Man kann unterschiedliche Arten von Anfragen festlegen. In unserem Fall wollen wir die eigene Timeline auslesen. Dazu muss die entsprechende URL in einer Variable gespeichert werden. Zusätzlich speichere ich noch den gewünschten Usernamen in einer Variable um ihn später einfacher nutzen zu können.

$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$username= "seafollych";

HTTP Methode festlegen

Das HTTP Protokoll bietet unterschiedliche Methoden an, GET zum Lesen von Daten und POST zum posten von Daten.
Wir wollen lesen, also GET!

$requestMethod = "GET";

Abfrage starten und die Rückgabe in einem Array speichern

Die Variable $getfield enthält die Daten, die wir an die URL anhängen wollen, damit sie hinterher so aussieht:

https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=seaf…

Der angehängte Teil wird mit folgendem Befehl erzeugt:

$getfield = '?screen_name='.$username.'&count=5';

Für die Abfrage muss ein Objekt erstellt werden.
Wir übergeben dazu den Inhalt der Variable $settings an die TwitterAPIExchange Klasse und speichern das Ergebnis in der Variable $twitter.

$twitter = new TwitterAPIExchange($settings);

Um ein Ergebnis zu erhalten, müssen wir den Text für den URL Anhang, die URL und die Abfragemethode übergeben und dann die Abfrage starten.

$twitter->setGetfield($getfield)
        ->buildOauth($url, $requestMethod)
        ->performRequest()

Das Ergebnis ist ein JSON codierter Textstring, der für das menschliche Auge und PHP ein wenig unhandlich ist ;).
Daher bereiten wir ihn mit der Funktion json_decode() auf und speichern das Ergebnis in der Variablen $string.

$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

Ab hier könnte man sich das Ergebnis schon mal ausgeben lassen, der ganze Code sieht so aus:

<?php
require_once('TwitterAPIExchange.php');

$settings = array(
  'oauth_access_token' => "...",
  'oauth_access_token_secret' => "...",
  'consumer_key' => "...",
  'consumer_secret' => "..."
);

$username= "seafollych";
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name='.$username.'&count=5';
$twitter = new TwitterAPIExchange($settings);
$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

// Test ob ein Fehler vorliegt
if($string["errors"][0]["message"] != "") {
  echo "<h3>Problem</h3>
        <p>Twitter gibt die folgenden Fehlermeldung zurücke</p>
        <p><em>".$string[errors][0]["message"]."</em></p>";
  exit();
}

// Ausgabe
echo "<pre>";
print_r($string);
echo "</pre>";
?>

twitter.php

Die Ausgabe sieht etwa so aus:

Ergebnis der Abfrage
Ergebnis der Abfrage
Offensichtlich haben wir Daten erhalten und müssen diese nun noch formatieren.
Normalerweise macht man das in einer for each Schleife.
Im Antwort-Array hat jeder Tweet eine Nummer. Die Schleife geht Nummer für Nummer durch und speichert alle Daten zu einem Tweet in der Variable $items. Die einzelnen Werte werden dann aus der Variable $items extrahiert. Das Datum habe ich mit einer PHP Funktion umfomatiert date(‚H:i, d.m.Y‘, strtotime($items[‚created_at‘])); und den Text mit der PHP Funktion utf8_decode() bearbeitet, um eine richtige Darstellung der deutschen Umlaute zu erhalten. Der Rest sind HTML Tags. Sie können die Ausgabe beliebig komplex gestalten, meine Variante ist die Minimalversion.

echo "<ul>";
foreach($string as $items){
  echo '<li>';
  echo '<a href="https://twitter.com/';
  echo $items['user']['name'];
  echo '/status/';
  echo $items['id'];
  echo '"><small>';
  $fdate = date('H:i, d.m.Y', strtotime($items['created_at']));
  echo $fdate;
  echo '</small></a>: ';
  echo utf8_decode($items['text']);
  echo '</li>';
}
echo "</ul>";

Wenn Sie das Skript laufen lassen, erhalten Sie die folgende Ausgabe:

per PHP abgefragte Tweets
per PHP abgefragte Tweets
Hier nochmal der gesamte Quellcode:

<?php
require_once('TwitterAPIExchange.php');

$settings = array(
  'oauth_access_token' => "...",
  'oauth_access_token_secret' => "...",
  'consumer_key' => "...",
  'consumer_secret' => "..."
);

$username= "seafollych";
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name='.$username.'&count=5';
$twitter = new TwitterAPIExchange($settings);
$string = json_decode($twitter->setGetfield($getfield)
                 ->buildOauth($url, $requestMethod)
                 ->performRequest(),$assoc = TRUE);

// Test ob ein Fehler vorliegt
if($string["errors"][0]["message"] != "") {
  echo "<h3>Problem</h3>
        <p>Twitter gibt die folgenden Fehlermeldung zurücke</p>
        <p><em>".$string[errors][0]["message"]."</em></p>";
  exit();
}

// Ausgabe
foreach($string as $items)
    {
        echo '<li>';
        echo '<a href="https://twitter.com/';
        echo $items['user']['name'];
        echo '/status/';
        echo $items['id'];
        echo '"><small>';
        $fdate = date('H:i, d.m.Y', strtotime($items['created_at']));
        echo $fdate;
        echo '</small></a>: ';
        echo utf8_decode($items['text']);
        echo '</li>';
    }
echo "</ul>";

?>

twitter.php

Wenn Sie bis hier gekommen sind, dann zunächst mal herzlichen Glückwunsch. Das war gar nicht schwer und der Erfolg ist doch ermutigend.

Im nächsten Schritt wollte ich die Twitter nach Tweets mit dem Hashtag #kunstprojekt suchen. Wenn ich einen entsprechenden Tweet finde, will ich ihn posten oder retweeten. Das ist grundsätzlich möglich, sprengt aber doch den Rahmen des Artikels hier.
Daher möchte ich an dieser Stelle erstmal aufhören und Ihnen noch ein paar Links zum weiterstöbern mit auf den Weg geben.

Links:


tl;dr: Tweets per API auslesen und verarbeiten ist nicht schwer

Autor: Hagen Graf

consultant, author, trainer, solution finder, web architect, developer, open source lover, visionary, orator, the good old webmaster. Able to simplify!

3 Gedanken zu „Die Twitter API – einfach Tweets auslesen und weiterverarbeiten“

  1. hallo hagen, vielen dank für den tollen beitrag!
    wenn ich einen hashtag auslesen möchte, sehe ich diesen erstmal im array:.

    Array
    (
    [statuses] => Array
    (
    [0] => Array
    (
    [created_at] => Thu Aug 17 17:27:02 +0000 2017
    [id] => 898234728679079936
    [id_str] => 898234728679079936
    [text] => #wiederpunk blablablablablablablablabl
    [truncated] =>
    [entities] => Array
    (
    [hashtags] => Array
    (
    [0] => Array
    (
    [text] => wiederpunk
    [indices] => Array
    (
    [0] => 0
    [1] => 20
    )

    )

    )

    [symbols] => Array
    (
    )

    [user_mentions] => Array
    (
    )

    [urls] => Array
    (
    )

    )

    [metadata] => Array
    (
    [iso_language_code] => de
    [result_type] => recent

    aber wenn ich deinen letzten teil einbinde………

    // Ausgabe
    foreach($string as $items)
    {
    echo “;
    echo ‚‚;
    $fdate = date(‚H:i, d.m.Y‘, strtotime($items[‚created_at‘]));
    echo $fdate;
    echo ‚
    : ‚;
    echo utf8_decode($items[‚text‘]);
    echo “;
    }
    echo „“;

    …bleibt das echo einfach leer. wie kann ich das ergebnis des hashtag-array´s ebenso auslesen wie bei einem benutzerprofiel?
    ich brauche lediglich den inhalt des tweets, datum, uhrzeit, name.

    über eine antwort würde ich mich riesig freuen!

Kommentar verfassen