Wikipédia:Technique des bots

Un article de Wikipédia, l'encyclopédie libre.

Raccourci [+]
WP:TB

Un bot interagit habituellement avec Wikipédia selon le protocole HTTP. Sont reportées ici des indications sur le fonctionnement des bots.

Sommaire

[modifier] Aperçu général

Un bot se comporte schématiquement comme un utilisateur lambda : en visitant les pages, il adresse des requêtes HTTP, qui sont d'habitude gérées par le navigateur du visiteur. Le bot doit, pour chaque requête HTTP effectuée, envoyer un en-tête (header) contenant un champ User-Agent non nul, sous peine de se voir refuser l'accès à Wikipédia. On pourra y inscrire le nom du bot, par exemple.

[modifier] Fonctionnement

[modifier] S'identifier

[modifier] Requête

Il faut envoyer une requête HTTP de type POST à http://fr.wikipedia.org../../../../index.php?title=Special:Userlogin&action=submitlogin

Elle doit comprendre :

  • le nom d'utilisateur dans le champ wpName ;
  • le mot de passe dans le champ wpPassword ;
  • « 1 » dans le champ wpRemember,
  • « Identification » dans le champ wpLoginattempt.

Pour vérifier que l'identification a réussi, on teste l'absence d'un élément possédant l'id="userloginForm".

[modifier] Cookies

Le serveur renvoie alors un en-tête (header) contenant un champ set-Cookie. Il faut l'enregistrer intact et le retourner à chaque requête GET ou POST envoyée au serveur dans le champ cookie.

On peut gérer les cookies automatiquement en utilisant les méthodes d'un paquetage de gestion de requêtes HTTP (par ex. en perl LWP::UserAgent).

[modifier] Identifiant de session

À la première obtention de page, il faut récupérer l'edittoken. C'est un paramètre essentiel qui devra être donné à chaque soumission d'article. On le trouve en valeur de l'attribut value d'une balise input de name="wpEditToken" dans le résultat de la requête

[modifier] Obtenir un article

[modifier] Méthode

Un bot accède à la source wiki des pages par l'intermédiaire d'une requête HTTP de type GET sur le formulaire d'édition à l'adresse http://fr.wikipedia.org../../../../index.php?title=Titre_de_la_page&action=edit

Après avoir récupéré le résultat de la requête, le bot doit en extraire le texte contenu entre les balises <textarea> et </textarea>. Un paramètre important doit être récupéré, le timestamp de l'article au moment de la modification, car il faut le renvoyer au moment de la soumission d'une version révisée (c'est lui qui permet au serveur de gérer les conflits de versions). On le trouve en valeur de l'attribut value d'une balise input de name="wpEdittime" dans le résultat de la requête.

[modifier] Conseils pratiques

Pour récupérer le corps de l'article et les paramètres, les expressions rationnelles ou un parseur XML peuvent être utilisés.

Pour savoir si un article est protégé en écriture, on peut tester la présence de l'attribut readonly en attribut de la balise textarea

[modifier] Poster un article

Cela se fait en envoyant une requête HTTP de type POST à l'adresse http://fr.wikipedia.org../../../../index.php?title=Titre&action=submit

Pour un bot possédant un compte utilisateur, elle doit comprendre au minimum :

  • le corps de l'article dans le champ wpTextbox1 ;
  • le timestamp de l'article à modifier dans le champ wpEdittime (il est récupéré lors de l'obtention de la page à modifier) ;
  • le timestamp du début de la modification dans le champ wpStarttime (également récupéré lors de l'obtention de la page à modifier. S'il n'est pas présent, on ne peut pas sauvegarder une page qui a été supprimée) ;
  • l'edittoken de la session en cours dans le champ wpEditToken (il est récupéré lors de l'obtention d'une page après l'ouverture de la session).

D'autres paramètres importants sont :

  • le résumé de modification dans le champ wpSummary ;
  • le caractère mineur ou non dans le champ wpMinoredit ;
  • l'inclusion ou non de la page de la liste de suivi dans le champ wpWatchthis.

Pour tester le succès de la soumission, on peut tester l'absence d'une balise textarea dans la réponse à la requête HTTP. En cas de présence du textarea, cela peut être dû soit à un conflit de versions (il faut reprendre « obtenir un article » à partir de la réponse à la requête.), soit à la perte de l'identifiant de session (il faut se déconnecter et se reconnecter).

[modifier] Exemples

[modifier] Exemple en Python

Ce script très simple en Python lit cette page et extrait l'article. Il n'écrit rien et vous pouvez l'essayer sans risque :

# -*- coding: utf-8  -*-
 
# Simplet Bot - le bot très basique pour Wikipedia
# Utilisateur:Dake - 2005/2006
# (code sous license GPL)
 
import httplib
import re
 
# préparation URL
conn = httplib.HTTPConnection('fr.wikipedia.org')
 
# "raw" indique que l'on ne veut que l'article au format Wiki, pas l'html du reste de la page
conn.request('GET', "/w/wiki.phtml?title=Wikip%C3%A9dia:Technique_des_bots&action=raw")
 
# pour récupérer l'html, la requête sera comme suit : 
# conn.request('GET', "/w/wiki.phtml?title=Wikip%C3%A9dia:Technique_des_bots&action=edit")
 
# connexion serveur et lecture
reponse = conn.getresponse()
article = reponse.read()
 
print article
 
# fin connexion
conn.close()

[modifier] Exemple en C#

Ce programme en C# ne fait que lire et afficher une page en mode console. Il n'écrit rien sur le serveur et peut être utilisé sans risques.

// Simplet Bot - le bot très basique pour Wikipedia
// Utilisateur:Dake - 2006
// (code sous license GPL)
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
 
namespace SimpletBot {
    class Program {
        static void Main(string[] args) {
 
            string url = "http://fr.wikipedia.org/w/wiki.phtml?title=Wikip%C3%A9dia:Technique_des_bots&action=raw";
 
            // connexion au serveur
            // nb. le serveur de Wikipédia refuse les connexions sans le champ "UserAgent"
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
            request.UserAgent = "Simplet-Bot";
 
            // lancement de la requête
            HttpWebResponse response = (HttpWebResponse) request.GetResponse();
 
            // lecture du résultat
            Stream outputStream = response.GetResponseStream();
 
            // affichage sur la console
            StreamReader reader = new StreamReader(outputStream, System.Text.Encoding.UTF8);
            Console.Write(reader.ReadToEnd());
            reader.Close();
 
            // fermeture du résultat
            outputStream.Close();
        }
    }
}

[modifier] Exemple plus complexe

Voir Simplet-Bot, un bot en Python qui lit une liste d'articles récents d'un portail, se connecte avec un nom d'utilisateur et enregistre les 10 articles les plus récents dans une page. Le bot a été volontairement simplifié et ne prend pas en charge toutes les subtilités de MediaWiki (messages d'erreurs, conflit d'édition, etc.). Pour des opérations plus complexes, se référer au code de Aide:Pywikipedia.