Du général au particulier: canaliser divers flux RSS vers un mur Facebook

Le contexte

Par conviction et aussi parce que ça semble finalement plein de bon sens, j'évite de confier trop de contenu (texte, photo, code) directement aux sites comme Facebook qui s'approprient un peu trop rapidement les données de leurs utilisateurs.

Plus concrètement le meilleur endroit pour conserver ses données reste son ordinateur (avec ce qu'il faut de sauvegarde sur des disques externes), et c'est avant tout comme ça que je sauve mes photos et mon code.

Pour les données un peu plus spécifiques "internet" (les articles de blog et une sélection de photos) j'utilise divers services "libres": des services construits sur du logiciel libre et utilisant (forcément) des protocoles ouverts qui facilitent l'échange de données avec d'autre services. En la matière, Wordpress, zenPhoto et identi.ca me rendent assez bien service.

Enfin pour des cas vraiment particuliers je passe par des services propriétaires comme Flickr, Twitter et finalement Facebook.

L'objectif

Et bien l'objectif est particulièrement simple a première vue: faire en sorte que les nouveaux articles et les nouvelles photos publiées sur mon blog ou via identi.ca arrivent sur mon "mur" Facebook automatiquement.

C'est "simple" car l'essentiel de la technologie nécessaire existe, est "libre" et vastement répandue avec internet et son protocole HTTP d'un côté et de l'autre côté les flux RSS omniprésents sur le web et qui permettent à tout un tas d'applications de se tenir au courant des nouveautés apparues sur chaque site (un nouvel article, une nouvelle photo etc).

L'échec

Il y a quelques temps Facebook offrait la possibilité de "brancher" sur son mur n'importe quels flux RSS et ça marchait pas mal, tellement bien que ça n'avait aucun intérêt d'écrire un article dessus. Depuis, ils ont limité la fonctionalité à un seul flux: donc il faut choisir entre avoir les articles du blog postés sur le mur, ou alors les "marques" (les "tweets" version identi.ca) ou alors les photos mais pas les trois en même temps. Et pour une raison inconnue même avec un simple flux, cela marche maintenant singulièrement mal.

Bref le message était assez clair: si vous voulez faire ce genre de choses, faites ça avec une "application" tierce. Du coup j'ai pu essayer une application assez renommée et dont le seul et unique but affiché est de régler ce genre de problème (en l’occurrence twitterfeed) mais qui, bien qu'ayant pas mal d'options intéressantes pour filtrer les flux par exemple, s'est avérée presque aussi incapable de lire des flux rss que facebook.

La solution

J'ai malgré tout fini par trouver une autre application qui fasse exactement le job qu'on lui demandait (en tout cas pour l'instant): RSS Graffiti. Cette application permet de transcrire plusieurs flux rss sur un mur facebook. Niveau fonctionnalité c'est à peu près tout mais c'est justement très précisément ce dont j'avais besoin, et surtout: ça fonctionne !

Pour aller un peu plus loin...

Pour raffiner un peu le truc, en jouant un peu avec les flux (modifier les titres, filtrer certains articles en fonction de leur contenu...) il est possible d'utiliser Yahoo Pipes: un outil carrément épatant et finalement assez fun à utiliser.

Pour ceux qui essaieraient, il faut savoir qu'il y a un inconvénient à utiliser Yahoo pipes avec une application comme RSS Graffiti (c'est pareil avec twitterfeed et facebook): Yahoo fixe une limite au nombre de connections acceptées par une certaine IP, et à partir du moment où un peu trop de personnes branchent RSS Graffiti sur leur "Yahoo Pipe" et bien, grosso modo, Yahoo bloque RSS Graffiti. Résultat: RSS Gaffiti est inutilisable directement avec un Yahoo Pipe...

Heureusement une solution existe mais là ça devient un peu gore, même si elle n'a rien d’impressionnant pour qui a déjà joué un peu avec un serveur linux. Elle nécessite d'avoir accès à un serveur ayant "pignon sur internet" (en l’occurrence servant des pages web), une fois cette condition remplie, il suffit de faire un job cron qui lance wget afin de récupérer le flux rss sur yahoo pipes et enregistrer ce flux dans un répertoire accessible depuis internet (et via HTTP). Ensuite c'est l'adresse de ce fichier rss copié qu'il faut indiquer à RSS Graffiti. A noter qu'il faut s'assurer que le fichier copié soit supprimé avant que wget aille en chercher une nouvelle copie (( donc le job cron doit plutôt lancer un 'rm machin.rss && wget yahoo_pipe_url -O machin.rss' )).

Mise à jour: Apparemment le flux qui sort de yahoo Pipe n'a pas de déclaration d'encodage dans l'en-tête xml (la première ligne du flux rss est <?xml version="1.0"?> ) mais lorsqu'on rejoint un flux où l'essentiel est encodé en utf-8 mais où un caractère non-utf-8 peut se glisser, ça peut poser des problèmes à certains services (par exemple des caractères "étranges" apparaissent à la place de caractères accentués). Un moyen d'éviter ça au maximum est de s'assurer que l'encodage est bien déclaré explicitement en utf-8 au tout début du fichier, ce qui peut se faire avec un petit jeu à base d'echo et de tail, la ligne de commande devenant:

rm machin_no_encoding.rss \ 
&amp;&amp; wget yahoo_pipe_url\&amp;_render=rss -O machin_no_encoding.rss \ 
&amp;&amp; echo "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;" &gt; machin.rss \ 
&amp;&amp; tail -n +2 machin_no_encoding.rss &gt;&gt; machin.rss