title: ★ Magpie RSS, installation et utilisation(s) en tout genre du parser PHP slug: magpie-rss-installation-et-utilisations-en-tout-genre-du-parser-php date: 2005-02-09 17:46:05 type: post vignette: images/logos/miss_magpie.png contextual_title1: myOpenID propose des solutions intéressantes contre le phishing contextual_url1: 20070418-myopenid-propose-des-solutions-interessantes-contre-le-phishing contextual_title2: ★ Comment utiliser OpenID, la solution d'identification tant attendue contextual_url2: 20070104-comment-utiliser-openid-la-solution-d-identification-tant-attendue contextual_title3: Afficher les x derniers billets de Dotclear en page d'accueil contextual_url3: 20050430-afficher-les-x-derniers-billets-de-dotclear-en-page-daccueil

Comme promis, je vais détailler un peu l'installation du parser RSS PHP de Magpie. Je n'ai pas trouvé beaucoup de documentation en français sur le net, si ce n'est sur le forum de Dotclear :). Je tiens à rappeler en guise de préambule qu'il existe un plugin RSS Reader si vous souhaitez afficher les billets sur votre blog qui, associé au plugin related, permet aussi d'afficher ces liens sur des pages externes au site mais conservant la même structure comme l'ont fait Lithium ou Sébastien Billard.

Installation

Commencez par télécharger l'archive présente sur le site de MagpieRSS. L'archive contient pas mal de fichier mais seuls quelques uns doivent être placés sur votre FTP :

En ce qui concerne la configuration, je ne me rappele plus très bien mais il me semble que je n'ai touché qu'au format d'export (UTF-8 dans mon cas) mais ça peut varier selon votre configuration de Dotclear notamment. Par défaut, le cache est généré pour une heure ce qui m'a semblé être un bon compromis entre actualisation/charge du serveur mais c'est paramétrable.

[Mise à jour] : suite à un judicieux commentaire de darn, je vous rappelle (ou vous apprend) qu'il ne faut pas laisser des extensions de fichiers .inc à vos fichiers d'inclusion en PHP donc la solution généralement adoptée est de rajouter un .php à votre fichier donc ici par exemple rss_cache.inc deviendra rss_cache.inc.php, il faut bien sûr modifier le code en conséquence (en gros faire un chercher/remplacer dans les quatre fichiers). Mais pourquoi ça pose un problème de sécurité au fait ? Tout simplement car les serveurs sont configurés pour interpréter du .php mais pas du .inc donc votre fichier pourra être lu par tous ce qui peut entraîner des problèmes de sécurité si vous avez stocké des informations sensibles (mots de passe, etc...), ce n'est pas le cas pour ces pages mais autant prendre tout de suite de bonnes habitudes, n'est-ce pas ? :)

Utilisation

Voila le script commenté tel qu'il est implémenté dans mon index.php :

<?php
  require_once('magpierss/rss_fetch.inc.php');

  /* 
  * fonction de parsing du fil RSS prennant en argument l'adresse du fil RSS,
  *  le nombre de billets à afficher (3 par défaut) ainsi que la taille du
  *  résumé des billets (300 caractères par défaut)
  */
  function parse_rss($url, $nb_items_affiches=3, $taille_resume=300)
  {
    $rss = fetch_rss( $url );
 	
    if (is_array($rss->items))
    {
	// on coupe le tableau en fonction du nombre de billets à afficher
	$items = array_slice($rss->items, 0, $nb_items_affiches);
	
       // on affiche le titre du blog en question et on fait un lien dessus
	echo "<h1><a 
		href=\"".$rss->channel['link']."\" 
		title=\"".$rss->channel['tagline']."\">" 
		.$rss->channel['title']."</a></h1>";
	
	// ces lignes ne concernent que ce blog mais c'est pour avoir
	// un exemple de ce que qu'on peut faire...
	echo "<div lang=\"fr\">";
	echo "<img 
		src=\"logo_".substr($rss->channel['link'],7,7).".png\" 
		alt=\"".$rss->channel['title']."\" 
		class=\"vignette\" 
		title=\"".$rss->channel['tagline']."\"
		 />";
	echo "<ul>";
	
	// pour chacun des billets on affiche le titre, 
	// la date et le résumé (s'ils sont disponibles)
	foreach ($items as $item) {
	  $href = $item['link'];
	  $title = $item['title'];

	  $mois = substr($item['dc']['date'],5,2);
	  $jour = substr($item['dc']['date'],8,2);
	  $heure = substr($item['dc']['date'],11,2);
	  $minute = substr($item['dc']['date'],14,2);

	  $resume = substr(strip_tags($item['content']['encoded']),0,$taille_resume)."...";
	  echo "<li><a href=\"$href\">$title</a>";
	  if($jour != '')
	    echo " publi&eacute; le $jour/$mois &agrave; $heure h $minute";
	  if($resume != '...')
	    echo "<br /><span>$resume</span>";
	  echo "</li>";
	}
	echo "</ul></div>";
    }
    else
    {
	echo "Cette erreur signifie en bon fran&ccedil;ais que le fil RSS "
		.$url." n'a pas pu &ecirc;tre obtenu dans les temps.";
    }
}

// création du tableau contenant les fils RSS
$tab_rss = array
(
	'http://exemple/de/lien/vers/un/contenu/rss/rss.php',
	'http://pour/pas/oublier/la/virgule/rss.php'
);

// on mélange un peu le tableau histoire que ce ne soit pas 
// toujours le même blog qui se retrouve en premier (facultatif)
srand((float)microtime()*1000000);
shuffle($tab_rss);

// on appelle la fonction décrite plus haut pour chacun des 
// fils RSS contenus dans le tableau mélangé
for( $i = 0 ; $i < count($tab_rss) ; $i++ )
{
	parse_rss($tab_rss[$i]);
}
?>

Il est rare que je détaille aussi précisément mon code alors j'espère que ça vous plaît :) C'est probablement optimisable, tout commentaire est le bienvenu.

Applications possibles

Feed on Feeds

Grâce à ce parser on peut réaliser son aggrégateur en ligne personnel à la manière d'un bloglines maison, c'est ce que fait Feed on Feeds qui est aussi basé sur Magpie RSS, ça marche bien j'ai testé :).

Planet.ubuntu-fr.org ?

En fait si je me suis autant pris la tête pour comprendre ce script c'est pour pouvoir l'utiliser dans le cas d'une aggrégation des fils RSS relatifs à ubuntu qui sont éparpillés un peu partout sur le net. Si plusieurs personnes sont partantes ça peut être intéressant, surtout que ce n'est pas très difficile à implémenter... à vous de jouer !