keine Kommentare
Eigene Tweets via Twitter API auslesen
Heute habe ich mich mal daran gesetzt, meine letzten Tweets via Twitter-API auszulesen. Eine Dokumentation dazu findet man unter http://dev.twitter.com/doc/get/statuses/user_timeline.
Ich habe fix eine Klasse zusammengeschraubt, die das Request absetzt und eine bestimmte Anzahl von Tweets zurückgibt:
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 | class Twitter { public static function getTweets($user, $limit = 20, $with_responses = false) { $return = array(); $page = 1; $request_url = "http://api.twitter.com/1/statuses/user_timeline.xml?screen_name={$user}&count=1&page="; while (count($return) < $limit) { $xml_object = simplexml_load_file($request_url . $page++); if ($xml_object !== false) { if (!$with_responses && (string)$xml_object->status->in_reply_to_status_id != "") continue; $return[] = array( "time" => strtotime((string)$xml_object->status->created_at), "text" => self::linkify((string)$xml_object->status->text) ); } else { return $return; } } return $return; } private static function linkify($tweet) { $tweet = preg_replace( array( "/http(.*)(.$|. | |$)/Uis", "/#(.*)(.| |$)/Uis", "/@(.*)(.| |$)/Uis" ), array( "<a href="http$1">http$1</a>$2", "<a href="https://twitter.com/#search?q=%23$1">#$1</a>$2", "<a href="http://twitter.com/$1">@$1</a>$2" ), $tweet ); return $tweet; } } |
Auf meiner Seite habe ich eine Liste twitterlist, die ich nun mit den Tweets befüllen kann
Da der ganze Request je nach Twitter-Auslastung mitunter recht lange dauert, habe ich mich entschlossen die Tweets via Ajax zu aktualisieren, um die Ladezeit meiner Seite nicht unnötig zu verlängern. Ich verwende dazu einen MooTools-Request mit der zusätzlichen mootimeout-Klasse, mit der man dem Request einen Timeout-Callback verpassen kann:
1 2 3 4 5 6 7 8 9 10 11 12 13 | new Request({ method: "get", onSuccess: function(response) { $("twitterlist").set("html", response); }, onTimeout: function() { $("twitterlist").set("html", "<li><strong style="color:red">Error: </strong> Timeout"); }, timeout: 10000, url: "/ajax/get_tweets.php" }).send(); |
Der Request sollte natürlich im domready-Event stattfinden.
Der Inhalt der get_tweets.php ist recht überschaubar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php include_once "Twitter.class.php"; $return = ""; $tweets = Twitter::getTweets("pw81", 10); if (count($tweets) > 0) { foreach ($tweets as $tweet) { $return .= "<li>"; $return .= $tweet["text"] . " "; $return .= "<time datetime="" . date("Y-m-d", $tweet["time"]) . "">"; $return .= date("d.m.Y, H:i", $tweet["time"]); $return .= " Uhr</time>"; $return .= "</li> "; } } else { $return = "<li><strong style="color:red">Error: </strong> Cannot retrieve tweets.</li>"; } echo $return; ?> |
Da die Anzahl der Request von Twitter auf 150 Stück begrenzt ist, habe ich noch einen kleinen Fallback eingebaut, der eine Fehlermeldung zurückgibt, falls die Anzahl der möglichen Requests überschritten wurde.
Ich habe noch ein wenig die Liste angepasst, indem ich mir über http://ajaxload.info/ eine kleine Ladegrafik erstellt habe, die angezeigt wird bis der Request abgeschlossen ist:
1 2 3 4 5 6 7 | <ul id="twitterlist"> <li> Loading Tweets...<br /> <br /> <img src="/img/layout/loading.gif" alt="Loading" /> </li> </ul> |
Das war”s auch schon. Ich hoffe ich konnte damit einigen weiterhelfen ;-).
diesen Artikel bookmarken oder weiterempfehlen: