Les flux RSS, Shaarli et PubSubHubbub

Logo de PubSubHubbub

Derrière ces termes barbares se cache trois outils qui servent beaucoup à la diffusion du contenu sur internet.

Les flux RSS, vous le savez sûrement, c’est ce qui nous évite de faire tous les jours le tour de nos sites préférés comme sur internet avant 2000. Shaarli, c’est un équivalent de del.ico.us, codé par Monsieur Sebsauvage, et ça sert à mettre de côté et partager les liens que l’ont trouve intéressant. Et PubSubHubbub c’est quelque chose d’assez récent qui s’articule avec les flux RSS pour apporter de l’instantanéité.

Dans un flux RSS normal, l’abonné demande périodiquement au fournisseur si il y a du nouveau. Si le fournisseur à une nouvelle, il se passera donc au maximum une période (de quelques minutes à quelques heures) avant que son abonné l’apprenne.

Dans un flux RSS compatible PubSubHubbub, il y a un intermédiaire en plus, un « hub » qui est prévenu automatiquement par le fournisseur dès qu’il y a du nouveau. Et le hub va à son tour prévenir les abonnés immédiatement.

Comme souvent, c’est une technologie poussée par Google qui l’utilise également pour Feedburner, Google Reader, Google Alerts mais aussi pour son service d’indexation (Le googlebot agissant comme un abonné, il est prévenu dès qu’il y a du nouveau contenu à ajouter à l’index)

Et comme souvent, Goole a libéré cette technologie ce qui fait que tout le monde peut l’utiliser pour rendre son flux compatible, créer son hub ou faire son client d’abonnement.

Pourquoi je vous parle de tout ça ? Parce que quand j’utilisais encore Google Reader pour partager mes liens, je les publiais en temps réel sur Twitter à l’aide du service Reader2Twitter. Mais maintenant que j’utilise Shaarli (sur le mini site « Les petits liens d’Alda. » ) je me retrouvais à devoir attendre plus d’une demi-heure que Twitterfeed vérifie mon flux et publie les nouveautés sur Twitter. Et une demi-heure à l’âge de l’instantanéité, c’est long.

J’ai donc retroussé mes manches et ai quelque peu modifié Shaarli pour:

  1. Rendre les flux RSS et ATOM générés compatibles avec PubSubHubbub
  2. Prévenir un des hubs choisi qu’il y a une mise à jour.

Il faut tout d’abord récupérer la librairie disponible pour PHP sur le site de PubSubHubbub: Publisher.php

Puis rajouter quelques lignes au fichier index.php de Shaarli:

// ------------------------------------------------------------------------------------------
// Misc utility functions:

// Update pubsubhubbub
// External library import
include './publisher.php';
$hub_url = 'http://pubsubhubbub.appspot.com/';
function pubsubhub()
{
        global $hub_url;
        $p = new Publisher($hub_url);
        $topic_url = array (
                        serverUrl().$_SERVER['SCRIPT_NAME'].'?do=atom',
                        serverUrl().$_SERVER['SCRIPT_NAME'].'?do=rss'
                     );
        $p->publish_update($topic_url);
}

// Returns the server URL (including port and http/https), without path.
// eg. "http://myserver.com:8080"
// You can append $_SERVER['SCRIPT_NAME'] to get the current script URL.
// Ouput the last 50 links in RSS 2.0 format.
function showRSS()
{
    global $LINKSDB;

// ...    

     echo 'Shared linksfr-FR'.$pageaddr.''."\n\n";
    echo '


          ';
    $i=0;
    $keys=array(); foreach($linksToDisplay as $key=>$value) { $keys[]=$key; }  // No, I can't use array_keys().

// ...

}
function showATOM()
{
    global $LINKSDB;

// ...

    $feed='';
    $feed.='';
    if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) $feed.=''.htmlspecialchars($latestDate).'';
    $feed.='
';
    $feed.='

            ';
    $feed.=''.htmlspecialchars($pageaddr).'';
    $feed.=''.htmlspecialchars($pageaddr).''."\n\n"; // Yes, I know I should use a real IRI (RFC3987), but the site URL will do.
    $feed.=$entries;
    $feed.='';
    echo $feed;
    exit;
}
    // -------- User clicked the "Save" button when editing a link: Save link to database.
    if (isset($_POST['save_edit']))
    {

// ...

        $LINKSDB->savedb(); // save to disk
        pubsubhub();
        invalidateCaches();

        // If we are called from the bookmarklet, we must close the popup:

// ...
        exit;
    }

Une fois ces modifications effectuées, il ne reste plus qu’à attendre que les abonnés demandent une mise à jour du flux. Ensuite s’ils sont compatibles, ils passeront en mode PubSubHubbub. Pour tester c’est très simple, il suffit de créer un flux feedburner. De base il se met à jour tous les quarts d’heure, avec PubSubHubbub activé c’est instantané.

Concernant la mise à jour des liens sur twitter, Twitterfeed avait annoncé la compatibilité en 2010 mais il a quand même fallu attendre plus de 30min avant de voir mes liens apparaître. Je suis donc passé à dlvr.it qui a une fréquence de mise à jour minimum de 15min et qui permet de cocher une case pour activer PubSubHubbub. Les liens n’arrivent toujours pas en temps réel (il faudrait pour ça que je monte mon propre client je suppose) mais les 5 minutes que j’ai constaté sont un délai déjà plus acceptable.

  • http://www.ouvre-boite.com Julien

    Ca devrait etre temps instantané pour Twitterfeed (et une peu moins bien pour dlvr.it). Il doit y avoir un problème quelque part dans le setup. Essaye de poster sur le Google Group de PubSubHubbub et/ou Superfeedr :)

    • http://aldarone.fr/ Aldarone

      Pour l’instant ça a l’air de remarcher correctement (enfin, c’est encore à vérifier mais 2 updates successives sont passées instantanément, on tient le bon bout.)

      Je pense que Twitterfeed n’arrivait pas à trouver le lien du hub quand il était situé sous les items. Ensuite il fallait attendre qu’il rafraichisse le flux. J’espère que c’est ça en tout cas…

  • Sebsauvage

    Courage !
    La 0.0.28 est en route, avec ton patch :-)
    (Je publierai sans doute demain, moins probablement ce soir.)

    • http://aldarone.fr/ Aldarone

      Excellent ! Merci :)