Liste des inscrits sur un réseau MediaWiki
Cet article présente une application simple de gestion d'un ensemble de wikis opérés par MediaWiki. Cette application fusionne les listes des inscrits à un réseau de wikis.
Pas trop complexe à mettre en œuvre, elle peut constituer un exercice pratique dans un contexte pédagogique.
Une solution plus simple consiste à utiliser l'API de MediaWiki.
Sommaire
Le problème
Nous prendrons le réseau Wicri comme cadre d'application. Il est constitué d'un ensemble de wikis qui tournent avec MediaWiki. Sur chacun d'eux, il est possible de connaître la liste des inscrits en sélectionnat l'onglet "liste des inscrits" accessible par l'élément "Pages spéciales" du cartouche "boïte à outils"[1].
Chaque wiki possède sa propre liste : comment calculer, sur le réseau Wicri, une liste de personnes inscrites au moins à un wiki ?
Contexte de cette application
Aspects techniques
Cette application est réalisée à partir d'une configuration Unix connectée à Internet. Elle utilise essentiellement des commandes unix de base (lex, sort, wc) et la commande cURL. Elle peut être réalisée à partir de n'importe quel machine disposant d'un système Linux ou d'un Macintosh sous Mac Os X (Léopard)[2]
Aspects pédagogiques
Cet exemple demande les connaissances préalables suivantes :
- Notions sur l'administration de MediaWiki et sur les réseaux de wikis ;
- Savoir analyser un code html un peu complexe ;
- Notions élémentaires sur le langage C et introduction à lex ;
- Avoir assimilé la notion de pipe sur Unix.
Collecte des données
La collecte des pages html peut se faire en utilisant les commandes "Enregistrer sous" du navigateur positionné sur une page liste des utilisateurs permet de sauvegarder une page html contenant une liste.
Pour des opérations répétitives la commande cURL permet d'automatiser la collecte.
Pour visualiser le code html de la liste du Wiki Sols Urbains en français, il suffit de faire[3] :
WICRI_SOL_FR=http://maquettewicri.loria.fr/fr.wicri-t-sols_urbains/index.php5
curl $WICRI_SOL_FR?title=Sp%C3%A9cial:Liste_des_utilisateurs
Extraction des données
Pour extraire les données, nous utiliserons l'analyseur lexical lex[4].
Analyse des pages HTML contenant des listes d'utilisateurs
Les pages contenant les listes d'inscrits (ou d'utilisateur) ont une structure relativement simple où l'information essentielle est contenue dans une liste <ul>
.
Plus précisément, pour atteindre un nom dans une liste il faut franchir les balises html :
<html>
<body>
<ul>
<li>
<a href="...">
En utilisant lex, nous allons générer un analyseur lexical qui va extraire les identifiants des utilisateurs. Lex fonctionne avec des « états » qui permettent d'appliquer des stratégies différentes suivant les contextes. Ici, nous considèrerons les états suivants:
- BODY
- Cet état est activé à la rencontre de la balise «
body
» - Il comporte une seule règle pour repérer la balise «
ul
» - UL
- Cet état est activé, à partir de l'état BODY à la rencontre de la balise «
ul
» - Il comporte une seule règle pour repérer la balise «
li
» » et une autre pour sortir de cet état (à la rencontre de «</ul>
») - LI
- Cet état ne comporte qu'une seule règle pour repérer la première balise «
<a ... >
» qui encapsule l'identification de l'utilisateur. - A
- Cet état ne comporte qu'une seule règle pour repérer la fin de la balise a qui précède la zone d'identification de la personne (IDENT).
- IDENT
- Dans cet état tous les caractères entrants sont recopiés jusqu'à l'apparition d'un caractère «
<
» qui matérialise la fin de la zone (on repasse alors directement dans l'état UL en attente de la prochaine balise «li
».
le programme lex
%{
#include <stdio.h>
#include <stdlib.h>
%}
%START BODY
%START UL
%START LI
%START A
%START IDENT
%%
"<body" BEGIN BODY;
<BODY>"<ul>" BEGIN UL;
<UL>"<li>" BEGIN LI;
<UL>"</ul" BEGIN 0;
<LI>"<a " BEGIN A;
<A>">" BEGIN IDENT;
<IDENT>"<" {putchar('\n'); BEGIN UL;}
<IDENT>. ECHO;
. ;
\n ;
%%
main()
{
BEGIN 0;
yylex();
}
Compilation du programme lex
Si le fichier source a été sauvegardé dans le fichier extractionInscrits.lex, la compilation se réduit à :
lex extractionInscrits.lex
gcc lex.yy.c -ll -o extractionInscrits
Test d'exécution
Pour obtenir la liste des incrits à ce wiki, il faut faire :
TICRI_OUTILS=http://maquettewicri.loria.fr/ticri-outils/index.php5
curl $TICRI_OUTILS?title=Special:Liste_des_utilisateurs \
| ./extractionInscrits \
| sort -u
Application complète
Le shell de collecte
La difficulté consiste à vérifier les URL, wiki par wiki, compte tenu des spécificités propres à chaque version de MediaWiki. Il faut également adapter le paramétrage du nombre d'extraction à chaque wiki.
Enfin, une difficulté syntaxique consiste à inhiber les perluètes (&) par un back-slash.
{
WICRI_SOL_FR=http://maquettewicri.loria.fr/fr.wicri-t-sols_urbains/index.php5
WICRI_SOL_EN=http://maquettewicri.loria.fr/en.wicri-t-sols_urbains/index.php5
curl $WICRI_SOL_FR?title=Sp%C3%A9cial:Liste_des_utilisateurs 2> /dev/null
curl $WICRI_SOL_EN?title=Special:ListUsers 2> /dev/null
TICRI_OUTILS=http://maquettewicri.loria.fr/ticri-outils/index.php5
curl $TICRI_OUTILS?title=Special:Liste_des_utilisateurs 2> /dev/null
WICRI_FR=http://maquettewicri.loria.fr/fr.wicri/index.php5
curl $WICRI_FR?title=Special:Liste_des_utilisateurs\&limit=100 2> /dev/null
TICRI_FR=http://maquettewicri.loria.fr/fr.ticri/index.php5
curl $TICRI_FR?title=Special:Liste_des_utilisateurs\&limit=100 2> /dev/null
}
Si ce shell est sauvegardé dans le fichier WicriGetInscrits.sh
, on a intérêt à ranger son résultat dans un fichier, comme par exemple :
sh WicriGetInscrits.sh > WicriListeInscrits.html
Exécution
Pour connaître la liste des utilisateurs, il faut faire :
./extractionInscrits < WicriListeInscrits.html | sort -u
Et pour avoir simplement leur nombre :
./extractionInscrits < WicriListeInscrits.html | sort -u | wc
Voir aussi
Notes et références
- ↑ Dans ce paragraphe les liens pointent vers les pages de ce wiki.
- ↑ La commande cURL est opérationnelle sur une configation type MacBook en installant le disque 2.
- ↑ La déclaration de la variable shell
WICRI_SOL_FR
a été introduite pour une simple raison de lisibilité - elle n'est pas indispensable en pratique. - ↑ On peut naturellement essayer d'utiliser un filtre XML comme Python ou basé sur Wpath ou Xslt. Les pages générées par MediaWiki n'étant pas forcément bien formées, cette approche peut poser problème.