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&#39;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&#39;accueil
contextual_url3:    20050430-afficher-les-x-derniers-billets-de-dotclear-en-page-daccueil

<p>Comme <a href="https://larlet.fr/david/biologeek/archives/20050206-mises-a-jour-du-site/">promis</a>, je vais détailler un peu l'installation du <a href="http://magpierss.sourceforge.net/">parser <abbr title="RDF Site Summary">RSS</abbr> PHP</a> de Magpie. Je n'ai pas trouvé beaucoup de documentation en français sur le net, si ce n'est sur le <a href="http://www.dotclear.net/forum/">forum de Dotclear</a> :). Je tiens à rappeler en guise de préambule qu'il existe un <a href="http://home.gna.org/rssreaderdc/">plugin RSS Reader</a> si vous souhaitez afficher les billets sur votre blog qui, associé au <a href="http://zeubeubeu.net/blog/2005/02/08/922-plugin-related-045">plugin related</a>, permet aussi d'afficher ces liens sur des pages externes au site mais conservant la même structure comme l'ont fait <a href="http://www.brindilles.net/lune/index.php?2004/12/14/1231-combiner-deux-plug-ins-de-dotclear-lagglutineur-de-news">Lithium</a> ou <a href="http://s.billard.free.fr/dotclear/?2005/01/10/102-mon-aggregateur-perso">Sébastien Billard</a>.</p>

<h2>Installation</h2>

<p>Commencez par <a href="http://sourceforge.net/project/showfiles.php?group_id=55691">télécharger l'archive</a> présente sur le site de MagpieRSS. L'archive contient pas mal de fichier mais seuls quelques uns doivent être placés sur votre <abbr title="File Transfer Protocol">FTP</abbr>&nbsp;:</p>
<ul>
<li><strong>rss_cache.inc</strong>, <strong>rss_fetch.inc</strong>, <strong>rss_parse.inc</strong> et <strong>rss_utils.inc</strong> dans le dossier <strong>magpierss</strong> où vous souhaitez installer votre page (/liens/magpierss/ sur ce site)</li>
<li><strong>Snoopy.class.inc</strong> dans le dossier <strong>extlib</strong>, lui-même dans le dossier <strong>magpierss</strong> (/liens/magpierss/extlib/ sur ce site)</li>
</ul>
<p>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.</p>


<p><strong>[Mise à jour]</strong>&nbsp;: suite à un judicieux commentaire de <strong>darn</strong>, je vous rappelle (ou vous apprend) qu'il ne faut pas laisser des extensions de fichiers <strong>.inc</strong> à vos fichiers d'inclusion en <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> donc la solution généralement adoptée est de rajouter un <strong>.php</strong> à votre fichier donc ici par exemple <strong>rss_cache.inc</strong> deviendra <strong>rss_cache.inc.php</strong>, 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&nbsp;? Tout simplement car les serveurs sont configurés pour interpréter du <strong>.php</strong> mais pas du <strong>.inc</strong> 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&nbsp;? :)</p>



<h2>Utilisation</h2>

<p>Voila le script commenté tel qu'il est implémenté dans mon <strong>index.php</strong>&nbsp;:</p>

<pre>
<code>&lt;?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-&gt;items))
    {
	// on coupe le tableau en fonction du nombre de billets à afficher
	$items = array_slice($rss-&gt;items, 0, $nb_items_affiches);
	
       // on affiche le titre du blog en question et on fait un lien dessus
	echo "&lt;h1&gt;&lt;a 
		href=\"".$rss-&gt;channel['link']."\" 
		title=\"".$rss-&gt;channel['tagline']."\"&gt;" 
		.$rss-&gt;channel['title']."&lt;/a&gt;&lt;/h1&gt;";
	
	// ces lignes ne concernent que ce blog mais c'est pour avoir
	// un exemple de ce que qu'on peut faire...
	echo "&lt;div lang=\"fr\"&gt;";
	echo "&lt;img 
		src=\"logo_".substr($rss-&gt;channel['link'],7,7).".png\" 
		alt=\"".$rss-&gt;channel['title']."\" 
		class=\"vignette\" 
		title=\"".$rss-&gt;channel['tagline']."\"
		 /&gt;";
	echo "&lt;ul&gt;";
	
	// 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 "&lt;li&gt;&lt;a href=\"$href\"&gt;$title&lt;/a&gt;";
	  if($jour != '')
	    echo " publi&amp;eacute; le $jour/$mois &amp;agrave; $heure h $minute";
	  if($resume != '...')
	    echo "&lt;br /&gt;&lt;span&gt;$resume&lt;/span&gt;";
	  echo "&lt;/li&gt;";
	}
	echo "&lt;/ul&gt;&lt;/div&gt;";
    }
    else
    {
	echo "Cette erreur signifie en bon fran&amp;ccedil;ais que le fil RSS "
		.$url." n'a pas pu &amp;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 &lt; count($tab_rss) ; $i++ )
{
	parse_rss($tab_rss[$i]);
}
?&gt;</code>
</pre>

<p>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.</p>


<h2>Applications possibles</h2>


<h3>Feed on Feeds</h3>

<p>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 <a href="http://minutillo.com/steve/feedonfeeds/">Feed on Feeds</a> qui est aussi basé sur Magpie <abbr title="RDF Site Summary">RSS</abbr>, ça marche bien j'ai testé :).</p>


<h3>Planet.ubuntu-fr.org&nbsp;?</h3>

<p>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 <abbr title="RDF Site Summary">RSS</abbr> 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&nbsp;!</p>
