Wikipédia:Technique des bots
Un article de Wikipédia, l'encyclopédie libre.
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.