Zugriff auf Timeline per Twitter API 1.1 (oauth) mit PHP

Im März 2013 wird Twitter ernst machen und die Unterstützung für Feeds in den Formaten RSS, XML und Atom einstellen. Es bleibt dann nur noch json übrig. Mehr Informationen dazu gibt es z.B. bei t3n .

Wer eine Timeline auf einer Homepage eingebunden hat, steht spätestens dann vor einem Problem: Die neue offizielle Twitterapp zeigt Kommentare direkt auf der Homepage an. Ich persönlich kann mir nicht vorstellen, dass viele Unternehmen derart offen kommunizieren wollen :-(. Häufig soll die Timeline einfach nur ohne jede weitere Funktion angezeigt werden.

Im folgenden beschreibe ich, wie man dies erreichen kann. Das ganze ist als Beispiel gedacht und soll nur eine Idee liefern, wie es umzusetzen wäre. Ob das mit den Richtlinien von Twitter so vereinbar ist, kann ich nicht beantworten.

Der Zugriff erfolgt mit Hilfe von twitteroauth.

Je nach verwendeter Version von twitteroauth muss in der Datei twitteroauth.php die Zeile:

public $host = "https://api.twitter.com/1/";

auf

public $host = "https://api.twitter.com/1.1/";

aktualisiert werden, um das neue API zu benutzen.

Benötigt werden nur die beiden Dateien OAuth.php und twitteroauth.php welche in dem Unterordner twitteroauth zum unten stehenden Quellcode liegen müssen. Diesen können Sie z.B. als index.php abspeichern.

Im Quellcode müssen die Variablen am Anfang angepasst werden. Die Bezeichnungen sind selbsterklärend. Die benötigten Schlüssel für CONSUMER_KEY, COMSUMER_SECRET, OAUTH_TOKEN und OAUTH_TOKEN_SECRET können über die Seite https://dev.twitter.com/ unter „Create an app“ angelegt werden. Da wir die Schlüssel direkt verwenden, muss dort bei der Callback-URL nichts sinnvolles stehen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php 
$timelineuser = "der Twittername";
$filename = "/tmp/twitter-$timelineuser.txt"; # Hier werden die Feed zwischengespeichert, um den Zugriff auf Twitter zu reduzieren
$cachetime = 15; # Zeit bevor der Tweet von Twitter neu geladen wird in Minuten
$tweetsource = "Name unter dem getweetet wird";
define('CONSUMER_KEY', 'bitte eingeben');
define('CONSUMER_SECRET', 'bitte eingeben');
define('OAUTH_TOKEN', "bitte eingeben");
define('OAUTH_TOKEN_SECRET', "bitte eingeben");
 
# Formatiert die Zeit etwas netter
function timeago($delta){
    if ($delta < 60) {
      return 'vor weniger als einer Minute';
    } else if($delta < 120) {
       return 'vor wenigen Minuten';
    } else if($delta < (60*60)) {
       return ((int)($delta / 60)) . ' Minuten alt';
    } else if($delta < (120*60)) {
       return 'über eine Stunde alt';
    } else if($delta < (24*60*60)) {
       return 'über ' + ((int)($delta / 3600)) . ' Stunden alt';
    } else if($delta < (48*60*60)) {
       return 'vor einem Tag';
    } else {
       return ((int)($delta / 86400)) . ' Tage alt';
    }
}
 
 
# Existierte die temporäre Datei nicht oder ist älter als $cachetime, lade den Feed von Twitter
if(@filectime($filename) == false || @filectime($filename) <= time()- 60 * $cachetime ){
  ob_start(); 
  # BITTE NICHT VERGESSEN, DIE DATEI ZUR VERFÜGUNG ZU STELLEN!!
  require_once('twitteroauth/twitteroauth.php');
 
  /* Create a TwitterOauth object with consumer/user tokens. */
  $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
 
  /* Verwendet werden können alle Aufrufe von https://dev.twitter.com/docs/api/1.1 */
  /* Zum Beispiel: */
 
  // $content = $connection->get('account/verify_credentials');
  // $content = $connection->get('users/show', array('screen_name' => $timelineuser));
 
  # Rufe die Timeline von $timelineuser auf. Zeige 20 Einträge und kürze die Userinformationen
  $content = $connection->get('statuses/user_timeline', array('screen_name' => $timelineuser, 
                                                              'count' => 20,
                                                              'trim_user' => true,
                                                              'include_entities' => false));
  ?>
  <ul style="list-style:none;padding-left:0px;margin-left:0px" id="twitter_update_list">
  <?
  # Ausgabe des Tweets:
  foreach($content as $key=>$tweet){
    $tweet = (array) $tweet;
    if(strpos($tweet["source"],$tweetsource)){
      $key++;
      ?>
      <li style="margin-bottom: 20px">
        <? echo timeago(time() - strtotime($tweet["created_at"])); ?>
        <span><? echo $tweet["text"] ?></span>
      </li>
 <? }
    # Es werden nur die ersten 5 Tweets ausgeben. Weiter oben werden 20 Tweets abgerufen, weil der Ersteller der Tweets unterschiedlich sein kann
    # und sichergestellt werden soll, dass genug von $tweetsource vorhanden sind.
    if($key == 6){ 
      break;
    }
  } 
?>
</ul>
<a href="http://twitter.com/<? echo $timelineuser ?>" id="twitter-link" style="display:block;text-align:left;">Folge uns auf Twitter</a>
 
<? 
  $content = ob_get_contents(); 
  ob_end_clean();
  if (!$handle = fopen($filename, "w")) {
    print "Kann die Datei $filename nicht öffnen";
    exit;
  }
  // Schreibe $content in die geöffnete Datei.
  if (!fwrite($handle, $content)) {
    print "Kann in die Datei $filename nicht schreiben";
    exit;
  }
  fclose($handle);
 
  echo $content;
}
# Es gibt eine temporäre Tweetdatei im angegeben Zeitfenster. Gibt den Inhalt aus dieser aus.
else{
  $handle = fopen($filename, "r");
  $content = fread($handle, filesize($filename));
  fclose($handle);
  echo $content;
}

Bei korrekter Verwendung erscheint eine Liste mit den letzten 5 Tweets des angegebenen Users.