Streaming Twitter: NodeJS & Socket.IO
Bonjour les enfants. Aujourd'hui on va s'amuser un peu avec Node.js et les Web Sockets. Pour ceux qui vivent encore dans une grotte, Node.js est un framework Javascript côté serveur basé sur V8 (Chrome). L'avantage est qu'il gère les entrées/sorties de manière asynchrone et supporte un modèle de programmation événementiel. En gros il est parfait pour les applications web temps réels (notifications, push serveur, streaming…).
En quelques lignes de codes on va être capable de faire cette petite démo. Tu as besoin d'avoir un navigateur à la pointe de la technologie pour que ça marche mon ami.
Installation
Pour commencer il nous faut Node.js bien sur. Alors là tu as plusieurs solutions. Tu peux déjà commencer par regarder si il est disponible sous forme de paquet dans ton OS ou distribution GNU/Linux. Sinon tu vas devoir le compiler, mais c'est pas très difficile: regarde.
Il est aussi important d'installer npm (Node Package Manager), il va nous simplifier la vie quand on voudra installer des extensions à Node.js.
curl http://npmjs.org/install.sh | sh
Socket.io
Socket.io est la première extension que l'on va installer pour ce tutorial. Le but de cette librairie est de faciliter le développement d'applications web temps réel dans tous les navigateurs. Parce que tu as certains navigateurs qui gèrent les sockets et d'autres non. Alors cette librairie va décider elle-même quel chemin prendre pour tes échanges parmi ceux-là :
- Websocket
- Adobe Flash $ocket ©
- Ajax long polling
- Multipart XHR
- Forever iFrame (lol IE)
- JSONP polling
npm install socket.io
Et puisque l'on va jouer avec l'API streaming de Twitter, tu peux aussi installer l'excellent twitter-node de la même manière.
Code serveur
var config = {user: "pseudo", password: "password", action: "filter", track: ['bieber']},
sys = require('sys'),
server = require('http').createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('
<h1>Twitter live stream</h1>
');
});
server.listen(8080);
console.log('Server running at http://127.0.0.1:8080/');
var socket = require('socket.io').listen(server),
twitter = new (require("twitter-node").TwitterNode)(config);
twitter
.addListener('error', function(error){
console.log(error.message);
})
.addListener('tweet', function(tweet){
socket.broadcast(JSON.stringify(tweet));
})
.addListener('limit', function(limit){
sys.puts('LIMIT: ' + sys.inspect(limit));
})
.addListener('delete', function(del){
sys.puts('DELETE: ' + sys.inspect(del));
})
.addListener('end', function(resp){
sys.puts('wave goodbye...' + resp.statusCode);
})
.stream();
Au début du code on instancie quelques variables, dont la variable config que l'on passera à notre objet twitter-node. Elle contient les accès Twitter, le fait que l'on veut utiliser l'API Twitter en mode filtre et le mot sur lequel on veut filter. On instancie aussi un serveur Node.js, dans mon cas sur le port 8080.
On attache un objet socket.io sur notre serveur et on instancie un objet twitter-node. On démarre le stream de Twitter en attachant des fonctions aux évènements que l'on peut recevoir.
L'évènement du nom de “ tweet ” est appelé à chaque fois que l'on reçoit un tweet. Les évènements limit et delete sont envoyés par l'API Twitter. Par exemple le cas du delete est important à prendre en compte si on construit un client Twitter sur l'API de streaming. Imaginons que quelqu'un poste un tweet et l'efface 2s après. Vous l'aurez déjà reçu et affiché. Mais 2s après vous allez recevoir un signal DELETE sur ce tweet et votre client pourra gérer sa disparition.
Quand on passe dans l'évènement Tweet, je demande à Socket.io d'envoyer en broadcast (à toutes les personnes connectées sur mon serveur) d'envoyer un objet JSON du tweet reçu.
Côté Client
Liquid error: ClassNotFound: no lexer for alias 'html+js' foundDonc là je charge jQuery et une fois que c'est fait je vais chercher le script socket.io.js. Il est automatiquement fournit par le serveur node, donc tu as peut-être le port à changer. Une fois que c'est fait on peut créer un nouveau socket et attacher une fonction à l'évènement message. Cet évènement est appelé à chaque fois que le serveur nous envoi quelque chose. Dans notre cas un tweet, donc je l'affiche.
Lancement du serveur
node serveur.js
Tu n'as plus qu'a ouvrir la partie cliente dans ton navigateur et ça devrait marcher. Je trouve Node.js vraiment intéressant et je n'avais pas pris le temps de le creuser plus que ça. Mais le développement de ce programme est vraiment rapide et s'améliore de jour en jour. Il existe des wrappers node pour Mysql, mongodb et d'autres base de données. Et d'autres plugins aussi utiles que Twitter-node ou socket.io. Il y a même des frameworks de type MVC et cie. On en trouve une bonne liste sur cette page.