recents.py 6.92 KB
Newer Older
Linedwell's avatar
Linedwell committed
1 2 3
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Ce script parcourt la [[Catégorie:Événement récent]] et ses sous-catégories pour retirer le bandeau au bout de 15j
4 5


Linedwell's avatar
Linedwell committed
6
# (C) Linedwell, 2011-2015
7 8 9 10
#
# Distribué sous licence GNU GPLv3
# Distributed under the terms of the GNU GPLv3 license
# http://www.gnu.org/licenses/gpl.html
Linedwell's avatar
Linedwell committed
11 12 13 14 15 16 17 18 19 20 21 22

import sys
sys.path.insert(1, '..') #ajoute au PYTHONPATH le répertoire parent

import re, time
from datetime import date, datetime, timedelta

import pywikibot
from pywikibot import pagegenerators

import callback
import ignoreList
23
import logger
Linedwell's avatar
Linedwell committed
24 25

# Déclarations
26
site = pywikibot.Site('fr','wikipedia')
Linedwell's avatar
Linedwell committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
nbrModif = 0
nbrTotal = 0
ignoreList = ignoreList.ignoreList

# Modification du wiki
def removeTemplate(pagesList,catname,delay,checkTalk=False):
    global nbrModif,nbrTotal
    
    log = u''
    summary = u''
    limit = calcLimit(delay)
    motif = motifFinder(catname)
    
    for page in pagesList:
        if not page.title() in ignoreList:
            
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
            try:
                pageTemp = page.get()
        
            except pywikibot.NoPage:
                pywikibot.output(u"Page %s does not exist; skipping."
                             % page.title(asLink=True))
            except pywikibot.IsRedirectPage:
                pywikibot.output(u"Page %s is a redirect; skipping."
                             % page.title(asLink=True))
            except pywikibot.LockedPage:
                pywikibot.output(u"Page %s is locked; skipping."
                             % page.title(asLink=True))
            else:
            
                if page.editTime() < limit:
                    if checkTalk:
                        talk = page.toggleTalkPage()
Linedwell's avatar
Linedwell committed
60
                    if not checkTalk or not talk.exists() or talk.editTime() < limit:
61 62 63
                        nbrTotal += 1
                        lastEdit = page.editTime()
                        duration = calcDuration(lastEdit)
64
                        c = callback.Callback() #(re)init de c
65
                        for m in motif:
66
                            parser = re.compile(r'{{' + m + r'.*?}}(\r\n|\n|\ |(?={{))',re.I | re.U | re.DOTALL)
67 68 69 70 71 72 73 74
                            searchResult = parser.search(pageTemp) #On cherche si le motif {{m}} existe dans la page
                            if searchResult:
                                templateResult = searchResult.group()
                                pageTemp = parser.sub('',pageTemp,1) #Retire la 1re occurrence du motif dans la page
                                
                                templateResult = templateResult.replace('\r\n','') #Retire les sauts de ligne contenus dans le modèle avant de l'ajouter au résumé
                                templateResult = templateResult.replace('\n','') #Correspond au second type de retour à la ligne
                                
75
                                summary = u"Retrait du bandeau %s (non modifié depuis %s jours)." %(templateResult,duration.days)
76 77 78
                                
                                c = callback.Callback()
                                
79 80
                                page.text = pageTemp
                                page.save("[[WP:Bot|Robot]] : " + summary, callback=c)
81 82
                                break
                            else:
83
                                summary = u"Aucun modèle trouvé correspondant au motif: " + str(motif)
84 85 86
                
                        if c.error == None:
                            nbrModif += 1
87
                            status = "{{Y&}}"
88
                        else:
89 90
                            status = "{{N&}}"
                        log += u"*%s [[%s]] : %s\n" %(status,page.title(),summary.replace('{{','{{m|'))
Linedwell's avatar
Linedwell committed
91
        else:
92
            print u"Skipping [[" + page.title() + "]], page in ignore list."
Linedwell's avatar
Linedwell committed
93 94 95 96 97 98 99

    return log
	

#Retourne le motif correspondant au(x) modèle(s) catégorisant(s) dans la catégorie donnée 	
def motifFinder(catname):
	motif = []
