Projet:Bot/Codes/PY
Pour ajouter un nouveau code, utilisez {{subst:Projet:Bot/Codes/E|auteur=|titre=|date=|langage=}}, puis complétez les informations manquantes.
Codes également sous licence GPL. Inspiré au départ par le SimpletBot de Dake.
auteur : IAlex (d · c · b) | Création : entre novembre 2006 et avril 2008 (dépend des scripts) | Dernière modification : 8 avril 2008 |
Méthodes générales
[modifier | modifier le code]Descriptif
[modifier | modifier le code]Deux méthodes qui seront utiles aux autres morceaux du programme.
Code
[modifier | modifier le code]import wikipedia
import simplejson
def SauvPage(Text, Page, Comment, ReplaceBotSection = False):
if type(Page) in [type( '' ), type( u'' )]:
ClsPage = wikipedia.Page(wikipedia.getSite(), Page)
else:
ClsPage = Page
OldText = ClsPage.get()
if ReplaceBotSection:
try:
i1 = re.search(u'<!-- BOT SECTION START -->',OldText).end()
i2 = re.search(u'<!-- BOT SECTION STOP -->',OldText).start()
Text = OldText[:i1] + Text + OldText[i2:]
except:
wikipedia.output( u'Une des balises n\'a pas pu être trouvée !' )
if OldText.strip() != Text.strip():
try:
ClsPage.put(Text, Comment)
except wikipedia.EditConflict:
wikipedia.output(u"Conflit d'edition")
else:
wikipedia.output(u'Pas de changement nécessaire')
del ClsPage
def nomTri( text ):
text = text.replace(u'é',u'e').replace(u'è',u'e').replace(u'ë',u'e').replace(u'ê',u'e')
text = text.replace(u'á',u'a').replace(u'à',u'a').replace(u'ä',u'a').replace(u'â',u'a')
text = text.replace(u'í',u'i').replace(u'ì',u'i').replace(u'ï',u'i').replace(u'î',u'a')
text = text.replace(u'ó',u'o').replace(u'ò',u'o').replace(u'ö',u'o').replace(u'ô',u'o')
text = text.replace(u'ú',u'u').replace(u'ù',u'u').replace(u'ü',u'u').replace(u'û',u'u')
text = text.replace(u'É',u'E').replace(u'È',u'E').replace(u'Ë',u'E').replace(u'Ê',u'E')
text = text.replace(u'À',u'A').replace(u'Ä',u'A').replace(u'Â',u'A')
text = text.replace(u'Ì',u'I').replace(u'Ï',u'I').replace(u'Î',u'I')
text = text.replace(u'Ò',u'O').replace(u'Ö',u'O').replace(u'Ô',u'O')
text = text.replace(u'Ù',u'U').replace(u'Ü',u'U').replace(u'Û',u'U')
return text
def getDay():
Time = time.localtime(time.time())
Months = [u'', u'janvier', u'février', u'mars', u'avril', u'mai', u'juin', u'juillet', u'août', u'septembre', u'octobre', u'novembre', u'décembre']
Day = str(Time[2]).encode('utf-8')
return Day + u' ' + Months[Time[1]]
# Méthode pour rechercher les pages qui incluent (pas de simples liens) la page passée en paramètre
# Le paramètre n'est pas un objet mais une chaine
# Piqué de maintenance/update_namespaces.py et un peu modifié
def getLinks(template):
site = wikipedia.getSite()
eicont = False
if not site.apipath():
gen = wikipedia.Page(site, template).getReferences(False, True, True)
for page in gen:
yield page
return
while True:
predata = {'action': 'query',
'query': 'list',
'list': 'embeddedin',
'einamespace': '0',
'eititle': template,
'eilimit': '5000',
'format': 'json'}
if eicont != False:
predata['eicontinue'] = eicont
#print u'Getting references to [[' + template + u']]'
try:
response, json = site.postForm(site.apipath(), predata)
except wikipedia.ServerError, e:
output(u'Warning! %s: %s' % (site, e))
return
try:
data = simplejson.loads(json)
except ValueError:
wikipedia.output(u'Warning! %s is defined but does not exist!' % site)
return
for page in data['query']['embeddedin']:
yield wikipedia.Page(site,data['query']['embeddedin'][page]['title'])
try:
eicont = data['query-continue']['embeddedin']['eicontinue']
except:
break
Discussion
[modifier | modifier le code]Mise à jour d'articles liés
[modifier | modifier le code]Descriptif
[modifier | modifier le code]Routine qui permet de mettre à jour la liste d'articles liés.
Nécessite les fonctions 'SauvPage' et 'getLinks' qui se trouve dans #Méthodes générales.
Paramètres pour la routine 'Liste':
- PageLis: page contenant la liste des articles.
- PageNb: page où doit être inscrit le nombre d'articles liés (exemple : Modèle:Nombre articles entreprises).
- PageModif: page où mettre les nouveaux article ou une chaine vide pour ne pas utiliser cette fonction
- Bandeau : un tableau de pages de bandeaux (3 au maximum) sans 'Modèle:' devant.
Code
[modifier | modifier le code]import wikipedia
import re
def Liste(PageLis, PageNb, PageModif, Bandeaux):
try:
ExistingPages = set()
NewPages = set()
ClsPageLis = wikipedia.Page(wikipedia.getSite(), PageLis)
if PageModif != u'':
ClsPageModif = wikipedia.Page(wikipedia.getSite(), PageModif)
PageModifText = ClsPageModif.get()
PageExpr = re.compile(r"\{\{Article simple\|([^\n\|]*)}}")
for match in PageExpr.findall(ClsPageLis.get()):
ExistingPages.add( match )
ExistingPages = list(ExistingPages)
if Bandeaux[1] == u'':
liste = u"au bandeau {{M|" + Bandeaux[0] + u"}}"
elif Bandeaux[2] == u'':
liste = u"aux bandeaux {{M|" + Bandeaux[0] + u"}} et {{M|" + Bandeaux[1] + u"}}"
else:
liste = u"aux bandeaux {{M|" + Bandeaux[0] + u"}}, {{M|" + Bandeaux[1] + u"}} et {{M|" + Bandeaux[2] + u"}}"
Text = u"\n<small>Liste mise à jour régulièrement par {{u|" + UserName + u"}} à partir des articles liés " + liste + u"</small>\n"
Text += u"\n"
Text += u"[[Special:Recentchangeslinked/" + PageLis + u"|Modifications récentes des articles ayant le bandeau de ce portail]]\n"
Text += u"\n"
Text += u"Liste des articles : \n"
Count = 0
pages = set()
for Bandeau in Bandeaux:
if Bandeau != '':
for page in getLinks( wikipedia.getSite().template_namespace() + ':' + Bandeau ):
if page.namespace() == 0:
Count += 1
pages.add( page.title() )
if not page.title() in ExistingPages:
NewPages.add( page.title() )
pages = list( pages )
pagesTri = set()
pagesRes = {}
for page in pages:
text = nomTri( page )
pagesTri.add( text )
pagesRes[ text ] = page
pagesTri = list( pagesTri )
pagesTri.sort()
for page in pagesTri:
Text += u"{{Article simple|" + pagesRes[page] + u"}}\n"
if PageLis != u'':
SauvPage(Text, ClsPageLis, u'Bot : Mise à jour de la liste', True)
if PageNb != u'':
SauvPage(str(Count).encode('utf-8'), PageNb, u'Bot : Mise à jour du nombre d\'articles liés' + u' (' + str(Count).encode('utf-8') + u')', True)
if PageModif != u'':
try:
StartPos = re.search(u'<!-- BOT SECTION -->',PageModifText).end()
NewPages = list( NewPages )
Header = u"\n===== " + getDay() + u' ====='
if not Header in PageModifText:
AddText = Header
else:
AddText = u''
for NewPage in NewPages:
AddText += u"\n{{Article simple|" + NewPage + u"}}"
PageModifText = PageModifText[:StartPos] + AddText + PageModifText[StartPos:]
SauvPage( PageModifText, ClsPageModif, resListe )
except:
wikipedia.output( u'La page ' + PageModif + u' n\'a pas pu être modifiée, balise manquante ?' )
except:
wikipedia.output(u'Error in Liste()')
Discussion
[modifier | modifier le code]à quoi sert l'ajout que tu viens de faire ? -- Chico (blabla) 13 septembre 2007 à 20:11 (CEST)
- A trier les pages sans prendre en compte les accents. iAlex (Ici ou là), le 18 novembre 2007 à 12:10 (CET)
- Ou il y a une petite erreur ou je n'ai rien compris :
- ...
- text = text.replace(u'ú',u'u').replace(u'ù',u'u').replace(u'ü',u'u').replace(u'û',u'u')
- text =
pagetext.replace(u'É',u'E').replace(u'È',u'E').replace(u'Ë',u'E').replace(u'Ê',u'E') - text = text.replace(u'À',u'A').replace(u'Ä',u'A').replace(u'Â',u'A')
- ...
- ILJR (d) 7 avril 2008 à 12:39 (CEST)
- Ce code marche toujours maintenant que tous les bandeaux sont réunis au sein du modèle {{Portail}} ? Alecs.y (disc. - contr.) 7 avril 2008 à 13:48 (CEST)
- Je ne comprends pas du tout ta réponse.
- On peut se tutoyer ?
- ILJR (d) 7 avril 2008 à 14:32 (CEST)
- Ce n'était pas une réponse à ta question, mais plutôt une autre interrogation. Alecs.y (disc. - contr.) 7 avril 2008 à 17:34 (CEST)
- @ILJR: oui, je l'ai remarqué il y a pas longtemps, mais j'ai toujours pas mis à jour ces scripts (d'autant que je les ai pas mal modifiés).
- @Alecs.y: chaque bandeau a encore une page à lui qui stocke les styles (comme pour le bandeau {{Ébauche}}) et qui sont les mêmes pages qu'avant, donc ça ne devrait pas poser de problème majeur.
- iAlex (Ici ou là), le 7 avril 2008 à 17:51 (CEST)
- Il marche pas chez moi, je dois mal l'utiliser Alecs.y (disc. - contr.) 8 avril 2008 à 11:45 (CEST)
- J'ai mis les codes à jour, la sortie de l'api de MediaWiki a changé il y a presque deux mois et j'ai du modifier le script en conséquence, donc essaye de les mettre à jour, mais l'appel de la fonction Liste() a changé (le plus notable apparraissant en rouge dans la doc au dessus). Sinon ce serait plus utile si tu indiquais ce qui ne marche pas (et comment tu appelles la fonction, paramètres passés,...) iAlex (Ici ou là), le 8 avril 2008 à 17:28 (CEST)
- Bah j'ai tous mis dans un fichier nommé link.py et je fait : python link.py -bandeau:Portail_Nancy -pagelis:Utilisateur:Alecs.y/Brouillon Alecs.y (disc. - contr.) 8 avril 2008 à 19:14 (CEST)
- J'ai mis les codes à jour, la sortie de l'api de MediaWiki a changé il y a presque deux mois et j'ai du modifier le script en conséquence, donc essaye de les mettre à jour, mais l'appel de la fonction Liste() a changé (le plus notable apparraissant en rouge dans la doc au dessus). Sinon ce serait plus utile si tu indiquais ce qui ne marche pas (et comment tu appelles la fonction, paramètres passés,...) iAlex (Ici ou là), le 8 avril 2008 à 17:28 (CEST)
- Il marche pas chez moi, je dois mal l'utiliser Alecs.y (disc. - contr.) 8 avril 2008 à 11:45 (CEST)
- Ce n'était pas une réponse à ta question, mais plutôt une autre interrogation. Alecs.y (disc. - contr.) 7 avril 2008 à 17:34 (CEST)
Mise à jour de Wikipédia:Liste des effectifs d'articles par portail
[modifier | modifier le code]Descriptif
[modifier | modifier le code]Permet de mettre à jour la page Wikipédia:Liste des effectifs d'articles par portail.
Nécessite les fonctions 'SauvPage' et 'getLinks' qui se trouve dans #Méthodes générales.
Pour la configuration, voir Wikipédia:Liste des effectifs d'articles par portail/liste.
Code
[modifier | modifier le code]import wikipedia
import re
resPortails = u"Mise à jour de la liste"
pagePortails = u"Wikipédia:Liste des effectifs d'articles par portail"
pageListPortails = u"Wikipédia:Liste des effectifs d'articles par portail/liste"
def MajPortails():
portails = {}
pages = {}
tot = 0
j = -1
for portail in wikipedia.Page(wikipedia.getSite(), u"Wikipédia:Liste des effectifs d'articles par portail/liste").get().split(u'\n'):
j += 1
arr = {}
if portail.startswith(u"<pre>") or portail.startswith(u"</pre>") or portail.startswith(u"##") or u"" == portail:
arr[u"Type"] = ""
elif portail.startswith(u"="):
arr[u"Type"] = "Titre"
arr[u"Titre"] = portail[1:]
else:
arr[u"Type"] = "Portail"
n = 0
for setting in portail.split(u"|"):
var = setting.split(u"=")
if len( var ) == 2:
arr[var[0]] = var[1]
for bandeau in arr[u"bandeau"].split(u"<>"):
wikipedia.output(bandeau)
time.sleep(2)
for page in getLinks(wikipedia.getSite().template_namespace() + ':' + bandeau):
if page.namespace() == 0:
n += 1
tot += n
arr[u"count"] = n
portails[j] = arr
text = u"Dernière mise à jour le ~~~~~.\n\n"
text += u"{| class='wikitable sortable'\n"
text += u"|-\n"
text += u"! Nom !! Compte !! Liste !! Tri premier niveau !! Tri deuxième niveau<!-- !! Tri troisième niveau !! Tri quatrième niveau -->\n"
for k in range(0, j + 1):
portail = portails[k]
if portail[u"Type"] == "":
continue
elif portail[u"Type"] == "Titre":
text += u"|-\n"
text += u"| colspan='7' | <span style='display:none;'>" + nomTri( portail[u"Titre"] ) + u"</span><h3>" + portail[u"Titre"] + u"</h3>\n"
elif portail[u"Type"] == "Portail":
lis = u''
tri = u''
cont = 0
for bandeau in portail[u"bandeau"].split(u"<>"):
if lis != u'':
lis += u', '
tri += u', '
lis += "{{M|" + bandeau + u"}}"
sort = bandeau
if sort.startswith( u'Portail ' ):
sort = sort[8:]
tri += nomTri( sort )
n = str(portail[u"count"])
cle = u"<span style='display:none'>" + n.zfill( 6 ).encode('utf-8') + u"</span>"
text += u"|-\n"
text += u"| <span style='display:none;'>" + tri + u"</span>" + lis + u" || " + cle[:28] + u"." + cle[28:] + u"{{formatnum:" + n.encode('utf-8') + u"}} || "
if portail[u"page"] != u"":
text += u"[[" + portail[u"page"] + u"]]"
# text += u" || "
# if portail.has_key( u"s1" ):
# text += portail[u"s1"]
# text += u" || "
# if portail.has_key( u"s2" ):
# text += portail[u"s2"]
text += u" || "
if portail.has_key( u"s3" ):
text += portail[u"s3"]
text += u" || "
if portail.has_key( u"s4" ):
text += portail[u"s4"]
text += u"\n"
text += u"|}\n"
text += u"\n=== Total ===\n"
text += u"Il y a au total {{formatnum:" + str(tot).encode('utf-8') + u"}} références à un bandeau. Attention, certains articles peuvent avoir plus d'un bandeau !\n"
text += u"\n"
try:
wikipedia.output(u"############################")
SauvPage(text, u"Wikipédia:Liste des effectifs d'articles par portail", u"Mise à jour de la liste", True)
wikipedia.output(u"Terminé")
except:
wikipedia.output(u"Erreur dans la sauveagarde")
wikipedia.output(u"#############################")
wikipedia.output(text)
Discussion
[modifier | modifier le code]Et pour faire tourner le tout...
[modifier | modifier le code]Descriptif
[modifier | modifier le code]Permet de faire tourner chaque heure les scripts qui se trouvent aussi. Il y a certaine un bien meilleure manière de faire ça. Mettre ceci au bas du fichier.
Par défaut le script affiche une nouvelle ligne à chaque minute, il est possible de masquer ça.
Nécessite les scripts qui se trouvent au-dessus.
Code
[modifier | modifier le code]#pas besoin de reprendre les autres 'import'
import re
import time
import wikipedia
import simplejson
RecentListePageLis = {}
RecentListePageNb = {}
RecentListeBandeau = {}
RecentListeNb = 0
def PrintTime(Time):
Days = [u'lundi', u'mardi', u'mercredi', u'jeudi', u'vendredi', u'samedi', u'dimanche']
DayName = Days[Time[6]]
Day = str(Time[2]).encode('utf-8')
Month = str(Time[1]).encode('utf-8')
Year = str(Time[0]).encode('utf-8')
Hour = str(Time[3]).encode('utf-8')
Minute = str(Time[4]).encode('utf-8')
Second = str(Time[5]).encode('utf-8')
if Time[4] < 10:
Minute = u'0' + Minute
if Time[5] < 10:
Second = u'0' + Second
return DayName + u' ' + Day + u'.' + Month + u'.' + Year + u' à ' + Hour + u':' + Minute + u':' + Second
def AddRecListe(PageLis, PageNb, Bandeau):
global RecentListeNb, RecentListePageLis, RecentListePageNb, RecentListeBandeau
RecentListePageLis[RecentListeNb] = PageLis
RecentListePageNb[RecentListeNb] = PageNb
RecentListeBandeau[RecentListeNb] = Bandeau
RecentListeNb += 1
def Main():
#Ajouter ICI la liste des portails à mettre à jour avec la fonction AddRecListe(PageLis, PageNb, Bandeau), même paramètres que pour la fonction Liste.
while True:
try:
Time = time.localtime(time.time())
wikipedia.output(PrintTime(Time)) # A bazarder si ça vous chante.
if Time[4] == 0:
wikipedia.output(u'######################### BOT : MISE À JOUR DE ' + str(Time[3]).encode('utf-8') + u':' + str(Time[4]).encode('utf-8') + u' #########################')
Ratissage()
for i in range(0,RecentListeNb,1):
Liste(RecentListePageLis[i], RecentListePageNb[i], RecentListeBandeau[i])
if Time[3] == 9 or Time[3] == 18: # à neuf heures ou dix-heures.
MajPortails()
wikipedia.output(u'############################ FIN DE LA MISE À JOUR ############################')
wikipedia.output(PrintTime(time.localtime(time.time())))
time.sleep(60 - time.localtime(time.time())[5])
except:
time.sleep(5)
if __name__ == "__main__":
Main()
Discussion
[modifier | modifier le code]Interwiki
[modifier | modifier le code]auteur : Catalyse (d · c · b) | Création : 29 Juin 2007 | Dernière modification : 29 Juin 2007 23h59 |
Descriptif
[modifier | modifier le code]Il s'agit d'un ensemble de modifications sur les fichiers replace.py et pagefromfile.py qui permettent de créer et de mettre à jour un log des modifications des liens Interwiki. Ce log se trouve sur : Projet:Bot/Interwiki
Une fois que vous aurez effectué les modifications ci-dessous, votre Bot devrait créer lui-même sa sous-pages de Projet:Bot/Interwiki
Code
[modifier | modifier le code]Vous devez tout d'abord créer un fichier, dans le même répertoire que celui de interwiki.py, nommé config_log_iw.py et contenant :
#!/usr/bin/python
# -*- coding: utf-8 -*-
login_bot = 'Pseudo/Login de votre Bot'
login_dress = 'Votre Pseudo/login'
pages_crees = False
}}
Aux alentours de la ligne 224 juste après "import socket", ajouter :
import config_log_iw
import pagefromfile
import httplib
Aux alentours de la ligne 962 juste après
# disabled graph drawing for minor problems: it just takes too long
#if notUpdatedSites != [] and config.interwiki_graph:
# # at least one site was not updated, save a conflict graph
# self.createGraph()
# don't report backlinks for pages we already changed
if globalvar.backlink:
self.reportBacklinks(new, updatedSites)
Ajouter :
def mettre_log_iw_a_jour(self):
text = self.mods1.encode('utf-8')
y = re.compile('Retire:', re.VERBOSE)
b = y.search(text)
if b == None:
return True
page = self.originPage.aslink(True).encode('utf-8')
z = re.compile('\[\[', re.VERBOSE)
a = z.search(text)
if a != None:
text = z.sub(r'[[:', text)
remplacement2 = '\n|- \n| width=300px |'+page+'\n|'+text+'\n| width=70px style="text-align:center;"|Fait \n| width=70px style="text-align:center;"|\n <noinclude>Add</noinclude>'
conn = httplib.HTTPConnection('fr.wikipedia.org')
conn.request("GET", "/w/index.php?title=Projet:Bot/Interwiki/" + config_log_iw.login_bot + "&action=edit")
response = conn.getresponse()
data = response.read()
i1 = re.search('<textarea[^>]*>', data).end()
i2 = re.search('</textarea>', data).start()
data2 = data[i1:i2]
h = codecs.open('log_interwiki_bot.txt', 'w+')
h.write("{{-start-}}\n"+data2)
h.write("\n{{-stop-}}")
h.close()
arg1 = ['-file:log_interwiki_bot.txt', '-force']
pagefromfile.remplace_text('log_interwiki_bot.txt', '<noinclude>Add</noinclude>', remplacement2)
pagefromfile.remplace_text('log_interwiki_bot.txt', '"', '"')
pagefromfile.remplace_text('log_interwiki_bot.txt', '<noinclude>\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'</noinclude>','<noinclude>\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'</noinclude>')
pagefromfile.main(arg1)
Aux alentours de la ligne 1090, juste après
# Nothing more to do
break
wikipedia.output(u"NOTE: Updating live wiki...")
timeout=60
while 1:
try:
Ajouter :
self.mods1 = mods
self.mettre_log_iw_a_jour()
Enfin, aux alentours de la ligne 1421, juste après
def readWarnfile(filename, bot):
import warnfile
reader = warnfile.WarnfileReader(filename)
# we won't use removeHints
(hints, removeHints) = reader.getHints()
pages = hints.keys()
for page in pages:
# The WarnfileReader gives us a list of pagelinks, but titletranslate.py expects a list of strings, so we convert it back.
# TODO: This is a quite ugly hack, in the future we should maybe make titletranslate expect a list of pagelinks.
hintStrings = ['%s:%s' % (hintedPage.site().language(), hintedPage.title()) for hintedPage in hints[page]]
bot.add(page, hints = hintStrings)
#===========
globalvar=Global()
if __name__ == "__main__":
try:
Ajouter :
if config_log_iw.pages_crees == False:
remplacement1 = '=== [[Utilisateur:'+config_log_iw.login_bot+'|Bot:'+config_log_iw.login_bot+']] Dresse par [[Utilisateur:'+config_log_iw.login_dress+'|'+config_log_iw.login_dress+']]===\n{| class="wikitable" width=100%\n|-\n! width=300px | Page\n!Erreur Renvoye par le Bot\n! width=70px style="text-align:center;"|Etat (Bot)\n! width=70px style="text-align:center;"|Etat (Verif){{/'+config_log_iw.login_bot+'}}\n|}\n\nadd'
conn = httplib.HTTPConnection('fr.wikipedia.org')
conn.request("GET", "/w/index.php?title=Projet:Bot/Interwiki&action=edit")
response = conn.getresponse()
data = response.read()
i1 = re.search('<textarea[^>]*>', data).end()
i2 = re.search('</textarea>', data).start()
data2 = data[i1:i2]
h = codecs.open('interwiki.tmp', 'w+')
h.write("{{-start-}}'''Projet:Bot/Interwiki'''\n"+data2)
h.write("\n{{-stop-}}")
h.close()
arg1 = ['-file:interwiki.tmp', '-force']
pagefromfile.remplace_text('interwiki.tmp', '"', '"')
pagefromfile.remplace_text('interwiki.tmp', 'add', remplacement1)
pagefromfile.main(arg1)
os.remove('interwiki.tmp')
g = codecs.open('log_interwiki_bot.txt', 'w+', 'utf-8')
g.write('{{-start-}}\n\'\'\'Projet:Bot/Interwiki/'+config_log_iw.login_bot+'\'\'\'\n<noinclude>Add</noinclude> \n{{-stop-}}')
g.close()
arg1 = ['-file:log_interwiki_bot.txt']
pagefromfile.main(arg1)
pagefromfile.remplace_text('config_log_iw.py', 'pages_crees = False', 'pages_crees = True')
{{Boîte déroulante|titre=Modifications de pagefromfile.py|contenu= Aux alentours de la ligne 48, juste après
__version__='$Id: pagefromfile.py,v 1.37 2007/06/14 10:31:27 wikipedian Exp $'
import wikipedia, config
import re, sys, codecs
Ajoutez :
import os
Aux alentours de la ligne 209, juste après
except AttributeError:
wikipedia.output(u'\nStart or end marker not found.')
return 0, None, None
try:
title = titleR.search(contents).group(1)
except AttributeError:
wikipedia.output(u'\nNo title found - skipping a page.')
return 0, None, None
else:
return location.end(), title, contents
Ajoutez
def remplace_text(fichier, cherche, remplace):
""" remplace un texte dans un fichier """
c_cherche = re.compile(cherche)
curseur = open(fichier, 'r')
try:
curseur_ecriture = open('%s.tmp' % fichier, 'w')
curseur_ecriture.write( codecs.BOM_UTF8 )
try:
for line in curseur.readlines():
line = re.sub(c_cherche, remplace, line)
curseur_ecriture.write(line)
finally:
curseur_ecriture.close()
finally:
curseur.close()
# renommage
os.rename(fichier, '%s~' % fichier)
os.rename('%s.tmp' % fichier, fichier
Discussion
[modifier | modifier le code]File "interwiki.py", line 1025 def replaceLinks(self, page, newPages, bot): ^ IndentationError: unindent does not match any outer indentation level
Ca me donne cette erreur après les modifications Alecs.y (disc. - contr.) 5 avril 2008 à 16:36 (CEST)
getContrib
[modifier | modifier le code]auteur : ILJR (d · c · b) | Création : 05/04/2008 | Dernière modification : |
Descriptif
[modifier | modifier le code]Récupère la liste des pages (une seule ligne par page) modifiées par un utilisateur dans un fichier.
Avec l'option write_num indique en plus le nombre d'edit de cette page. L'option condition qui devrait permettre de filtrer les pages avec un texte contenu dans la page ne fonctionne pas.
Code
[modifier | modifier le code]# -*- coding: utf-8 -*-
import wikipedia
import sgmllib
class getContrib(sgmllib.SGMLParser):
"A simple parser class."
def parse(self, s):
"Parse the given string 's'."
self.cpt_div = -1
self.open_li = 0
self.cpt_a = 0
self.href = ''
self.feed(s)
self.close()
def __init__(self, user, step=5000, condition=''):
"Initialise an object, passing 'verbose' to the superclass."
sgmllib.SGMLParser.__init__(self)
self.site = wikipedia.getSite()
self.name = user
self.unique_page = {}
self.condition = condition
self.data = ''
self.address = self.site.contribs_address(self.name,limit=step)
self.do(self.address)
def do(self, address):
self.data = self.site.getUrl(address)
self.address = ''
self.parse(self.data)
if address != self.address:
self.do(self.address)
def start_li(self, attributes):
if self.cpt_div == 0:
self.open_li = 1
self.cpt_a = 0
def end_li(self):
if self.cpt_div == 1:
self.open_li = 0
def start_a(self, attributes):
self.cpt_a += 1
sp = 0
href = ''
for name, value in attributes:
if name == "href" and "dir=prev" not in value and "offset" in value:
href = value
if name == "title":
Ok = 1
if self.cpt_a == 3:
Ok = Ok * 1
else:
Ok = 0
if self.condition == '' or self.condition in self.data:
Ok = Ok * 1
else:
Ok = 0
if Ok == 1:
print u"Page : %s" % value
if self.unique_page.has_key(value):
self.unique_page[value] += 1
else:
self.unique_page[value] = 1
if value == "Special:Contributions":
sp = 1
if sp == 1 and href != '' and self.address == '':
self.address = href
def start_div(self, attributes):
if self.cpt_div == -1:
for name, value in attributes:
if name == "id":
if "bodyContent" in value:
self.cpt_div = 0
else:
self.cpt_div += 1
def end_div(self):
if self.cpt_div > -1:
self.cpt_div -= 1
def write_unique_page(self, NomFic, write_num=0):
f = open(NomFic, "wt")
print "nb_elem = %d" % len(self.unique_page)
for k, v in self.unique_page.iteritems():
P = wikipedia.Page(self.site, k)
f.write(P.urlname())
if write_num == 1:
f.write(" : %d" % v)
f.write("\n")
f.close();
def main():
C = getContrib("ILJR", 500, u"Mod%C3%A8le:L%C3%A9gifrance")
C.write_unique_page("UCL.txt", 0)
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()
Discussion
[modifier | modifier le code]Cette classe n'est pas finie et contient quelques bugs. Par exemple si je précise un paramètre limit supérieur au nombre d'edit de l'utilisateur, j'ai une erreur alors que si ce nombre est inférieur il n'y a aucun problème.
J'ai des soucis dans ce code et d'une façon générale avec la gestion de l'UTF-8 et de l'ascii qui provoque des erreurs à l'exécution. Par exemple, le fichier résultat contient les url des pages (« Mod%C3%A8le:L%C3%A9gifrance ») et pas leur titre (« Modèle:Légifrance ») à cause des caractères accentués. Je compte creuser la question mais si quelqu'un avait la solution cela m'arrangerait.