Articles Taggés ‘parser’

Nabaztag et Google Reader (OPML)

7 mars 2010

Voici un petit script permettant à votre lapin de vous donner les dernières news provenant de l’ensemble de vos flux Google Reader.
Vous pouvez tester le résultat ici

Parser le fichier OPML

Pour cela, nous allons parser le fichier OPML que vous pouvez récupérer en cliquant sur Gérer mes abonnements (tout en bas à gauche de votre interface Google Reader) puis Importer/Exporter et enfin Exporter vos abonnements.

D’abord il faut extraire les différents flux du fichier OPML, pour cela j’ai créé une fonction recupFlux récursive.
[cc lang=’php’ width=’100%’]

// Flux google reader
$url_flux_rss = « http://*******/google-reader-subscriptions.xml »; // à remplacer évidemment
$tabFlux = array();
$tabNewRSS = array();

function recupFlux($xml,$prof=1) {
global $tabFlux;
foreach($xml->children() as $child) {
if (isset($child[‘xmlUrl’])) {
$tabFlux[] = $child[‘xmlUrl’];
}
recupFlux($child,$prof+1);
}

}
$opml= new SimpleXMLElement($url_flux_rss,null,true);
recupFlux($opml->body);

[/cc]

Vous obtenez ainsi un tableau $tabFlux contenant tous les flux.

Ensuite vous pouvez aller chercher chacune des 2 dernières news de chaque flux (par exemple).

[cc lang=’php’ width=’100%’]

foreach($tabFlux as $flux){
// recup des 2 dernières infos de chaque flux
$limite       = 2; // nombre d’actus à afficher

$Xml = @simplexml_load_file($flux); // charge le fichier
if($Xml === false){
die(« Erreur Flux, vérifiez l’adresse du flux »);
}

$i = 0;
foreach ($Xml->channel->item as $mon_rss){
$titre = (string) utf8_decode($mon_rss->title);
$quand = (string) utf8_decode($mon_rss->pubDate);
$i++;

$tabNewRSS[strtotime($quand)] = $titre; // on créé un nouveau tableau
if($i >= $limite){
break;
}
}

}
krsort($tabNewRSS); // trie le tableau pour avoir les dernières news dans l’ordre tous flux confondus

[/cc]
J’ai mis en clé du tableau le timestamp de la publication de la news (dans l’absolu, si 2 news avaient la même date la 2ème écraserait l’autre…)

Parle mon lapin

Il ne reste plus qu’à donner la parole à votre lapin, comme vu dans l’article précédent

[cc lang=’php’ width=’100%’]
include(‘nabClass.php’);
$serial = « **** »;
$token = « **** »;

$nabaztag = new nabaztag($serial,$token);
$phrase = «  »;
foreach($tabNewRSS as $final){
$phrase .= $final. ». « ;
}

$phrase = html_entity_decode($phrase);

if ($phrase){
$nabaztag->speak(utf8_encode($phrase));
}

$nabaztag->display_api_response();

[/cc]

Vous pouvez tester le résultat ici
A noter que ce script envoi à votre Nabaztag les infos à un instant T, mais on pourrait très facilement recréer un nouveau fichier RSS à partir de $tabNewRSS pour le soumettre à l’interface de Violet, ainsi votre Lapin vous tiendrait au courant au fur et à mesure des nouvelles informations…

Générer un nouveau flux RSS

Le but est de soumettre à l’interface de violet la page qui va générer le flux RSS qui mixe les flux de notre Google Reader.
Première chose, indiquez que le résultat sera du XML, avec la balise Header
[cc lang=’php’ width=’100%’]
header(« Content-Type: text/xml;charset=utf-8 »);
[/cc]
Ensuite, au lieu d’envoyer le texte au Nabaztag, nous allons générer un flux RSS à partir du tableau $tabNewRSS que nous avons créé ci-dessus.

[cc lang=’php’ width=’100%’]
$rss = ‘< ?xml version="1.0" encoding="utf-8"?>‘;
$rss .= ‘‘;
$rss .= « « ;
$rss .= « Mon Google Reader RSS« ;
$rss .= « http://blog.yann.info« ;
$rss .= « Compilation de mes flux Google Reader« ;
$rss .= « fr-FR« ;

foreach($tabNewRSS as $final){
$rss .= « « ;
$rss .= «  » . clean($final) . « « ;
$rss .= « http://blog.yann.info« ;
$rss .= « « .date(« D, d M Y H:i:s »). »« ;
$rss .= « « ;
$rss .= « 
« ;
}

$rss .= « « ;
$rss .= « « ;
echo $rss;
[/cc]
Pour voir un exemple de ce que ça peut donner cliquez ici
Le résultat est un nouveau flux RSS, que vous pouvez soumettre à l’interface Violet. Les news sont à chaque fois régénérées donc votre lapin ne vous donnera que les dernières news dès qu’il y aura du nouveau.
Comme le lapin ne lira que le titre du RSS je n’ai rempli que cette partie dynamiquement.

[cc lang=’php’ width=’100%’]
function clean($titre) {
return utf8_encode(htmlspecialchars(stripslashes($titre)));
}
[/cc]

Version bureau | Passer à la version mobile