Liste des inscrits sur un réseau MediaWiki

De Wicri Outils

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.

Le problème

Wiki Base (outils pour la maintenance du réseau Wicri)Wicri/Outils (outils logiciels pour le réseau Wicri et les Ticri)Wicri/MétadonnéesWicri/Wicri tête du réseau Wicri (Wikis des communautés de la recherche et de l'innovation)Wicri (pool) - ressources multimédiaWicri/ManuelsWiki régional : Wicri AlsaceWiki régional : Wicri LorraineIncubateur Wicri : version françaiseQuel sera le nouveau wiki ? réponse : le wiki TerreWiki thématique Ticri (technologies de l'information communication pour les communautés de la recherche et de l'informationWiki thématique : Bois et forêtsWiki thématique : BiomasseWiki thématique : EauWiki thématique : Sols urbainsWicriReseauFrAvril2010.png

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

  1. Dans ce paragraphe les liens pointent vers les pages de ce wiki.
  2. La commande cURL est opérationnelle sur une configation type MacBook en installant le disque 2.
  3. 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.
  4. 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.