100
	if catname == u"Événement récent":
101
		motif = [u'(Section )?[Éé]v[éè]nements?[_ ]récents?']
Linedwell's avatar
Linedwell committed
102

103
	elif catname == u"Mort récente":
Linedwell's avatar
Linedwell committed
104 105
		motif = [u'Mort[_ ]récente?', u'Décès[_ ]récent']
		
106
	elif catname == u"Élection récente":
Linedwell's avatar
Linedwell committed
107 108
		motif = [u'[Éé]lection[_ ]récente']
		
109
	elif catname == u"Compétition sportive récente":
Linedwell's avatar
Linedwell committed
110 111
		motif = [u'Compétition[_ ]sportive[_ ]récente', u'[Éé]v[éè]nement[_ ]sportif[_ ]récent']
	
112
	elif catname == u"Wikipédia:Triple révocation":
Linedwell's avatar
Linedwell committed
113 114
		motif = [u'Règle[_ ]des[_ ]3[_ ]révocations', u'Règle[_ ]des[_ ]3[_ ]reverts', u'Règle[_ ]des[_ ]3[_ ]réverts', u'Règle[_ ]des[_ ]trois[_ ]reverts', u'Règle[_ ]des[_ ]trois[_ ]réverts', u'R3R', u'3RR']
		
115
	elif catname == u"Article en travaux":
116
		motif = [u'(En[_ ])?travaux', u'En[_ ]construction', u'Pas[_ ]fini', u'Travail[_ ]de[_ ]groupe']
Linedwell's avatar
Linedwell committed
117
		
118
	elif catname == u"Article en cours":
Linedwell's avatar
Linedwell committed
119 120 121 122 123 124
		motif = [u'En[_ ]cours', u'Plusieurs[_ ]en[_ ]cours']
		
	return motif

#Retourne la date avant laquelle on considère obsolète l'usage du modèle
def calcLimit(delay):
125
	today = datetime.utcnow()
Linedwell's avatar
Linedwell committed
126 127 128 129 130
	limite = today - timedelta(seconds=delay)
	return limite
	
#Retourne le temps écoulé entre une date et le jour courant
def calcDuration(date):
131
	today = datetime.utcnow()
Linedwell's avatar
Linedwell committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
	duration = today - date
	return duration
	
# Récupération des pages de la catégorie
def crawlerCat(category, delay,subcat=False,checkTalk=False):
    log = u''
    cat = pywikibot.Category(site,category)
    pagesInCat = list(cat.articles(False))
    pagesList = pagegenerators.PreloadingGenerator(pagesInCat) # On génère la liste des pages incluses dans la catégorie
    pagesList = pagegenerators.NamespaceFilterPageGenerator(pagesList,[0]) #On ne garde que les articles (Namespace 0)
    log += removeTemplate(pagesList,cat.title(withNamespace=False),delay,checkTalk)
    
    if subcat:
        subcat -= 1
        subcategories = list(cat.subcategories())
        for subc in subcategories:
            log += crawlerCat(subc.title(withNamespace=False), delay, subcat, checkTalk)

    return log

# Exécution
def main():
    log = u''
    timeStart = time.time()
    log += crawlerCat(u'Événement récent',1296000,1,False) #15 jours, inclusion des sous-catégories de 1er niveau
    log += crawlerCat(u'Catégorie:Wikipédia:Triple révocation',2592000,False,True) #30 jours, inclusion des PdD associées aux articles
158 159
    log += crawlerCat(u'Article en travaux',1296000,False,True) #15 jours, inclusion des PdD associées aux articles
    log += crawlerCat(u'Article en cours',604800,False,True) #7 jours, inclusion des PdD associées aux articles
Linedwell's avatar
Linedwell committed
160
    timeEnd = time.time()
161 162
    logger.setValues(nbrTotal,nbrModif)
    logger.editLog(site,log)
Linedwell's avatar
Linedwell committed
163

164
    print u"%s (of %s) pages were modified in %s s." %(nbrModif,nbrTotal,round(timeEnd-timeStart,2))
Linedwell's avatar
Linedwell committed
165 166 167 168 169 170 171


if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme()