Utilisateur:Ske/watch.py
Un article de Wikipédia, l'encyclopédie libre.
Petit script que j'utilise pour mettre à jour Wikipédia:Maintenance des bandeaux. Je le fais tourner sur mac, il faudra prévoir quelques adaptation pour le faire fonctionner sur une autre machine.
# *-* coding: mac_roman *-* # open a webpage (from PythonWikipediaBot) # import urllib, re, sets class MyURLopener(urllib.FancyURLopener): version="PythonWikipediaBot/1.0" def getUrl( url): uo = MyURLopener() f = uo.open(url) text = f.read() # Find charset in the content-type meta tag contentType = f.info()['Content-Type'] R = re.compile('charset=([^\'\"]+)') m = R.search(contentType) if m: charset = m.group(1) else: print "WARNING: No character set found" # UTF-8 as default charset = 'utf-8' # Convert HTML to Unicode try: text = unicode(text, charset, errors = 'strict') except UnicodeDecodeError, e: print e print (u'ERROR: Invalid characters found on %s, replaced by \\ufffd.' % url) # We use error='replace' in case of bad encoding. text = unicode(text, charset, errors = 'replace') return text # # parse li tags # import HTMLParser class liParser (HTMLParser.HTMLParser): def reset( self ): self.curLine = [] self.result = [] self.li = False HTMLParser.HTMLParser.reset(self) def handle_starttag(self, tag, attrs): if tag=="li": self.li = True def handle_endtag(self, tag,): if tag=="li": self.li = False if self.curLine: self.result.append(u"".join(self.curLine )) self.curLine = [] def handle_data(self, data): if self.li: self.curLine.append(data) # # remove non-encyclopedic namespaces # def clearNamespaces(lines): removable = (u"Wikip\xe9dia:", u"Utilisateur:", u"Discuter:", u"Discussion Mod\xe8le:", u"Mod\xe8le:", u"Aide:", u"Cat\xe9gorie:", u"Discussion Utilisateur:", u"Discussion Wikip\xe9dia:") result = [] for l in lines: append = True for tag in removable: if l.startswith(tag): append = False break if append: if l.endswith("(inclusion) "): l = l[:-13] result.append(l) return result # # return the articles wich are lised since more than n days # import time,pickle def compare_old (data, old_path, days): # read old articles olds = {} try: f = open(old_path) except IOError: pass else: olds = pickle.load(f) f.close() now = time.time() / (24*60*60) reolds = {} result = sets.Set() for x in data: try: date = olds[x] if now-date>days: result.add(x) except KeyError: date = now reolds[x]=date f = open(old_path, "w") pickle.dump(reolds, f) result = list(result) result.sort() return result # # # import os,tempfile def list_link(output, target, old_path, days, header): url = url = "http://fr.wikipedia.org/w/index.php?title=Special:Whatlinkshere/%s&limit=900&from=0"%target txt = getUrl(url) start = txt.index("<!-- start content -->") end = txt.index("<!-- end content -->") txt = txt[start:end] #print repr(txt) parser = liParser() parser.feed(txt) result = clearNamespaces(parser.result) #print result result = compare_old(result, old_path, days) print result if result: output.write(header.encode('utf_16')) for i in result: line = u"* [[:"+i+u"]]\n" output.write(line.encode('utf_16')) return result # # # f,path = tempfile.mkstemp( ".txt", "") f = os.fdopen(f, "w") header_wikt = u""" ==Wiktionnaire== ''Cette section liste les articles possédant un bandeau "pour wiktionnaire" depuis plus d'une semaine. Vous êtes invités à faire ce transfert au plus tôt.'' """ list_link(f, "Mod%C3%A8le:Pour_Wiktionnaire", "./pour_wikt", 7, header_wikt) header_wikisource = u""" ==Wikisource== ''Cette section liste les articles possédant un bandeau "pour wikisource" depuis plus d'une semaine. Vous êtes invités à faire ce transfert au plus tôt.'' """ list_link(f, "Mod%C3%A8le:Pour_Wikisource", "./pour_wikisource", 7, header_wikisource) header_supression = u""" ==Pages à supprimer== ''Cette section liste les articles possédant un bandeau "supprimer" depuis plus d'un mois. La page devrait être effacées par un administrateur ou le bandeau devrait être retiré.'' """ list_link(f, "Mod%C3%A8le%3ASuppression", "./supression", 30, header_supression) header_supimg = u""" ==Images à supprimer== ''Cette section liste les images possédant un bandeau "suppression images" depuis plus d'un mois. L'image devrait être effacées par un administrateur ou le bandeau devrait être retiré.'' """ list_link(f, "Mod%C3%A8le:Suppression_image", "./supimg", 30, header_supimg) header_licence = u""" ==Images avec un problème de licence== ''Cette section liste les images possédant un bandeau "licence inconnue" depuis plus d'un mois. L'image devrait être effacées par un administrateur ou le bandeau devrait être retiré.'' """ list_link(f, "Mod%C3%A8le:Licence_inconnue", "./lienceimg", 30, header_licence) header_copie_site = u""" ==Copie de site== ''Cette section liste les articles possédant un bandeau "copie de site" depuis plus d'une semaine. Elles vont être effacées par un administrateur si aucune autorisation n'a été fournie.'' """ list_link(f, "Mod%C3%A8le%3ACopie_de_site", "./copie_site", 7, header_copie_site) header_copyright = u""" ==Copyright== ''Cette section liste les articles possédant un bandeau "copie à vérifier" depuis plus d'une semaine. Elles devraient être proposées sur [[Wikipédia:Pages à supprimer]] si aucune autorisation n'a été fournie.'' """ list_link(f, "Mod%C3%A8le:Copie_%C3%A0_v%C3%A9rifier", "./copyright", 7, header_copyright) ## TODO faire un outil pour lister automatiquement les pages sur [[Wikipédia:Pages à supprimer]] ? f.close() os.system("open "+path)