ImageBot
Description
ImageBot scan toutes les pages de biographies, certaines de lieu du wiki et les illustre en y insérant une image en Creative Commons issu de la bibliothèque d’image Yahoo. Lorsque le bot scan une page, il vérifie d’abord si cette page possède une image et s'il n’y a pas d’image il ajoute une image adéquate en haut à droite de la page en question. Si une image est déjà présente sur la page mais qu’elle n’est pas au tout début, alors elle sera déplacée au tout début mais une nouvelle image ne sera pas ajoutée.
Pour ajouter une image aux pages biographiques, le bot scan la page Biographies et pour chaque personne il y ajoute une image selon les règles précédentes.
Pour les lieux, pour le moment, le bot scan les lieux de la page Naissance et pour chaque entrée y ajoute aussi une image.
Pour recevoir une liste de titres de pages on peut facilement insérér une condition dans la recherche des titres afin d'extraire des nouveaux paramêtres de recherche.
Nous avons testé sur une centaine d'entrées et tant que le layout de la page biographie n'est pas modifié par un autre bot il n'y a aucun conflit avec les autres bots. Une période optimale pour le lancement du bot est tout les trois jours.
Exemples
Performances
- Ce bot étant général il ne précise pas la catégorie du mot que l'on recherche, ainsi pour certains lieux l’ajout d’image n’est pas adéquat. En effet un lieu ayant un nom de personne ou d’autres choses plus populaires aboutira à cette recherche et non celle voulue. Une possible solution pour des recherches manuelles est présenté avec le code IMAGEBOT_v2_namesearch.
- L'implementation du bot Listepagesbot permettrait d'obtenir la liste de toutes les pages du wiki afin d’ajouter une image à cette liste entière et pas seulement les lieux de naissance et les biographies. Cependant, en référence au point précédent, il faudrait implémenter une précision de la catégorie du mot recherché. Nous ne l'avons pas fait afin de garder le côté général du bot, mais aussi car ceci est difficilement réalisable. En effet il faudrait rechercher des schémas qui permettent d'identifier le type d'entrée (comme par exemple majuscules aux deux mots pour une personne ou une préposition au milieu des trois mots pour un lieu). D'autres options ont étés présenté lors du cours 8 de Maud Ehrmann. Cependant, le code permets de rajouter une catégorie en spécifiant une page de référence et en implementer l'extraction des pages qui sont souhaités de rajouter au fonctionnement du bot, dans la même facon dont c'est fait pour Naissance et Biographies. En effet, la liste fourni par Listepagesbot ne précise pas la catégorie de chaque titre et donc il faudrait un autre bot qui s'occuperait de cette fonction.
- Problème si quelqu'un a déjà ajouté manuellement une image auparavant mais qui n'est pas une image de la personne ou du lieu de la page. Le premièr tel image sera alors déplacé au début de la page comme si c'était une image qui illustrait la page mais qui était mal placée. Les images suivantes seraient pas touchés. Le bot n'accèpte donc pas un placement individuel du premier image.
- Le bot ne fonctionne pas si la page à modifier existe, mais est vide. (il vérifie si une image est présente dans un caractère vide et donc affiche une erreur). Cependant, il fonctionne si la page est inexistante et donc dans ce cas il va la créer et placer l'image (il ne vérifie pas la présence ou non d'image car la page n'existait pas et donc le bot fonctionne). Ce problème de page vide peut être réglé avec un contrôle de page vide et une action à réaliser dans ce cas. Ou avec un Bot séparé qui s'occupe a supprimer les pages crées mais vides.
Code
IMAGEBOT_v2_categorysearch
Code automatisé pour la recherche des bibliographies et des endroits a partit des Pages Biographies et Naissance.
Des autres Pages de référence peuvent être ajoutés.
Attention: Une fois lancé ce bot modifie beaucoups des pages, c'est pourquoi une confirmation des Titres extraits dans les pages est necessaire. Celle si peut aussi être enlève.
abcd= contient tous les pages sources pour éxtraire les titres des pages après la boucle for sur abcd il y a un names=[] qui peut être décommenté et utilisé pour tester le bot sur une seule ou plusieures pages test.
import re import urllib2 import requests import os from bs4 import BeautifulSoup # -*- coding: utf-8 -*- user='***' passw='***' baseurl='http://wikipast.epfl.ch/wikipast/' baseur2='https://images.search.yahoo.com/search/images;_ylt=AwrB8plXwf9YqRkAXSWJzbkF?p=' abcd=['Biographies','Naissance'] # Login request payload={'action':'query', 'format':'json', 'utf8':'', 'meta':'tokens', 'type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm login_token=r1.json()['query']['tokens']['logintoken'] payload={'action':'login', 'format':'json', 'utf8':'', 'lgname':user, 'lgpassword':passw, 'lgtoken':login_token} r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies) params3='?format=json&action=query&meta=tokens&continue=' r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies) edit_token=r3.json()['query']['tokens']['csrftoken'] edit_cookie=r2.cookies.copy() edit_cookie.update(r3.cookies) #extract names of biographies names=[] for abc in abcd: result=requests.post(baseurl+'api.php?action=query&titles='+abc+'&export&exportnowrap') soup=BeautifulSoup(result.text,'html.parser') resultt=str(soup) if (abc=='Biographies'): resulttt=resultt.split("{|") resultttt=resulttt[1].split("|}") test=resultttt[0].split("|") for xx in test: if (xx.find("]]")!=-1): xx=xx.split("[[")[1].split("]]")[0] a=xx.replace(' ','_') print(a.decode('UTF-8')) names.append(a.decode('UTF-8')) if (abc=='Naissance'): resulttt=resultt.split("*") test=resulttt[1:len(resulttt)] for xx in test: xxx=xx.split("/")[1] xxx=xxx.split("[[") if len(xxx)>1: xxx=xxx[1].split("]]")[0] xxx=xxx.replace(' ','_') if(xxx!='Naissance'): names.append(xxx.decode('UTF-8')) print(xxx.decode('UTF-8')) #if you are not sure if your extraction works properly, confirm manually print('Do you want to modify above pages?\n if yes press button \n if not interrupt! add names to modify un line 73 names=[?] and uncomment\n\n') os.system("pause") print('sure?') os.system("pause") #If you want to run with single page use: #names=['Michael_Schumacher'] #recherche images creative common & mise sur le serveur for name in names: result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text, 'html.parser') code='' for primitive in soup.findAll("text"): code+=primitive.string if (code.find("Fichier")==-1): print('\n****************\n'+'search image for '+name+'\n****************\n') #attention au codage result=urllib2.urlopen(baseur2+name.encode('utf-8', 'replace')+'&imgsz=medium&imgty=photo&ei=UTF-8&fr=sfp&imgl=fsu&fr2=p%3As%2Cv%3Ai') content=result.read().decode('utf-8'); soup=BeautifulSoup(content,'html.parser') ssoup=soup.find("img") result=str(ssoup) url=re.search('data-src="(.+?)"',result) if (url): upload=requests.post( baseurl + 'api.php' , data={'action':'upload', 'filename':name+'.jpg', 'format':'json', 'token':edit_token, 'url':url.group(1) }, cookies=edit_cookie, ) print(upload.text) ###ajouter l'image dans la page content='' result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text,'html.parser') for primitive in soup.findAll("text"): content+=primitive.string content='[[Fichier:'+name+'.jpg|right]]\n'+content payload={'action':'edit', 'assert':'user', 'format':'json', 'utf8':'', 'text':content, 'title':name, 'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie) else: print(name+': Picture already online\n****************\n') if(code.find("Fichier")!=-1): result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text,'html.parser') content='' for primitive in soup.findAll("text"): content+=primitive.string xx=content.split("[[Fichier:") try : lol=xx[1].split("jpg|right]]")[0] xx[1]=xx[1].split("jpg|right]]")[1] except: lol=xx[1].split("jpg]]")[0] xx[1]=xx[1].split("jpg]]")[1] if(xx[0].find('\n')!=-1): content='[[Fichier:'+lol+'jpg|right]]\n'+xx[0]+'[[Fichier:'.join(xx[1:len(xx)]) print(name+': Picture put on top of page\n****************\n') payload={'action':'edit', 'assert':'user', 'format':'json', 'utf8':'', 'text':content, 'title':name, 'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
IMAGEBOT_v2_namesearch
Recherche non automatisé qui permet de préciser des paramètres de recherche plus spécialisées comme l'ajout du paramètre "place" pour les endroits. Et qui ajoute un paramètre de décision si on souhaite a remplacer un image déja en ligne.
Ou lancement du Bot pour une seule page en utilisant
names=['tous les titres des pages souhaités a illustrer' 'espacés'] prop='' pour name search only ='_'+'additional parameter' pour recherche avec paramètre rep= True si image peut être mise ajour en ligne = False pour le première lancement ou une verification du placement sur la page
import re import urllib2 import requests import os from bs4 import BeautifulSoup user='***' passw='***' baseurl='http://wikipast.epfl.ch/wikipast/' baseur2='https://images.search.yahoo.com/search/images;_ylt=AwrB8pBc0hFZIkIAyZeJzbkF;_ylu=X3oDMTBsZ29xY3ZzBHNlYwNzZWFyY2gEc2xrA2J1dHRvbg--;_ylc=X1MDOTYwNjI4NTcEX3IDMgRhY3RuA2NsawRiY2sDZHBxYWxxbGNoM2s5MiUyNmIlM0QzJTI2cyUzRDFrBGNzcmNwdmlkA2xzbUxMelk1TGpIYzZWWFZXUkhSSWdOck1USTRMZ0FBQUFBd0ZpaFcEZnIDc2ZwBGZyMgNzYS1ncARncHJpZAMzQkZ5V1ZJelI0dUkyUWtoeUx5SWVBBG10ZXN0aWQDbnVsbARuX3N1Z2cDMTAEb3JpZ2luA2ltYWdlcy5zZWFyY2gueWFob28uY29tBHBvcwMwBHBxc3RyAwRwcXN0cmwDBHFzdHJsAzcEcXVlcnkDU2Nod2VpegR0X3N0bXADMTQ5NDM0MDIxMAR2dGVzdGlkA251bGw-?gprid=3BFyWVIzR4uI2QkhyLyIeA&pvid=lsmLLzY5LjHc6VXVWRHRIgNrMTI4LgAAAAAwFihW&p=' #Search Terms (Page Titles) names=['Constance'] #Kind of page prop='place' #replace image yes or no rep=True #recherche images creative common & mise sur le serveur # Login request payload={'action':'query', 'format':'json', 'utf8':'', 'meta':'tokens', 'type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm login_token=r1.json()['query']['tokens']['logintoken'] payload={'action':'login', 'format':'json', 'utf8':'', 'lgname':user, 'lgpassword':passw, 'lgtoken':login_token} r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies) params3='?format=json&action=query&meta=tokens&continue=' r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies) edit_token=r3.json()['query']['tokens']['csrftoken'] edit_cookie=r2.cookies.copy() edit_cookie.update(r3.cookies) for name in names: result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text, 'html.parser') code='' for primitive in soup.findAll("text"): code+=primitive.string if ((code.find("Fichier")==-1)or rep): #controle si il y a déja un Fichier et si il faut le remplacer print('\n****************\n'+'search image for '+name+'_'+prop+'\n****************\n') search=name+'_'+prop #recherche image taille M (droits utiliser et distribution NON COMMERCIALE result=urllib2.urlopen(baseur2+prop.encode('utf-8', 'replace')+'&fr=sfp&fr2=sb-top-images.search.yahoo.com&ei=UTF-8&n=60&x=wrt&imgsz=medium&imgl=fsu') content=result.read().decode('utf-8'); soup=BeautifulSoup(content,'html.parser') ssoup=soup.find("img") result=str(ssoup) url=re.search('src="(.+?)"',result) if (url): if(rep): #mise en ligne d'un fichier existant upload=requests.post( baseurl + 'api.php' , data={'action':'upload', 'filename':name+'.jpg', 'format':'json', 'token':edit_token, 'url':url.group(1), 'ignorewarnings':True } , cookies=edit_cookie, ) else: #mise en ligne d'un nouveau fichier upload=requests.post( baseurl + 'api.php' , data={'action':'upload', 'filename':name+'.jpg', 'format':'json', 'token':edit_token, 'url':url.group(1) } , cookies=edit_cookie, ) print(upload.text) ###ajouter l'image dans la page if (rep==0): content='' result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text,'html.parser') for primitive in soup.findAll("text"): content+=primitive.string content='[[Fichier:'+name+'.jpg|right]]\n'+content payload={'action':'edit', 'assert':'user', 'format':'json', 'utf8':'', 'text':content, 'title':name, 'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie) else: print(name+': Picture already online\n****************\n') if(code.find("Fichier")!=-1): result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text,'html.parser') content='' for primitive in soup.findAll("text"): content+=primitive.string xx=content.split("[[Fichier:") try : lol=xx[1].split("jpg|right]]")[0] xx[1]=xx[1].split("jpg|right]]")[1] except: lol=xx[1].split("jpg]]")[0] xx[1]=xx[1].split("jpg]]")[1] if(xx[0].find('\n')!=-1): content='[[Fichier:'+lol+'jpg|right]]\n'+xx[0]+'[[Fichier:'.join(xx[1:len(xx)]) print(name+': Picture put on top of page\n****************\n') payload={'action':'edit', 'assert':'user', 'format':'json', 'utf8':'', 'text':content, 'title':name, 'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)