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 entê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] Obtenir un article
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 :
- wiki.phtml?title=Titre&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>, ainsi que le timestamp (wpEdittime) de l'article, qui devra être retourné au serveur intact pour valider la modification de l'article.
Pour ce faire, les expressions régulières ou un parseur XML peuvent être utilisés.
[modifier] Poster un article
Il suffit d'envoyer une requête HTTP de type POST à :
- wiki.phtml?title=Titre&action=submit
Elle doit comprendre au minimum :
- le corps de l'article dans le champ wpTextbox1 ;
- le timestamp de l'article dans le champ wpEdittime.
Le timestamp d'un nouvel article est vide (""). Les autres informations (wpEditToken etc.) peuvent également être renvoyées, dans le cas où le bot est loggué après identification.
[modifier] S'identifier
Il faut envoyer une requête HTTP de type POST à :
- wiki.phtml?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.
Le serveur renvoie alors un entê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.
[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 PyWikipedia.