Récupérer des sites en flux RSS

Personnellement, j’utilise beaucoup les flux RSS pour suivre certains sites d’information, blogs ou forums, ça permet d’avoir un rapide coup d’œil sur ce qui pourrait m’intéresser, centralise le tout dans un seul logiciel et surtout ce logiciel s’occupe tout seul des mise à jours.

Malheureusement certains sites n’ont pas de flux, ou ne donnent que des versions courtes de leur articles, ce qui est leur choix, ça leur permet d’économiser la bande passante peut être ou oblige à passer sur leur site pour voir la pub qui va bien, alors bon je me suis pas vraiment posé la question (ou si mais j’y ai pas répondu) si j’avais le droit ou pas de passer outre la limitation, toujours est il que je le faisais au cas par cas, au bout de trois/quatre sites je me suis dit, essayons d’automatiser un peu tout ça.

Le principe est simple, le programme récupère une page avec la liste des articles et pour chacun d’entre eux, il récupère son adresse, télécharge sa page, récupère les informations telle que la date, l’auteur, le contenu à proprement dit et met le tout sous forme d’un fichier xml décrivant un flux RSS.

Cependant le principe a beau être simple, la sélection des informations se fait à l’aide d’expressions régulières et plus précisément à l’aide de sed, donc si vous y êtes réfractaires, ce qui va suivre peut choquer…

Alors, pour ceux qui sont restés, le script est configurable, chaque site correspond à un fichier qui définit comment récupérer les informations, pour l’exemple, je vais me baser sur le forum anglophone d’Archlinux qui ne propose pas de flux RSS.

EDIT: En fait, comme indiqué dans les commentaires, Archlinux utilisant un forum PunBB, ce dernier propose des flux, néanmoins, on n’a pas accès au contenu des posts, mais seulement aux titres des derniers sujets.

Nommons ce fichier arch.org:

# Fichier de configuration pour le flux du forum anglophone Archlinux.
RSS_URL="http://bbs.archlinux.org/"
BASE_URL="$RSS_URL/search.php?action=show_24h"
RSS_TITLE="Archlinux BBS"
RSS_DESCRIPTION="Archlinux BBS"
TZ_REMOTE="-0400"
SED_SELECT_URL=('/< \/tbody>/q' 's|.*\(viewtopic\?[^#]*#p[0-9]*\).*|'"$RSS_URL"'\1|p')

SED_ITEM_TITLE=('/» [^< ]\+<\/li>< \/ul>$/ { s/.*» \([^< ]\+\)<\/li>< \/ul>$/\1/p;q}')
SED_ITEM_AUTHOR=('/profile.php?/ { s|.*>\([^< ]*\).*|\1|p;q}')
SED_ITEM_DATE=('/

.*viewtopic.php/ {s/.*>\([^< ]\+\).*<\/a.*/\1/p;q}') SED_ITEM_CONTENT=('/class="postmsg"/,/<\/div>/ { /class="postmsg"/d;/^ *< \/div>/d; p}') pre_post () { POST_ID=${1#*#} SED_SELECT_ITEM=('/» [^< ]\+<\/li>< \/ul>$/ { p }' '/
/ { p }') } # La ligne suivante est là juste à cause du fait que wordpress rajoute des balises # (la flemme de chercher à contourner) #

Je vais pas ici détailler les expressions, sachez néanmoins qu’elles sont exécutées à l’aide de:

sed -n -e expr1 -e expr2

Pour ce qui est des variables:

  • RSS_URL: adresse du site.
  • BASE_URL: adresse de la page regroupant les articles (les derniers posts en ce qui concerne l’exemple)
  • RSS_TITLE: titre du flux
  • RSS_DESCRIPTION: description du flux
  • TZ_REMOTE: décalage horaire du site par rapport à UTC

Les variables commençant par $SED correspondent toutes à des listes d’expressions à passer à sed pour sélectionner un ou des éléments:

  • SED_SELECT_URL: les adresses des articles (posts)
  • SED_SELECT_ITEM: l’article avec toutes ses infos

Les expressions contenues dans les variables qui vont suivre s’appliquent à la partie de la page renvoyée par l’application de SED_SELECT_ITEM:

  • SED_ITEM_TITLE: titre de l’article
  • SED_ITEM_AUTHOR: auteur de l’article
  • SED_ITEM_DATE: date de l’article
  • SED_ITEM_CONTENT: contenu de l’article

La variable POST_ID contient quant à elle un identifiant permettant d’identifier (tiens donc…) de façon unique l’article, afin de ne pas re-télécharger sa page si on l’a déjà fait par le passé.
Il ne reste plus que la fonction pre_post() qui reçoit comme paramètre l’adresse de l’article et est exécutée avant le téléchargement de celui ci, pour le forum, on l’utilise pour définir l’id du post ainsi que l’expréssion pour le récupérer.

Récupérer le script grab.sh, et s’il est dans le même répertoire que arch.org:

./grab.sh arch.org

Si tout se passe bien, vous devriez avoir un répertoire:

/var/tmp/user_feed_cache-$USER/arch.org/

qui s’est créé avec dedans entre autre un fichier rss.xml que vous pouvez ouvrir avec votre agrégateur.

A partir de là, vous avez le choix de mettre des crontab pour mettre à jour le flux périodiquement ou si votre agrégateur le permet (liferea par exemple), renseignez lui la commande suivante:

/var/tmp/user_feed_cache-$USER/arch.org/grab.sh

( en modifiant $USER par le nom de votre utilisateur), et il s’occupera des mise à jours (ce script n’est créé que lors de la première exécution de grab.sh sans « -p »).

Par défaut, le script cherche les fichiers de configuration dans $HOME/.config/feed et dans le répertoire courant.

linuxplanet.com est un autre des sites pour lesquels j’utilise ce script dont voici le fichier de configuration: linuxplanet.
Voilà, il reste plus qu’à trouver les bonnes regexp :)

Commentaires (5)