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$messageest trop long, il sera coupé et$endingsera 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); } }
Commentaires
25 mai 2010 à 22:37
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?
25 mai 2010 à 23:56
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/
26 mai 2010 à 8:05
Je n’ai pas eu ce problème…
26 mai 2010 à 12:27
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?
28 juin 2010 à 8:45
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! ^__^
28 juin 2010 à 9:48
@Ivan Razine: Il suffit de suivre le point 3, « Autres interactions avec Twitter » pour utiliser directement la méthode
statuses_updatede la DataSource.@Lionlancer: simply follow the part 3 of the doc, « Other Twitter interactions » to use directly the DataSource method called
statuses_update.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.
5 août 2010 à 13:58
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
15 septembre 2010 à 16:06
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
13 février 2011 à 20:41
@Romulo
If you don’t use « twitterable » behavior in your model you have to init the twitter component before trying to get the DataSource.
23 février 2011 à 17:15
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
23 juin 2011 à 21:52
Works perfectly! Thanks.
My only doubt is how can I athenticate the app, to update status, delete tweets, etc?
Thanks!
24 juin 2011 à 13:57
All the Twitter API methods are available through the included datasource.