« PageUpdaterBot » : différence entre les versions
(→Code) |
(→Code) |
||
Ligne 9 : | Ligne 9 : | ||
==Code== | ==Code== | ||
Version du 07.05.17 à 17:17 (commit : Regex correction) | Version du 07.05.17 à 17:17 (commit : Regex correction) | ||
< | <syntaxhighlight lang="python" line='line'> | ||
# coding: utf-8 | # coding: utf-8 | ||
import urllib | import urllib | ||
Ligne 421 : | Ligne 421 : | ||
pass | pass | ||
</ | </syntaxhighlight > | ||
Version du 7 mai 2017 à 15:22
Résumé des fonctionnalité
PageUpdaterBot est un robot qui s'occupe de compléter les différentes pages sur Wikipast à partir d'hyperliens. PageUpdaterBot vérifie que sur chaque page, les hyperliens mènent vers une page existante et que les entrées associées soient placées aux bons endroits. Si la page associée à l'hyperlien n'existe pas, PageUpdaterBot crée la page et place l'entrée associée dans cette page.
Description technique et discussion
PageUpdaterBot peut charger les pages à traiter de deux manières différentes, soit selon les dernières modifications, soit depuis le début, assurant de ce fait le traitement de toutes les pages. PageUpdaterBot commence par trier la page originale, si elle ne l'était pas encore. Puis PageUpdaterBot va analyser le contenu de la page entrée par entrée. Pour chaque entrée, le bot extrait les hyperliens qu'elle contient, en excluant la date et celui de la page en cours d'analyse. PageUpdaterBot va ensuite vérifier que chaque hyperliens redirige vers une page existante, que l'entrée existe bien dans cette page et qu'elle est placée au bon endroit. Afin de faciliter le traitement, un ID est associé à chaque entrée sous la forme d'un commentaire <!-- PUB METAINFOS : entryID = &beginID&69&endID& -->
placé à la fin de la ligne.
Dans le cas ou deux entrées sont présentes sous des formes différentes sur deux pages, la plus récente sera gardée. Les pages sont sélectionnées de la plus récente à la plus ancienne pour assurer que la modification la plus récente prime. Pour vérifier que les entrées sont les mêmes, leurs PUB_id sont comparés. Si une entrée de la page mère n'a pas de PUB_id, l'algorithme lui en donnera un, si une entrée de la page fille ne possède pas de PUB_id, la liste d'hyperliens et de références qu'elles contiennent est comparée, si une correspondance est trouvée, leurs identifiants seront mis à jour. Ce traitement peut être source d'erreur si un utilisateur maladroit modifie accidentellement le PUB_id à la fin de chaque entrée. Ce qui rend ce bot un peu vulnérable au mauvais comportement des utilisateurs. Un autre cas peut poser problème : dans le cas ou une section contient des entrées sous forme de liste, puis quelques paragraphes de textes, et enfin à nouveau une liste d'entrée. Le texte entre les deux listes sera effacé par le bot. Ce qui ne devrait pas poser trop de problèmes si les utilisateurs respectent la convention adoptée.
Code
Version du 07.05.17 à 17:17 (commit : Regex correction) <syntaxhighlight lang="python" line='line'>
- coding: utf-8
import urllib import requests import json import re from bs4 import BeautifulSoup
passw = 'hqk-NGF-S6z-qqF' baseurl = 'http://wikipast.epfl.ch/wikipast/' summary = 'Wikipastbot update'
user = 'PageUpdaterBot' #nom du bot HUBPage = baseurl + 'index.php/PageUpdaterBot' #Page contenant les méta information de PUB, notamment son compteur d'IDs. beginID = '&beginID&' endID = '&endID& -->' metaInfo = '") S'il n'y en a pas, retourne None, sinon retourne le PUBId (en string). S'il y en a plusieurs, il retourne le dernier.
@param content : String le contenu dans lequel trouver l'id. def getPUBId(content): return re.search(beginID + '(.*)' + endID, content).group(1)
Récupère tous les PUB_id
dans le contenu passé en argument.
(Un PUB_id a la forme suivante :
"")
S'il n'y en a pas, retourne un tableau vide.
@param content : String le contenu dans lequel trouver les ids. def getAllPUBIds(content): return re.findall(beginID + '(.*)' + endID, content)
Cette fonction va s'occuper d'aller sur la page
indiquée en argument et regarder si elle trouve le bloc
de méta information de PUB (bloc commençant par
"") ?
Il faut penser qu'on doit le mettre dans un endroit stratégique,
car il faudrait que si d'autres bots reprennent ou modifient des entrées,
ils conservent l'intégrité du PUB_id.
Cette fonction retournera une liste de String qui constituent les entrées retournées sous la forme montrée plus haut.
@param content : String le contenu de la page def parseEntries(content): lines = content.split('\n') newLines = [] for line in lines: if not line.isValidEntry(): newLines.append(line) #if a subtitle is found, abort if line.startswith('='): return newLines return newLines
Va mettre à jour le PUBId de l'entrée
passée en argument si Un PUBId est présent,
Sinon va ajouter ce PUBId à l'entrée
@param entry : String l'entrée biographie. @param PUBId : Int l'Id à mettre à jour sur cette page. def setPUBId(entry, PUBId): return entry+' '+entryMetaInfo+beginID+PUBId+endID
retourne une liste d'hyperLinks contenu
dans cette entrée sous une forme de liste
de String, mais en excluant de cette liste l'argument
toExclude.
def getHyperLinks(entry, toExclude):
hyperLinks = re.findall('\[\[(.*?)\]\]', entry)
hyperLinks = set(hyperLinks)
if toExclude in hyperLinks: hyperLinks.remove(toExclude)
return list(hyperLinks)
retourne une liste d'hyperLinks contenu
dans cette entrée sous une forme de liste
de String, mais en excluant de cette liste l'argument
toExclude.
def getReferences(entry):
return re.findall('\[(.*?)\]', entry)
Va créer une nouvelle page wikipast nommée selon
l'argument donné. Si cette page existe déjà, va
simplement retourner l'URL de la page. Autrement retourne
l'url de cette pas nouvelle créée.
@oaram name : String Le nom de la page à créer. def createNewPage(name): subtitleToAdd = payload={'action':'edit','assert':'user','format':'json','utf8':,'prependtext':subtitleToAdd,'summary':summary,'title':name,'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
Détermine si deux entrées sont identiques.
Pour ce faire on teste que
les dates, les lieux et la liste des hypermots
sont identiques.
(Pas de comparaison entre les PUBId!)
Si toutes les conditions énumérées ci dessus
sont satisfaites, alors on renvoit True,
autrement Talse.
@param entry1 : String La première entrée à comparer @param entry2 : String La seconde entrée avec laquelle on compare la première def areEntrySimilar(entry1, entry2): #la liste des hypermots inclus également la date listOfHyperLinks1 = getHyperLinks(entry1) listOfHyperLinks2 = getHyperLinks(entry2) listOfReferences1 = getReferences(entry1) listOfReferences2 = getReferences(entry2)
return (listOfHyperLinks1 == listOfHyperLinks2) and (listOfReferences1 == listOfReferences2)
Tri une liste d'entrée par ordre chronologique
@param listOfEntries : List(String)
La liste des entrées à trier
def sortEntries(listOfEntries):
return sorted(listOfEntries)
Va transformer une liste d'entrée
en un format que la page wikipédia en une seule
sting et retourner donc ces entrées
formatée en un seul bloc
@param entries : List(String) Les entrées nouvellement modifiées def unParseEntries(entries): return '\n'.join(entries)
Va uploader le contenu nouvellement modifié
sur la page indiqué par url
Note importante : il faudrait peut être ajouter à "content" le reste de la page (pas que la partie des entrées biographiques) selon comment il faut uploader des modifications sur wikipast (soit juste la partie qui change, soit toute la page)
@param content : ???? (à voir) le contenu à uploader @param url : String L'url de la page ou mettre ces modifications.
def uploadModifications(content, url): #TODO pass
</syntaxhighlight >