« ImageBot » : différence entre les versions
(→Code) |
(→Code) |
||
Ligne 27 : | Ligne 27 : | ||
== Code == | == Code == | ||
== IMAGEBOT_v2_categorysearch == | |||
<nowiki> | <nowiki> | ||
Ligne 181 : | Ligne 184 : | ||
r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie) | r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie) | ||
</nowiki> | </nowiki> | ||
== IMAGEBOT_v2_namesearch == | |||
<nowiki> | |||
import re | |||
import urllib2 | |||
import requests | |||
import os | |||
from bs4 import BeautifulSoup | |||
user='IB' | |||
passw='image' | |||
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) | |||
<\nowiki> |
Version du 9 mai 2017 à 16:23
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.
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.
- 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, la liste fourni par Listepagesbot ne précise par la catégorie de chaque mot 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. Cette image sera alors déplacé au début comme si c'était une image qui illustrait la page mais qui était mal placée.
- Le bot ne fonctionne pas si la page à modifier 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.
Code
IMAGEBOT_v2_categorysearch
import re import urllib2 import requests import os from bs4 import BeautifulSoup # -*- coding: utf-8 -*- user='IB' passw='image' 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
<nowiki>
import re import urllib2 import requests import os from bs4 import BeautifulSoup
user='IB' passw='image' 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='
\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='
\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)
<\nowiki>