Mise à jour du plugin Twitter pour CakePHP 1.3 et prise en charge d’OAuth

Nous présentons la nouvelle version de notre plugin Twitter, qui permet de faire communiquer facilement une appli CakePHP et un compte Twitter. Cette nouvelle mouture intègre la nouvelle méthode d’authentification par OAuth, mise en place par Twitter et qui va remplacer définitivement l’authentification basique le 30 juin 2010. Nous avons profité de l’occasion pour tester le plugin sur la version 1.3 de CakePHP.

1. Installation

Pour installer le plugin depuis Github, nous lançons la commande suivante depuis le répertoire APP/plugins :

git clone git://github.com/kalt/twitter-oauth.git twitter

Nous tenons à remercier Michael « MiDri » Riddle, Daniel Hofstetter et Alexandru Ciobanu pour leur travail largement repris dans la DataSource incluse dans le plugin.

2. Configuration

2.1. Paramètres du compte Twitter

Nous nous rendons sur dev.twitter.com, nous connectons avec l’identifiant et le mot de passe du compte, puis nous cliquons sur le lien « register an app ». Nous renseignons les informations demandées, en particulier :

  • Application Type: Browser
  • Default Access type: Read & Write

Une fois cette étape terminée, notre application est déclarée sur Twitter qui va lui autoriser l’accès à son API. Nous pouvons maintenant configurer le plugin, en dupliquant le fichier APP/plugins/twitter/config/twitter.default. Nous renommons cette copie en twitter.php avant de l’ouvrir dans un éditeur :

class TWITTER_CONFIG {
	var $twitter = array(
		'datasource'         => 'twitter_oauth',
		'consumer_key'       => '',
		'consumer_secret'    => '',
		'oauth_token'        => '',
		'oauth_token_secret' => ''
	);
}

Les « consumer key » et « consumer secret » se trouvent dans la page nommée « Application details » sur dev.twitter.com. Les « oauthtoken » et « oauthtoken_secret » se trouvent eux dans la page nommée « My Access Token », dont le lien se trouve dans le panneau de navigation à droite.

2.2. Attacher à un Modèle

Le plugin inclut un Comportement (Behavior) qui peut être lié à un Modèle. La seule configuration à définir est si l’on veut poster un status lors d’une création d’un nouvel enregistrement de ce modèle ('on' => 'create'), lors d’une mise à jour ('on' => 'update') ou les deux ('on' => 'both').

class Post extends AppModel {
	var $actsAs = array('Twitter.Twitterable' => array(
		'on' => 'create'
	));
}

Dans cet exemple, chaque fois qu’un Post sera créé, une notification sera envoyée sur notre compte Twitter, avertissant ainsi nos abonnés.

2.3. Création d’une méthode Model::twitterStatus()

Le Behavior va chercher l’existence d’une méthode de modèle nommée twitterStatus(). Le fonctionnement de cette méthode est à l’entière convenance du lecteur, elle doit simplement renvoyer une chaine de caractères qui sera postée sur Twitter. N’oublions pas qu’un status est limité à 140 caractères.

