Des fils RSS sur mesure dans eZ Publish

Ce billet aurait pu s'appeler RSS and eZ Publish on Steroïd ou bien RSS ou autres exports de contenu avec eZ Publish ou encore Utilisation de différents layouts dans eZ Publish ... La technique présentée dans ce billet a été inspirée par le message de Bertrand Danes sur le forum eZ Publish France et pour certains points techniques par l'extension Google Sitemap de Sergey Shishkin qui utilise aussi ce mécanimse.

Depuis un moment, j'avais envie de gérer plus finement et d'étendre les flux RSS sur pwet.fr (et maintenant sur t-ka.net :-)). Les principaux problèmes étant pour moi l'impossibilité de changer l'URL des items et l'impossibilité d'aggréger plusieurs attributs dans la balise description. Il est à noter aussi qu'eZ Publish n'inclut pas l'élément <guid> dans les flux RSS, ce qui empêche la détection correcte de mises à jour par les lecteurs RSS. J'avais aussi écrit un petit patch pour pouvoir inclure un feuille de style XSLT dans les fils RSS pour eZ Publish 3.8.x, mais l'utilisation d'un layout et du système de template pour créer des fils RSS rend complètement obsolète le patch en question... Et puis j'ai un petit projet personnel en tête qui devrait utiliser assez intensivement cette technique, enfin si il se concrétise un jour...

Pour en revenir, à cette technique, elle est assez simple à mettre en oeuvre ( easy comme toujours ;-)). Il suffit de créer un layout spécifique pour le RSS. Mais qu'est ce qu'un layout ? Il s'agit en fait de spécifier quel fichier est utilisé comme template de pagelayout. On peut aussi le faire avec une règle d' override , mais dans le cas d'un layout, il est également possible de spécifier le "Content-Type" que générera celui-ci. Dans le cas de mes fils RSS, mon layout.ini.append.php contient une section qui ressemble à :

[rss]
PageLayout=rss_pagelayout.tpl
ContentType=text/xml 

Ces lignes signifient que les pages appelées via l'URL /layout/set/rss/ utiliseront comme template pagelayout le fichier design/<mon_design>/templates/rss_pagelayout.tpl et tout cela générera du XML. Le fichier en question est très simple et on retrouve le point central des pagelayout traditionnels (si je puis dire...) :

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
        <channel>
                <language>fr-FR</language>
                {$module_result.content}
        </channel>
</rss>

Appeler l'URL /layout/set/rss/ revient à appeler le vue full du noeud racine dans ce pagelayout, ce qui donnera probablement des résultats bizarres. Il est par contre tout à fait possible d'appeler une vue personnalisée (au hasard rss_full) sur un noeud quelconque (par exemple 119) via l'URL /layout/set/rss/content/view/rss_full/119. Il reste alors à faire en sorte que design/<mon_design>/templates/node/view/rss_full.tpl et ses éventuels override génèrent du RSS et le tour est joué ! Pour améliorer les performances, il vaut mieux rajouter cette vue dans la liste des vues à mettre en cache dans le paramètre CachedViewModes dans la section ContentSettings dans le site.ini.append.php des siteaccess concernés.

Pour aller encore plus loin, on peut enfin utiliser le traducteur d'URL d'eZ Publish pour donner des adresses plus sympas aux fils voire permettre l'utilisation d'un node_id en paramètre pour avoir des fils RSS "automatiques". Par exemple, le fils RSS des commentaires du billets où je parlais de l'inclusion de vidéo de Dailymotion ou de Youtube dans eZ Publish via un custom tag est disponible à l'adresse : http://pwet.fr/rss/feed/commentaires/64219 qui correspond en fait à http://pwet.fr/layout/set/rss/content/view/rssco/64219. Il ne reste donc plus qu'à adapter les templates pour ajouter les liens vers ces fils RSS pour les rendre disponibles.

Tags : XML, XSLT, eZ Publish, Truc, RSS, Blog

Un script shell pour compter le nombre de pages indexées dans Yahoo

Toute ressemblance avec un script déjà existant et publié sur ce site n'est PAS fortuite :). C'est la suite logique du Script shell pour compter le nombre de pages indexées dans Google et c'est encore plus simple puisqu'ici point de requête POST en XML mais une seule requête HTTP avec wget et il n'y a plus qu'à passer le résultat dans du XSLT avec xsltproc et c'est fini. La seule subtilité réside dans la définition d'un espace de nom pour l'espace de nom par défaut des résultats de Yahoo. Le script est le suivant, il suffit de renseigner la variable APPID avec un identifiant d'application créer chez Yahoo! et ça devrait marcher.

#! /bin/sh
 
XSLT='<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:y="urn:yahoo:srch" version="1.0">
<xsl:output omit-xml-declaration="yes" /> 
<xsl:template match="/">
<xsl:value-of select="y:ResultSet/@totalResultsAvailable" />
</xsl:template>
</xsl:stylesheet>'
 
TMP_XML="/tmp/yahoo.xml"
TMP_XSL="/tmp/yahoo.xsl"
APPID="VOTRE_APP_ID_YAHOO"
URL="http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=$APPID&results=1"
 
