Lion's Fart RSS Feed
home ‹‹

Kako programski postati na Twitter?

Utorak, 5. Svibnja 2009.
Twitter 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.

Komentari

05.05.2009. 21:43 | 1
marra

Nakon ovog posta i ja trebam pivo!

05.05.2009. 21:55 | 2

Cool.. sve se svodi na headere. Ja više volim curl.. tako da svi koji nemaju curl, odmah natipkati u terminal
sudo apt-get install php5-curl

.. i eto curla :)

05.05.2009. 21:58 | 3

previse komplicirano za negeekove ;-) ... moze se puno jednostavnije postati post direktno na Twitter ...

06.05.2009. 0:43 | 4

Vidiš, LongURL (http://longurl.net) ima API koji možeš iskoristiti ja mislim, pogledaj u footheru dio za webmastere, a to je domaći proizvod za razliku od TinyURL-a i osim onoga što radi Tiny, radi i još raznih cool stvarcica kao sto je dodavanje reklame (svoje vlastite) u frame iznad linka, pracenje statistika itd.

06.05.2009. 6:42 | 5

Evo za one koji vole curl (a ne da im se pisati iznova kao Vlatko ;). Trebate samo Application::USER i PASSWORD promijeniti...

class Twitter {

const STATUSES_UPDATE_URL = 'http://twitter.com/statuses/update.xml';

public function send( $message, $link = '' ) {
$message = Strings::wrapTo( $message, 80 );

$curlHandle = curl_init();
curl_setopt( $curlHandle, CURLOPT_URL, self::STATUSES_UPDATE_URL );
curl_setopt( $curlHandle, CURLOPT_CONNECTTIMEOUT, 2 );
curl_setopt( $curlHandle, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curlHandle, CURLOPT_POST, 1 );

curl_setopt( $curlHandle, CURLOPT_POSTFIELDS, 'status=' . $message . ' ' . $link );
curl_setopt( $curlHandle, CURLOPT_USERPWD, Application::TWITTER_LOGIN . ':' . Application::TWITTER_PASSWORD );
$result = curl_exec( $curlHandle );
curl_close( $curlHandle );
return ! empty( $result );
}

}

07.05.2009. 12:51 | 6

Komplicirate, sa ZF-om se to jednostavno napravi ovako (dobro, nisam probao, ovo je iz manuala):

$twitter = new Zend_Service_Twitter('ime', 'lozinka');
$twitter->status->update('Vidi kako Twittam!');

:-P

17.04.2010. 20:48 | 7

Ako će nekome pomoći Twitter vodič - http://tutorijali.hdonweb.com/internet/twitter-vodic

Dodaj komentar

ime *

e-mail

www

Dozvoljeni tagovi su A, B, I, U i S. e-mail adresa se nigdje neće prikazati.

Control panel

Linkovi RSS feedDnevni linkovi

  1. SQL Server App_name() function
    SQL Server tip: find out which application has modified your data.
  2. Other Android Languages
    It would be nice if you could build Android apps in other languages...
  3. Is polygamy bad for society?
    An anthropologist argues that it is as Canada considers whether having multiple wives is a constitutional right. (Salon)
  4. Spoil a photo
    Photobombs.
  5. 7 Ways to Play Internet Content in Your Living Room
    Samo sedam?
  6. JSON in Javascript
    Što je to JSON?
  7. Tawdry Tiger Tales
    America is obsessed with tigers. (slideshow @ Newsweek)
  8. Fun Ferret Facts
    Zanimljivosti o lasicama.
  9. Extreme Close-Up of the Face on Mars
    Faca na Marsu.
  10. Find the Most Time Consuming Code in your SQL Server Database
    SQL Server tip.
  11. Everyone Who Tried to Convince Me to use Vim was Wrong
    Vim editor.
  12. An Order of Seven Global Cyber-Guardians Now Hold Keys to the Internet
    7 država ima "ključeve za internet".
  13. Weirdo Toys
    Blog o neobičnim igračkama.
  14. The homeless brother I cannot save
    "A year ago, Jay traded my parents' home for the street. But the more I try to help him, the more I lose myself" (Salobn)
  15. 20 Secrets Your Waiter Won't Tell You
    20 stvari koje vam konobar neće reći.
  16. Opera Mini serves one billion pages a day
    Bravo Opera.
  17. Global Warming "Undeniable," U.S. Government Report Says
    A dobro jutro!
  18. Old Photographs Of Movie Stars
    Stare fotke poznatih faca.
  19. 15 Developer/Hacker Women to Follow on Twitter
    Twitterašice!
  20. Derby's Lara Croft Way is open for business
    Ulica Lare Croft!