def publier(self, souspage, liste, soustableau=0, simple=False): """ Raccourci pour publier une liste d'article sur une souspage du P:SAdQaW La paramètre « simple » permet d'obtenir un affichage simplifié sous forme d'une liste de liens. """ retour = u'%s pages.\n\n' % str(len(liste[soustableau])) if simple: m = [] for t in liste[soustableau]: m.append(t.title()) retour += u'<noinclude>[[' + u']], [['.join(m) + u']].\n</noinclude>\n' else: noinclude = False for i, t in enumerate(liste[soustableau]): retour += u'{{%s}}' % t.title() if i == 11: retour += u'<noinclude>' noinclude = True retour += u'\n' if noinclude: retour += u'</noinclude>' #pywikibot.Page(self.site, u'Projet:Suivi des articles de qualité des autres wikipédias/Traduction/' + souspage).put(retour, comment=self.resumeListing) p = pywikibot.Page(self.site, u'Projet:Suivi des articles de qualité des autres wikipédias/Traduction/' + souspage) p.text = retour BeBot.save(p, commentaire=self.resumeListing)
def adl(self, mag): """ (Avec le wikimag) Ajoute les adq/ba de la semaine à l'Atelier de Lecture """ separation = '<center><hr style="width:42%;" /></center>' split = re.compile("\|([\w \xe9]+?)=", re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL) lien = re.compile("\[\[.*?\]\]", re.LOCALE|re.UNICODE) params = { 'adq': '', 'propositions adq' : '', 'ba' : '', 'propositions ba' : '' } # Les paramètres du mag a = re.split(split, mag.text) for i in range(1, len(a), 2): #retrait des liens a[i] = lien.sub(r'', a[i]) params[a[i].lower()] = a[i+1].rstrip('\n').strip(' ') lumiere = pywikibot.Page(self.site, 'Wikipédia:Atelier de lecture/Lumière sur...') #Retrait des a-label alabel = re.compile("\{\{[aA]-label\|([^\}\|]+).*?\}\}", re.LOCALE|re.UNICODE) params['adq'] = alabel.sub(r'[[\1]]', params['adq']) params['propositions adq'] = alabel.sub(r'[[\1]]', params['propositions adq']) params['ba'] = alabel.sub(r'[[\1]]', params['ba']) params['propositions ba'] = alabel.sub(r'[[\1]]', params['propositions ba']) propositions = params['propositions adq'] + '\n' + params['propositions ba'] #Ajout des icones icone = re.compile("^\* ", re.LOCALE|re.UNICODE|re.MULTILINE) params['adq'] = icone.sub(r'* {{AdQ|20px}} ', params['adq']) params['ba'] = icone.sub(r'* {{BA|20px}} ', params['ba']) lumiere.text = '[[Fichier:HSutvald2.svg|left|60px]]\nLes articles labellisés durant la semaine dernière et les nouvelles propositions au label.{{Clr}}\n' \ + '\n{{colonnes|nombre=3|\n' + params['adq'] + '\n}}\n' + separation \ + '\n{{colonnes|nombre=3|\n' + params['ba'] + '\n}}\n' + separation \ + '\n{{colonnes|nombre=3|\n' + propositions + '\n}}\n' \ + '<noinclude>\n[[Catégorie:Wikipédia:Atelier de lecture|Lumière sur...]]\n</noinclude>' pywikibot.output("# Publication sur l'Atelier de lecture") BeBot.save(lumiere, commentaire='Maj hebdomadaire de la liste', debug=self.debug)
def run(self): for a in [2007, 2008, 2009, 2010, 2011]: for s in range(1,53): p = pywikibot.Page(self.site, u'Wikipédia:Wikimag/%d/%d' % (a, s)) if p.exists() and not p.isRedirectPage(): #pywikibot.output(p.title()) p.text += self.categorie BeBot.save(p, commentaire=self.resume, minor=True)
def clore_traduction(self, page): """ Clôt une traduction """ #pywikibot.output("&&& clore : %s" % page.title()) page.text = self.re_statut.sub('|status=5', page.text) com = self.resume BeBot.save(page, commentaire=com, debug=self.debug) self.retirer_le_modele_Traduction(BeBot.togglePageTrad(page)) self.stats['cloture'] += 1
def newsboy(self, lecteur, msg, purge=True): """ Distribut l'infolettre """ if lecteur.isRedirectPage(): lecteur = lecteur.getRedirectTarget() if purge: self.rm_old(lecteur) lecteur.text += msg BeBot.save(lecteur, commentaire=self.resume, debug=self.debug)
def retirer_le_modele_Traduction(self, page): """ Retire le {{Traduction}} d'une page """ ns = page.namespace() if ns == 2 or ns == 3: pywikibot.output('Page utilisateur %d (retirer_modele) -> exit : %s' % (ns, b.title())) return text = self.re_trad.sub(r'', page.text) if text != page.text: page.text = text BeBot.save(page, commentaire=self.resume+' : Retrait du modèle {{Traduction}}', minor=True, debug=self.debug)
def main(): site = pywikibot.getSite() if BeBot.blocage(site): sys.exit(7) log = u'Utilisateur:BeBot/Traduction de qualité' tdq = TraductionDeQualite(site, log) tdq.run() p = pywikibot.Page(site, log) p.text = unicode(tdq) BeBot.save(p, commentaire=tdq.resume)
def suppr_mod(self, b, titres): ns = b.namespace() if ns == 2 or ns == 3: #pywikibot.output('Page utilisateur %d (suppr_mod) -> exit : %s' % (ns, b.title())) return self.retirer_le_modele_Traduction(b) # si traduction active for a in re.finditer(self.re_appel, b.text): trouve = a.group(1).encode('ascii', 'ignore') if trouve in titres: c = b.text[:a.start()] + b.text[a.end():] #BeBot.diff(b.text, c) b.text = c BeBot.save(b, commentaire=self.resume+' : Traduction abandonnée', debug=self.debug)
def put_resultats(self): """ Affichage des résultats """ total = self.resultats['nb_pages'] msg = '== Statistiques ==\nAu %s\n' % datetime.datetime.today().strftime("%d/%m/%Y") msg += "* Nombre total de pages : %i\n" % total msg += "* Par statut:\n" for c, nbpages in self.paravancement.items(): msg += "** %s : %i\n" % (c, nbpages) cat = pywikibot.Category(self.site, "Catégorie:Projet:Traduction/Articles liés") msg += "* Pages de suivi actives : %i\n" % len(list(cat.articles())) msg += "\n[[Catégorie:Maintenance du Projet Traduction|*]]\n" res = pywikibot.Page(self.site, "Projet:Traduction/Statistiques") stats = re.compile("^== Statistiques ==[^=]*", re.DOTALL|re.MULTILINE) res.text = stats.sub(r'', res.text) res.text = res.text + msg BeBot.save(res, commentaire=self.resume)
#!/usr/bin/python # -*- coding: utf-8 -*- import re, sys import BeBot import pywikibot """ Supprime un modèle et ses appels d'inclusion """ site = pywikibot.getSite() nom = u"Demande de traduction" # renom = re.compile('{{'+nom+'}}', re.IGNORECASE|re.MULTILINE) renom = re.compile("{{" + nom + "\|?[^}/]*?}}", re.IGNORECASE | re.MULTILINE) modele = pywikibot.Page(site, u"Modèle:" + nom) if not modele.exists(): pywikibot.error(u"Le modèle {nom} n'existe pas".format(nom=nom)) sys.exit(2) debug = True # Retrait des transclusions for b in modele.getReferences(follow_redirects=False, onlyTemplateInclusion=True, content=True, total=9): a = renom.sub(r"", b.text) BeBot.diff(b.text, a) b.text = a BeBot.save(b, commentaire=u'Retrait du modèle "{nom}"'.format(nom=nom), debug=debug) BeBot.delete(modele, u'Retrait du modèle "{nom}"'.format(nom=nom), debug=debug)
nom = b.title(withNamespace=False) if nb > lim_peu: classement[nom] = nb last[nom] = derniere else: peuactifs[nom] = nb classement = sorted(classement.items(), key=itemgetter(1), reverse=True) # Affichage des résultats t = '{{|class=\"wikitable sortable\"\n|+calculé le {date}\n!Nom!!Contribs ces {x} derniers jours!!Timestamp de dernière modif'.format(date=datetime.date.today().isoformat(),x=lim_jours) for nom, nb in classement: t += '\n|-\n|{{u|%s}}||%d||%s' % (nom, nb, last[nom]) t += '\n|}' t += '\n== Les bots peu actifs (moins de %d modifs) ==\n' % lim_peu t += '{{début de colonnes|nombre=3}}\n' for pa in sorted(peuactifs.keys()): t += '\n* {{u|%s}}' % pa t += '{{fin de colonnes}}\n' parser = argparse.ArgumentParser(prog='bebot') parser.add_argument('--debug', action='store_true', default=False, help="Activate debug mode (no publication)") args = parser.parse_args() if not args.debug: p.text = t BeBot.save(p, commentaire='Recalculationnement du classement', debug=False) else: print(t)
#!/usr/bin/python # -*- coding: utf-8 -*- import BeBot import pywikibot site = pywikibot.Site() page = pywikibot.Page(site, u'Utilisateur:BeBot/Test') page.text = ' ' BeBot.save(page, commentaire=u'Login', minor=True)
site = pywikibot.getSite() nom = "Utilisateur Traduction" renom = re.compile("{{" + nom + "}}", re.IGNORECASE) nom2 = "Traduction" # renom2 = re.compile(u'(\{\{Bo(î|i)te\s*(utilisateur|babel)[^\}]*?)\|\s*'+nom2+u'(\s*|/\w{2})([^\}]*\}\})', re.IGNORECASE|re.UNICODE|re.MULTILINE) renom2 = re.compile( u"(\{\{Bo(î|i)te\s*(utilisateur|babel)[^\}]*?)\|\s*" + nom2 + u"\s*([^\}/]?[^\}]*?\}\})", re.IGNORECASE | re.UNICODE | re.MULTILINE, ) modele = pywikibot.Page(site, u"Modèle:" + nom) if not modele.exists(): pywikibot.error(u"La BU {nom} n'existe pas".format(nom=nom)) sys.exit(2) # Retrait des transclusions for b in modele.getReferences(follow_redirects=False, onlyTemplateInclusion=True, content=True): # remp = r'' remp = r"{{Utilisateur Projet/Traduction}}" a = renom.sub(remp, b.text) a = renom2.sub(r"\1|Projet/Traduction\4", a) b.text = a BeBot.save( b, commentaire=u'Retrait du modèle "{nom}" suite à la restructuration du [[Projet:Traduction]]'.format(nom=nom), debug=False, ) BeBot.delete( modele, u'Retrait du modèle "{nom}" suite à la restructuration du [[Projet:Traduction]]'.format(nom=nom), debug=True )
def run(self): # Dénombrement l = {} cat = pywikibot.Category(self.site, u"Catégorie:Article par importance") for c in cat.subcategories(recurse=False): nom = c.title().split(' ')[-1] l[nom] = 0 for d in c.subcategories(): pages = self.site.categoryinfo(d)['pages'] l[nom] += pages total = 0 for a in l.values(): total += a # Sauvegarde curseur = self.conn.cursor() req = 'INSERT INTO %s' % self.nom_base \ + '(date, maximum, élevée, moyenne, faible, inconnue, total) ' \ + 'VALUES ("%s", %d, %d, %d, %d, %d, %d)' \ % (self.date.strftime("%Y-%m-%d"), l['maximum'], l['élevée'], \ l['moyenne'], l['faible'], l['inconnue'], total) try: curseur.execute(req) except sqlite3.Error as e: pywikibot.error(u"Erreur lors de l'INSERT :\n%s" % (e.args[0])) self.conn.commit() # Dessin largeur = 600 #largeur du graphique maxi = 0 #valeur max en hauteur nb_bande = 6 #nombre max de colonnes #on suppose ici un enregistrement par mois res = BeBot.charger_bdd(self.conn, self.nom_base, lim=nb_bande, ordre='"date" DESC') width = math.ceil(largeur/nb_bande) #largeur d'une bande # Liste des mois à traiter mois = [] for j in range(0, nb_bande): d = self.date + relativedelta(months=-j) mois.append(d.strftime(u"%Y-%m")) # Récupération et tri des valeurs vals = [] ri = 0 # ressource index : index sur les enregistrements utilisés for m in mois: val = {} if m != res[ri]['date'][0:7]: for k in res[ri].keys(): val[k] = 0 val['date'] = m + u"-02" else: for k in res[ri].keys(): val[k] = res[ri][k] if maxi < val['total']: maxi = val['total'] # point le plus haut ri = ri + 1 vals.append(val) vals.reverse() #Majoration du maximum t = maxi rang = 0 while t > 1: t = math.ceil(t/10) rang +=1 graduation = pow(10, rang-2) maxi = maxi + math.floor(graduation/2) maxi = int(math.floor(maxi*pow(10,3-rang))*pow(10,rang-3)) # 3 premiers chiffre significatifs self.msg = dedent(u""" <timeline> Colors= id:lightgrey value:gray(0.9) id:darkgrey value:gray(0.7) id:sfondo value:rgb(1,1,1) id:barra value:rgb(0.7,0.9,0.7) legend:Total id:rouge value:rgb(1,0,0) legend:Max+Élevée id:gris value:rgb(0.95,0.95,0.95) ImageSize = width:%d height:300 Define $width = %d PlotArea = left:60 bottom:20 top:20 right:10 DateFormat = x.y Period = from:0 till:%d TimeAxis = orientation:vertical AlignBars = justify ScaleMajor = gridcolor:darkgrey increment:%d start:0 ScaleMinor = gridcolor:lightgrey increment:%d start:0 BackgroundColors = canvas:sfondo Legend = left:70 top:295"""[1:] % (largeur, width, maxi, graduation, graduation/2) ) #Nom des bars self.msg += '\nBarData=\n' for r in range(0, nb_bande): p = '' if r % 2 == 1: spl = vals[r]['date'].split('-') p = spl[1] + '/' + spl[0][2:] self.msg += ' bar:%d text:%s\n' % (r+1, p) #Valeurs : total self.msg += '\nPlotData=\n color:barra width:$width align:left\n\n' for r in range(0, nb_bande): p = vals[r]['total'] self.msg += ' bar:%d from:0 till: %d\n' % (r+1, p) #Valeurs : importants self.msg += '\nPlotData=\n color:rouge width:$width align:left\n\n' for r in range(0, nb_bande): p = vals[r]['maximum'] + vals[r]['élevée'] self.msg += ' bar:%d from:0 till: %d\n' % (r+1, p) #Labels self.msg += '\nPlotData=\n' for r in range(0, nb_bande): if r % 2 == 1: p = vals[r]['total'] s = self.nombreverschaine(p) self.msg += ' bar:%d at: %d fontsize:S text:"%s" shift:(-20,5)\n' % (r+1, p, s) q = vals[r]['maximum'] + vals[r]['élevée'] s = self.nombreverschaine(q) self.msg += ' bar:%d at: %d fontsize:S text:"%s" shift:(-20,5)\n' % (r+1, q, s) self.msg += '</timeline>' # Publication page = pywikibot.Page(self.site, 'Projet:Évaluation/Évolution') page.text = BeBot.ER_BotSection.sub(self.BotSectionEdit, page.text) BeBot.save(page, commentaire=self.resume, debug=False)
def traduit_de(self, page): """ Vérifie et ajoute le {{Traduit de}} à la page de discussion """ disc = pywikibot.Page(self.site, page.title().replace('/Traduction', '')) if disc.isRedirectPage(): disc = disc.getRedirectTarget() m = self.re_traduitde.search(disc.text) if not m: n = self.re_suivi.search(page.text) # Récupération des infos de traduction if n: a = BeBot.modeletodic(n.group(0)) if not a.has_key(1) or not a.has_key(2): pywikibot.warning(";;; Impossible de trouver le nom ou la langue d'origine pour %s" % page.title()) return False langue = a[1] article = a[2].replace('_', ' ') if 'status' in a: statut = a['status'] else: pywikibot.output(";;; Statut introuvable -> on passe") pywikibot.output(a) return False if statut == "1": pywikibot.output(";;; Statut 'Demande' -> ne pas ajouter le {{Traduit de}}") return True plus = '' if a.has_key('oldid') and a['oldid'] != '' and a['oldid'] != '830165' : # On utilise le oldid pour retrouver la date oldid = a['oldid'] if self.sites.has_key(langue): sit = self.sites[langue] else: sit = pywikibot.Site(langue) self.sites[langue] = sit orig = pywikibot.Page(sit, article) if orig.isRedirectPage(): orig = orig.getRedirectTarget() date = '' try: for o in orig.fullVersionHistory(): revis = o[0] if revis == oldid: date = o[1] break; except: #Nopage pywikibot.warning(";;; Impossible de lire l'historique pour %s:%s" % (langue, orig.title())) return False #pywikibot.output(date.__str__()[8:10]) date = date.__str__() if date != '': jour = date[8:10].lstrip('0') mois = date[5:7].lstrip('0') annee = date[0:4] plus = "|%s/%s/%s|%s" % (jour, mois, annee, oldid) else: pywikibot.warning("Ne peut dater une ancienne révision de %s" % page.title()) appel = '{{Traduit de|%s|%s%s}}\n' % (langue, article, plus) #BeBot.diff(disc.text, appel + disc.text) disc.text = appel + disc.text BeBot.save(disc, commentaire=self.resume+' : Ajout du bandeau de licence', debug=self.debug) self.stats['traduitde'] += 1 return True else: pywikibot.warning('Impossible de trouver les infos de traduction pour %s' % page.title()) return True
opts, args = getopt.getopt(sys.argv[1:], "") except getopt.GetoptError, err: print str(err) usage() sys.exit(2) if len(args) > 0: wikis = args else: wikis = ['nl'] log = u'' for cl in wikis: pywikibot.output( u"== WP:%s ..." % cl ) try: lq = ListageQualite(pywikibot.Site(cl)) except: continue lq.run() lq.page_projet.text = lq.publier() BeBot.save(lq.page_projet, commentaire=u'Mise à jour mensuelle des listings') log += unicode(lq) pywikibot.Page(pywikibot.Site('fr'), \ u'Utilisateur:BeBot/Listage qualité').put(log, \ comment=lq.resume, minorEdit=False) if __name__ == "__main__": try: main() finally: pywikibot.stopme()