Afin de rendre les choses simples, nous avons fourni une méthode qui va formater un status comme l’attend Twitter. Cette méthode prend 3 arguments :

  • $message : (requis) il s’agit du texte qui sera envoyé ;
  • $url : URL facultative, un lien vers l’article complet par exemple. Elle sera automatiquement raccourcie (nous avons choisi le service gratuit http://is.gd) ;
  • $ending : chaine de caractère optionnelle : si $message est trop long, il sera coupé et $ending sera ajoutée après la coupure. Vaut « … » par défaut.

Exemple complet :

class Post extends AppModel {
	var $actsAs = array('Twitter.Twitterable' => array(
		'on' => 'create'
	));
 
	function twitterStatus() {
		$title = $this->data['Post']['title'];
		$url   = Router::url(array('controller' => 'posts', 'action' => 'view', $this->id), true);
 
		return $this->twitterFormatStatus($title, $url, '...');
	}
}

Ici nous choisissons de composer le status qui sera envoyé avec le titre du Post (coupé et suivi de ‘…’ si trop long), suivi de l’url vers l’article complet.

3. Autres interactions avec Twitter

Puisque nous utilisons une DataSource bien complète, nous pouvons accèser aux autres méthodes de l’API Twitter. Nous renvoyons le lecteur à la lecture de la documentation de l’API.

Notons qu’il n’est pas nécessaire d’utiliser le Behavior pour accèder aux méthodes de la DataSource, il suffit de l’appeler lorsque nous en avons besoin.

Exemple: nous recherchons l’expression « cakephp » sur Twitter et imprimons le résultat à l’écran :

class TrucsController extends AppController {
	function index() {
		$ds = ConnectionManager::getDataSource('twitter');
 
		$results = $ds->search(array('q' => 'cakephp');
 
		debug($results);
	}
}
Pierre-Emmanuel Fringant

Articles connexes

Commentaires

Merci énormément pour ce tuto, j’arrive enfin à poster sur Twitter!

Cependant, j’obtiens un lien raccourci comme ceci:

« 12 http://is.gd/cp2fm 0″

D’où viennent ces chiffres?

Problème résolu en passant à l’encodage de bit.ly, grâce au tuto de MATT LANGFORD disponible sur http://mattflies.com/tech/automatically-shorten-urls-for-sharing-using-bit-ly/

/*
app/plugins/twitter/models/twitter.php
*/
function shorten($url) {
    App::import('Core', 'HttpSocket');
    $HttpSocket =& new HttpSocket();
    $bitlylogin = ''; // <- votre login ici!
    $bitlyapikey= '';
    $bitlyurl = $HttpSocket->get("http://api.bit.ly/shorten?version=2.0.1&longUrl=".$url."&login=".$bitlylogin."&apiKey=".$bitlyapikey);
    $bitlycontent = json_decode($bitlyurl,true);
    $bitlyurl = $bitlycontent["results"][$url]["shortUrl"];
    return $bitlyurl;
}

Je n’ai pas eu ce problème…

Comment serait-il possible de déclencher un tweet à partir d’un controlleur?

Mon objectif est de lancer une tâche cron qui lance une fonction. Celle-ci fait un test et lance un tweet si les conditions de ce test sont remplies.

Est-ce que vous pouvez mes donner des indices pour y arriver?

Please add support for posting tweets using the controllers. And if possible, please also include process for a user to authenticate the application (requests for oauth token & oauth token secret). This will help a lot of developers. Thanks a lot! ^__^

@Ivan Razine: Il suffit de suivre le point 3, « Autres interactions avec Twitter » pour utiliser directement la méthode statuses_update de la DataSource.

@Lionlancer: simply follow the part 3 of the doc, « Other Twitter interactions » to use directly the DataSource method called statuses_update.

$ds = ConnectionManager::getDataSource('twitter');
$ds->statuses_update(array('status' => "I love CakePHP !"));

About the OAuth authorization requests, I do not intend to include this feature in the future. My plugin is meant for a single authorized app to interact with a single Twitter account, so the oauth token and secret are set up on installation.

Bonjours,

J’ai un problème avec la création de ces interaction, j’ai fais un test pour voir si c’était possible de poster un post, j’ai fais exactement comme c’était indiqué, mais rien n’y fais cela ne marche pas du tout.

Je précise que j’ai vérifier les paramètre de l’application et il fonctionne.

Merci de me répondre rapidement et à bientôt

Any chanche why is it displaying this error?

ConnectionManager::getDataSource – Non-existent data source twitter

Probabbly i have not clear how to proceed with the step 2.3

@Romulo

If you don’t use « twitterable » behavior in your model you have to init the twitter component before trying to get the DataSource.

$this-&gt;Twitter = ClassRegistry::init('Twitter.Twitter');
$ds = ConnectionManager::getDataSource('twitter');
        $results = $ds-&gt;statuses<em>user</em>timeline();
        $this-&gt;set(compact('results'));</p>
 
<p>

Bonjour,

Je rencontre quelques soucis avec ce plugin.

Un article plus complet (pour éviter le flood et un poste trop long) est accessible à cette adresse :

http://forum.cakephp-fr.org/viewtopic.php?id=3208

Merci d’avance pour votre aide !

Cordialement, Innah

Works perfectly! Thanks.

My only doubt is how can I athenticate the app, to update status, delete tweets, etc?

Thanks!

All the Twitter API methods are available through the included datasource.

Participez

Pour insérer une portion de code, utilisez <pre lang="php">...</pre>