samedi 28 mars 2009

Poster son statut Twitter avec PHP

Pour moi, en dépit de la popularité du service de micro-blogging Twitter, c'est encore resté au stade de curiosité. Peut-être parce que j'ai le verbe facile et que j'ai de la difficulté à être contraint à 140 caractères! Non, sans blague, on est habitué à ce genre de fonctionnalité, que ce soit dans le statut MSN (Share a quick message), dans celui de Facebook ou dans les SMS (160 caractères), donc je comprends l'engouement des gens à vouloir résumer leur pensée en une courte phrase.

Alors que la demande est grandissante, les utilisateurs veulent pouvoir intégrer le contenu à partir d'une interface unique. Qu'en est-il si on veut faire en sorte de poster un message vers Twitter à partir de notre propre application ?

En utilisant cUrl (à supposer qu'il est installé), on sait qu'on peut appeler la commande par le shell pour s'authentifier et poster le statut:

curl http://twitter.com/statuses/update.xml -u username:password -d status="message"

Sachant cela, rien ne nous empêcherait de lancer la commande PHP shell_exec(), mais pour des raisons de sécurité, les administrateurs réseaux ne sont jamais très friand à débloquer ce type d'appel. Souvent, le mieux qu'ils puissent faire est d'autoriser l'exécution de certains programmes, en les spécifiants comme sudoers.

$result = shell_exec('curl http://twitter.com/statuses/update.xml -u username:password -d status="message"');

Donc il est préférable d'utiliser la librairie cUrl et d'instancier l'appel à l'API REST directement par PHP:
// url qui pointe vers l'action update, en xml ou json
$api_url = 'http://twitter.com/statuses/update.xml';

// l'information de votre compte
$username = 'usr';
$password = 'pwd';

// le message
$args = array( 'status' => 'Mon premier statut par curl');

// initialiser une session cUrl
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $api_url);

curl_setopt($ch, CURLOPT_HEADER, True);
curl_setopt($ch, CURLOPT_NOBODY, False);

curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);

// information de login
curl_setopt($ch, CURLOPT_USERPWD, $username.':'.$password );

// en secondes
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// pour éviter l'erreur HTTP 417 - Expectation Failed
$headers = array('Expect:', 'X-Twitter-Client: ', 'X-Twitter-Client-Version: ', 'X-Twitter-Client-URL: ');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// envoyer le message
$response = curl_exec($ch);
$info = curl_getinfo($ch);

curl_close($ch);
Une fois l'envoi terminé, on récupère l'information retournée dans une variable et on peut regarder le statut par le code HTTP reçu:
if( intval( $info['http_code'] ) == 200 )
echo 'Message envoyé';
else
echo 'Erreur HTTP ' . $info['http_code'];
Notez que si vous faites des tests et que vous avez du mal à vous authentifier, votre compte sera bloqué temporairement et provoquera une erreur 401. Vous devrez patienter un certain temps pour qu'il soit dévérrouillé.

4 commentaires:

  1. Bonjour

    sympa ce script pour poster sur twitter. je cherche à faire la même chose pour facebook tu aurai des pistes?

    RépondreEffacer
  2. Malheureusement je n'ai jamais essayé de faire ça. Je jeterai un oeil pour voir comment ça fonctionne.

    RépondreEffacer
  3. Bonjour,
    Cette méthode ne fonctionne plus depuis le 1er septembre 2010, car Twitter a désactivé l'authentification basique (ce que fait Curl).
    Il faut maintenant utiliser OAuth, Il y a un tuto ici pour expliquer une méthode :
    http://yanncochard.com/tuto/envoyer-un-tweet-en-php-avec-oauth-sur-twitter

    RépondreEffacer
  4. Tu as raison, ça utilise maintenant l'authentification oAuth. As-tu essayé Zend_Service_Twitter ? Est-ce que je me trompe où depuis la version 1.10 du framework, le composant de Zend le supporte aussi ?

    J'ai vu ça dedans :

    require_once 'Zend/Oauth/Consumer.php';

    const OAUTH_BASE_URI = 'http://twitter.com/oauth';

    RépondreEffacer