Bilo bi lijepo te korisno da svaki put kad napišeš novi post na blogu on automatski javi ekipi (followerima) na Twitter da na blogu ima nečeg novog, a ne da moraš ići na lice mjesta i to pisati sam.
Stvar se, jasno, može vrlo lako napraviti jer je Twitter odavno otvorio API preko kojeg se mogu stvarati čuda preko običnog HTTP zahtjeva (requesta).
Za Wordpress i slične sustave već postoje pluginovi koji to rade, a Internet je prepun alata koji koriste Twitter na razne načine. (Ovo je primjerice neloša ideja: RSS to Twitter - Twitter (kao da) čita RSS feeed vašeg bloga i objavljuje nove stvari.)
U ovom postu opisat ću kako se to radi ručno, iz PHPa, koristeći oldschool tehniku (bez upotrebe CURL biblioteke koja vrlo uljepšava stvar, samo što nije raspoloživa svugdje).
• • • • •
Službena dokumentacija kaže da je URL na koji se šalje novi post (status update):
http://twitter.com/statuses/update.xml
Umjesto xml sufiksa moguće je koristiti json, rss ili atom, ovisno u kojem formatu želimo odgovor (reply). Nebitno je koji jer ionako nećemo parsati odgovor pošto se sve što trebamo uredno nalazi u HTTP error kodu koji dolazi u zaglavlju (headeru).
Na taj URL trebamo poslati našu poruku (twit) zajedno s Twitter korisničkim imenom i lozinkom. Idemo odmah gradit funkciju:
function post_to_twitter($message)
{
$host = "twitter.com";
$url = "http://twitter.com/statuses/update.xml";
$username = "ime";
$password = "lozinka";
(Ime i lozinku treba, naravno, zamjeniti s pravim podacima.)
Twitter poruke ograničene su na 140 znakova i sve što je viška biti će odrezano. Svejedno, napravit ćemo provjeru dužine:
$length = strlen($message);
if($length > 140)
return "$length characters! Max. is 140.";
$message = "status=" . $message;
Dobro, sad ako se u poruci nalazi neki URL Twitter će ga automatski skratiti preko TinyURL servisa (Vuče, kad će API za skrati.net?), ali uzmimo za sad da je ovo najsavršeniji kod u ovom dijelu galaksije.
HTTP request koji se šalje serveru izgleda npr. ovako:
POST http://twitter.com/statuses/update.xml HTTP/1.1
Host: twitter.com
Authorization: Basic xxyyzz
Content-type: application/x-www-form-urlencoded; charset=utf-8
Content-length: 18
Connection: Close
status=Vidi kako Twittam!
Ako prvi put vidite ovako nešto nemojte se plašiti - sve je standardno za jedan HTTP Post: nekoliko linija headera koje završavaju s CR, pa jedan red prazan i onda tijelo (body) poruke. S tim da su ovo xxyyzz u base64 kodirano ime i lozinka.
Treba dakle dinamički izbildati to nešto:
$CR = "\r\n";
$request = "POST $url HTTP/1.1" . $CR
. "Host: $host" . $CR
. "Authorization: Basic " . base64_encode("$username:$password") . $CR
. "Content-type: application/x-www-form-urlencoded; charset=utf-8" . $CR
. "Content-length: $length" . $CR
. "Connection: Close" . $CR
. $CR
. $message;
Nakon toga ga poslati serveru: vezu otvaramo s fsockopen() da imamo kontrolu vremena i grešaka. Timeout ćemo postaviti na 3 sekunde.
$timeout = 3;
$fp = fsockopen($host, 80, $errno, $errstr, $timeout);
if(!$fp || $errno)
die("Error #$errno: $errstr");
fputs($fp, $request);
(Ako Twitter ne odgovori za 3 sekunde znači da je u banani.)
stream_set_timeout($fp, $timeout);
$response = fread($fp, 4096);
fclose($fp);
HTTP odgovor (response) koji stigne natrag sličan je ovom zahtjevu koji smo poslali. Header u kojem se nalazi status i body kojeg ignoriramo jer mi smo ipak profesionalci i ne radimo više nego što treba. ;)
Regularni izraz u prvoj liniji traži taj status broj. 200, 404, 403 ili što već nađe.
if(!preg_match("/\d\d\d/", $response, $status))
die("Error: no return status code: \n$response");
if($status[0] != 200)
die("Error: HTTP response $status[0].");
echo "Twitter poslan.";
}
I to je sve. Prije nego što otvorimo pivo i divimo se svojem megaprogramerskom znanju spomenimo još kako se to poziva:
post_to_twitter("Vidi kako Twittam!");
post_to_twitter("Najbolji blog u svemiru: " . urlencode("http://lionsfart.com/"));
Cheers!
PS. Autor ovih redaka odriče se odgovornosti ako vaša aplikacija iznenada popizdi, počne twittati 100 na sat i sruši Twitter.