if [ $# -ne 1 ] ; then
    echo "`basename $0` domaine.com"
    echo -e "    compte le nombre de résultats dans Yahoo Search pour domaine.com"
    exit 1
fi
 
QUERY="$URL&query=site:$1"
echo $XSLT > $TMP_XSL
 
wget --quiet "$QUERY" -O "$TMP_XML"
echo -n "`date +%Y-%m-%d` "
xsltproc "$TMP_XSL" "$TMP_XML"
rm -f "$TMP_XML" "$TMP_XSL"

Ce script me permettra de comparer la vitesse à laquelle ces moteurs indexent mon site. Actuellement ces scripts donnent le résultat suivant :

> tigrou@Lorien[192.168.0.243]:~$ ./google_count.sh pwet.fr
2006-09-05 662
> tigrou@Lorien[192.168.0.243]:~$ ./yahoo_count.sh pwet.fr
2006-09-05 621

J'espère pouvoir faire la même chose pour MSN Search, mais il semble que pour utiliser l'API MSN, il faut pouvoir installer un .msi ce qui sous Ubuntu n'est pas gagné d'avance, mais je vais enquêter.

Un script shell pour compter le nombre de pages indexées dans Google

Comme je l'ai écrit dans mon premier billet, ce site me sert de laboratoire de tests. Mon premier test va être d'observer comment Google (et les autres) indexe ce site. Pour cela, il suffit d'écrire un script qui sera lancé tous les jours à l'aide d'un crontab sur un serveur.

Ma première idée pour atteindre ce but était d'écrire un simple script shell qui utiliserait wget pour récupèrer la première page de résultats et n'en prendre que la partie qui m'intéresse à l'aide sed et d'une expression rationnelle adéquate. Mais après une petite réflexion et la lecture des conditions d'utilisation de Google, il est interdit d'utiliser Google de manière automatique. Petite note en passant, Google interdit l'accès à ses pages à wget lorsque celui-ci utilise son user agent par défaut...

Finalement, la solution est d'utiliser la fameuse API SOAP de Google avec un clef valide (c'est gratuit et mais limité à 1000 requêtes/jour). Cette solution est légèrement plus complexe que la précédente, il faut juste trouver le moyen d'envoyer une requête HTTP POST contenant une requête SOAP bien formée et ensuite analyser le document XML retourné pour en extraire le nombre de résultats. Le requête est effectuée à l'aide curl qui est un outil capable de transfèrer des données sur plusieurs protocoles dont le protocole HTTP. Ensuite les données du XML sont analysées à l'aide d'une feuille XSLT et de xsltproc. Le but final étant de tracer une courbe à l'aide de plot, il reste à dater l'enregistrement.

Ce qui donne le script suivant :

#! /bin/sh
 
XML='<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/1999/XMLSchema">
  <SOAP-ENV:Body>
    <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch" 
         SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <key xsi:type="xsd:string">%s</key>
      <q xsi:type="xsd:string">%s</q>
      <start xsi:type="xsd:int">0</start>
      <maxResults xsi:type="xsd:int">10</maxResults>
      <filter xsi:type="xsd:boolean">true</filter>
      <restrict xsi:type="xsd:string"></restrict>
      <safeSearch xsi:type="xsd:boolean">false</safeSearch>
      <lr xsi:type="xsd:string"></lr>
      <ie xsi:type="xsd:string">latin1</ie>
      <oe xsi:type="xsd:string">latin1</oe>
    </ns1:doGoogleSearch>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>'
 
XSLT='<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
                xmlns:xsd="http://www.w3.org/1999/XMLSchema"
                xmlns:ns1="urn:GoogleSearch">
<xsl:output omit-xml-declaration="yes" /> 
<xsl:template match="/SOAP-ENV:Envelope">
<xsl:value-of select="SOAP-ENV:Body/ns1:doGoogleSearchResponse/return/estimatedTotalResultsCount/text()" />
</xsl:template>
</xsl:stylesheet>'
 
TMP_XSL="/tmp/google.xsl"
TMP_XML="/tmp/google.xml"
KEY="VOTRE_CLEF_GOOGLE"
URL="http://api.google.com/search/beta2"
 
if [ $# -ne 1 ] ; then
    echo "`basename $0` domaine.com"
    echo -e "    compte le nombre de résultats dans Google pour domaine.com"
    exit 1
fi
 
QUERY="site:$1"
echo $XSLT > $TMP_XSL
SOAP=$(printf "$XML" "$KEY" "$QUERY")
curl -H "Content-Type: text/xml" -d "$SOAP" $URL > /tmp/google.xml 2> /dev/null
echo -n "`date +%Y-%m-%d` "
xsltproc "$TMP_XSL" "$TMP_XML"
rm -f "$TMP_XSL" "$TMP_XML"

Il ne reste plus qu'à configurer la tâche planifier et à atteindre quelques jours pour pouvoir tracer un joli graphique. Ce script a été testé sur Debian Sarge et Ubuntu Dapper Drake, mais devrait fonctionner sans aucun problème avec toute version relativement récente de curl et xsltproc, pour les installer il suffit de taper :

sudo apt-get install xsltproc curl

Pour le moment, ce script donne le résultat suivant :

> tigrou@Lorien[192.168.0.243]:~$ ./google_count.sh pwet.fr
2006-09-02 30

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.