Usuari:PereBot/robot puntuador repte 2015

El resultat d'executar aquest bot és a Usuari:PereBot/punts viquirepte 2015.

# -*- coding: utf-8 -*-

import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,json,pickle,math

# Elimina duplicats d'una llista
def unic(llista):
    llistanova=[]
    for el in llista:
        if not el in llistanova:
            llistanova.append(el)
    return llistanova

# Elimina l'enllaç d'un text. Funciona bé si hi ha un sol enllaç.
# Deixa el text que mostra l'enllaç (no on apunta)
def eliminaenllac(nom):
    nom=re.sub(u"\[\[.*\|","",nom)
    nom=nom.replace("[[","")
    nom=nom.replace("]]","")
    return nom

def plant(tit):
    return pywikibot.Page(site,u"Plantilla:{}".format(tit))

# Llegeix la llista de monuments sencera, tot i que només retorna els enllaços
def llegeixllista(pag): ##,llistafotos,minfotos
    origen=pag.title()
    tottemp=pag.templatesWithParams()
    llistatits=[]
    informe=u""         # Descripcions de les categories a crear.
    resumllista=u""     # Resum estadístic de les categories a crear per una llista.
    numcats=0           # Comptador pel nombre de categories en una llista.
    ccatllista=u""      # Categoria de Commons que correspon a la llista d'acord amb la plantilla Commonscat.
    classe=u""
    if re.search("Catalunya Nord|Pirineus Orientals",origen):
        regio=u"_region:FR-66"
    elif re.search("Catalunya|Osona|Pallars|Terres de l'Ebre|Costa (Brava|Daurada)|Barcelon",origen):
        regio=u"_region:ES-CT"
    elif re.search("Val[eè]nci[aà]|Alacant|[Pp]rovíncia de Castelló|Costa (dels Tarongers|Blanca)",origen):
        regio=u"_region:ES-CV"
    elif re.search("Balears|Mallorca|Menorca|Eivissa|Formentera",origen):
        regio=u"_region:ES-IB"
    elif re.search("Andorra",origen):
        regio=u"_region:AD"
    else:
        regio=u""
    for i in range(0, len(tottemp)):
        classe0=u""
        if tottemp[i][0]==plant(u'Filera art públic'):
            classe0=u"art"
        if tottemp[i][0]==plant(u'Filera IPA') or tottemp[i][0]==plant(u'Filera MH') or tottemp[i][0]==plant(u'Filera BIC') or tottemp[i][0]==plant(u'Filera BIC Val') or tottemp[i][0]==plant(u'Filera BIC And') or tottemp[i][0]==plant(u'filera BC Sard') or tottemp[i][0]==plant(u'filera BIC-ZA'):
            classe0=u"monument"
#            print u"MONUMENT"
        if tottemp[i][0]==plant(u'Filera patrimoni natural'):
            classe0=u"natural"
        if classe0!=u"":
            classe=classe0
#            print u"classe:",classe
    #        print tottemp[i][1]
            proposta=""
            nom=""
            nomcoor=""
            nomnet=""
            lloc=""
            municipi=""
            lat=""
            lon=""
            idd=""
            codi=""
            idurl=""
            imatge=""
            autor=""
            data=""
            descripcio=""
            material=""
            commonscat=""
            enllac=""
            tipus=""
            dimensions=""
            coorddim=""
            coordtype=""
            #print tottemp[i][1]
            for j in range(0,len(tottemp[i][1])):       # llegeix la taula i n'extreu els camps
                camp=tottemp[i][1][j].replace(u"\n","")
                camp=camp.replace("<br/>",". ")
                camp=camp.replace("<br />",". ")
                camp=re.sub(u"<ref name.*>.*<.*>","",camp)
                camp=re.sub(u"<ref ?>.*<.*>","",camp)
                camp=re.sub(u"<.*>","",camp)
                #print camp
                if re.search(u"coord-nom *?=",camp):
                    nomcoor=re.sub(u"^ *?coord-nom *?= *?","",camp)
                    nomcoor=nomcoor.strip()
    #                print nomcoor
                elif re.search(u"nom *?=",camp):
                    nom=re.sub(u" *?nom *?= *?","",camp)
                    nom=re.sub(u"<ref name.*>.*<.*>","",nom)
                    nom=re.sub(u"<ref ?>.*<.*>","",nom)
                    nom=re.sub(u"<.*>","",nom)
                    nom=nom.strip()
                    #print nom
                    if re.search(u"\[\[.*\]\]",nom):
                        enllac=re.sub(u"^.*?\[\[","",nom)
                        enllac=re.sub(u"\]\].*?$","",enllac)
                        enllac=re.sub(u"\|.*?$","",enllac)
                        nomnet=eliminaenllac(nom)
    #                    print enllac
                    else:
                        nomnet=nom
                elif re.search(u"nomcoor *?=",camp):
                    nomcoor=re.sub(u"^ *?nomcoor *?= *?","",camp)
                    nomcoor=nomcoor.strip()
    #                print nomcoor
                elif re.search(u"municipi *?=",camp):
                    municipi=re.sub(u"^ *?municipi *?= *?","",camp)
                    municipi=eliminaenllac(municipi)
                    municipi=municipi.strip()
    #                print municipi
                elif re.search(u"lloc *?=",camp):
                    lloc=re.sub(u"^ *?lloc *?= *?","",camp)
                    lloc=eliminaenllac(lloc)
                    lloc=lloc.strip()
    #                print lloc
                elif re.search(u"lat *?=",camp):
                    lat=re.sub(u"^ *?lat *?= *?","",camp)
                    lat=lat.replace(" ","")
    #                print lat
                elif re.search(u"lon *?=",camp):
                    lon=re.sub(u"^ *?lon *?= *?","",camp)
                    lon=lon.replace(" ","")
    #                print lon
                elif re.search(u"idurl *?=",camp):
                    idurl=re.sub(u"^ *?idurl *?= *?","",camp)
                    idurl=idurl.replace(" ","")
    #                print idurl
                elif re.search(u"id *?=",camp):
                    idd=re.sub(u"^ *?id *?= *?","",camp)
                    idd=idd.replace(" ","")
    #                print idd
                elif re.search(u"descripció *?=",camp):
                    descripcio=re.sub(u"^ *?descripció *?= *?","",camp)
                    descripcio=descripcio.strip()
    #                print descripcio
                elif re.search(u"codi *?=",camp):
                    codi=re.sub(u"^ *?codi *?= *?","",camp)
                    codi=codi.replace(" ","")
    #                print codi
                elif re.search(u"data *?=",camp):
                    data=re.sub(u"^ *?data *?= *?","",camp)
                    data=data.strip()
    #                print data
                elif re.search(u"material *?=",camp):
                    material=re.sub(u"^ *?material *?= *?","",camp)
                    material=eliminaenllac(material)
                    material=material.strip()
    #                print material
                elif re.search(u"autor *?=",camp):
                    autor=re.sub(u"^ *?autor *?= *?","",camp)
                    autor=eliminaenllac(autor)
                    autor=autor.strip()
    #                print autor
                elif re.search(u"imatge *?=",camp):
                    imatge=re.sub(u"^ *?imatge *?= *?","",camp)
                    if not(re.search(u"..",imatge)):
                        imatge=""
    #                print imatge
                elif re.search(u"commonscat *?=",camp):
                    commonscat=re.sub(u"^ *?commonscat *?= *?","",camp)
                    commonscat=commonscat.strip()
                    if not(re.search(u"..",commonscat)):
                        commonscat=""
    #                print commonscat
                elif re.search(u"tipus *?=",camp):
                    tipus=re.sub(u"^ *?tipus *?= *?","",camp)
                    tipus=tipus.strip()
                    if not(re.search(u"..",tipus)):
                        tipus=""
    #                print tipus
                elif re.search(u"coord-dim *?=",camp):
                    coorddim=re.sub(u"^ *?coord-dim *?= *?","",camp)
                    coorddim=coorddim.strip()
                    if not(re.search(u"..",coorddim)):
                        coorddim=""
    #                print coorddim
                elif re.search(u"coord-type *?=",camp):
                    coordtype=re.sub(u"^ *?coord-type *?= *?","",camp)
                    coordtype=coordtype.strip()
                    if not(re.search(u"..",coordtype)):
                        coordtype=""
    #                print coordtype
                if (classe0=="art" or classe0=="monument") and coordtype=="":
                    coordtype="landmark"
##            numfotos=llistafotos.count(idd)
#            print nomcoor ##+": "+'{:}'.format(numfotos)+" fotos"
            if u"#" in enllac:
                enllac=re.split(u"#",enllac)[0]
            if enllac<>u"":
                #enllac=enllac[0].upper()+enllac[1:] #Anul·lat perquè ja normalitzarà l'API
                llistatits.append(enllac)
    return llistatits


# Torna el diccionari d'edicions d'un article a partir del títol de article
def llegeixhist(tit):
    diccart={}
    diccart["u"]={}
    pagweb="https://ca.wikipedia.org/w/api.php?action=query&prop=revisions&titles={}&rvlimit=50&rvprop=timestamp%7Cuser%7Csize&format=json".format(tit.encode('utf-8'))
    try:
        pllista=urllib.urlopen(pagweb)
    except IOError:
        print u"IOError. Tornem a provar"
        pllista=urllib.urlopen(pagweb)
    #print "obert"
    pbrut=pllista.read()
    if '"normalize"' in pbrut or '"redirects"' in pbrut:
        print u"PERILL: redirecció o títol per normalitzar:",pbrut
    jhist=json.loads(pbrut)
    #print jhist
    idd=jhist["query"]["pages"].keys()[0]
    revs=jhist["query"]["pages"][idd]["revisions"]
    darreradata=revs[0]["timestamp"]
    diccart["data"]=darreradata
    for i,rev in enumerate(revs):
        data=rev["timestamp"]
        if "2015-1" in data:
            continue
        elif not "2015-09" in data and (not "2015-08-31T22" in data) and (not "2015-08-31T23" in data): #Timestamp és UTC i concurs CEST:
            print i,"edicions llegides (trencament)"
            break
        usuari=rev["user"]
        if i==len(revs)-1:
            diccart["creador"]=usuari
            delta=rev["size"]
        else:
            delta=rev["size"]-revs[i+1]["size"]
        if usuari in diccart["u"].keys():
            diccart["u"][usuari]["edicions"]=diccart["u"][usuari]["edicions"]+1
            diccart["u"][usuari]["increment"]=diccart["u"][usuari]["increment"]+delta
        else:
            diccart["u"][usuari]={}
            diccart["u"][usuari]["edicions"]=1
            diccart["u"][usuari]["increment"]=delta
    print i,"edicions llegides (final)"
    return diccart


# A partir d'una llista d'articles torna un diccionari d'edicions
def diccedicionsapi(titarticles,dicc):
    titsapi=""
    comptatits=0
    for i,tit in enumerate(sorted(titarticles)):
        if u"#" in tit:
            titnet=re.split(u"#",tit)[0]
            if len(tit)==0:
                continue
            try:
                titarticles.remove(tit)
            except ValueError:
                print u"ERROR: en voler treure:",tit,"de la llista (enllaçat a secció)"
            titarticles.append(titnet)
            tit=titnet
        if u"&" in tit:
            print u"PERILL: & al títol de la llista (obviat):",tit #Solució de contingència. S'hauria de trobar com tractar aquest cas.
            continue
        titsapi=titsapi+u"|"+tit
        comptatits=comptatits+1
        #print comptatits,tit
        if comptatits>=48 or i==len(titarticles)-1:
            titsapi=titsapi[1:]
            #print u"titsapi:",titsapi
            titsapistr=titsapi.encode('utf-8')
            pagweb="https://ca.wikipedia.org/w/api.php?action=query&prop=revisions&titles={}&redirects=si&rvprop=timestamp%7Cuser%7Csize&format=json".format(titsapistr)
            try:
                pllista=urllib.urlopen(pagweb)
            except IOError:
                print u"IOError. Tornant a provar."
                pllista=urllib.urlopen(pagweb)
            print "obert"
            pbrut=pllista.read()
            jpag=json.loads(pbrut)
            #print jpag
            comptatits=0
            if "normalized" in jpag["query"].keys():
                for parell in jpag["query"]["normalized"]:
                    try:
                        titarticles.remove(parell["from"])
                        titarticles.append(parell["to"])
                        print u"normalitzat",parell
                    except ValueError:
                        print u"ERROR: en normalitzar:",parell,"no és a la llista"
            if "redirects" in jpag["query"].keys():
                for parell in jpag["query"]["redirects"]:
                    try:
                        titarticles.remove(parell["from"])
                        titarticles.append(parell["to"])
                        print u"redirigit",parell
                        if u"#" in titarticles[-1]:
                            print u"PERILL:",titarticles[-1],u"enllaçat a secció"
                    except ValueError:
                        print u"ERROR: en redirigir",parell,"no és a la llista"
            jpag=jpag["query"]["pages"]
            print len(jpag.keys()),u"articles en aquest bloc"
            for clau in jpag.keys():
                ptit=jpag[clau]["title"]
                if not ptit in titarticles:
                    print u"ERROR: títol",ptit,"a l'API però no a la llista"
                    print u"La llista era:",titsapi
                #print ptit
                try:
                    rev=jpag[clau]["revisions"][0]
                except KeyError:
                    print ptit,u"No hi ha revisions:"
                    #print jpag[clau]
                    continue
                #print rev
                mida=rev["size"]
                rtemps=rev["timestamp"]
                print ptit,rtemps,mida
                if (not "2015-09" in rtemps) and (not "2015-1" in rtemps) and rtemps<>"":
                    if (not "2015-08-31T22" in rtemps) and (not "2015-08-31T23" in rtemps): #Timestamp és UTC i concurs CEST
                        print u"sense edicions recents"
                        continue
                if ptit in dicc.keys():
                    if "data" in dicc[ptit].keys():
                        if dicc[ptit]["data"]==rtemps:
                            print u"sense canvis"
                            continue
                print u"amb canvis"
                dicc[ptit]=llegeixhist(ptit)
            titsapi=""
    #print dicc
    return titarticles,dicc

# A del diccionari d'edicions fa la taula de puntuacions
def diccapunts(titarticles,dicc):
    taula={}
    punts={}
    print u"Comencem a comptar punts"
    for tit in sorted(titarticles):
        print tit
        if not tit in dicc.keys():
            print u"article inexistent"
            continue
        article=dicc[tit]
        #print article
        if "creador" in article.keys():
            creador=article["creador"]
        else:
            creador=""
        if "u" in article.keys():
            for usuari in article["u"].keys():
                ed=article["u"][usuari]["edicions"]
                #print usuari
                if usuari==creador:
                    cr=1
                else:
                    cr=0
                increment=article["u"][usuari]["increment"]
                if increment>0:
                    incr=int(math.floor(increment/1000)*10)
                else:
                    incr=0
                if incr==0 and cr==0:
                    revisa=1
                else:
                    revisa=0
                #if usuari=="VriuBot": #Per comprovar
                #    print article #
                #    print (usuari==creador),usuari,creador
                #print tit,usuari,ed,cr,revisa,incr,cr+revisa+incr
                if not usuari in taula.keys():
                    taula[usuari]=u'{| class="wikitable sortable collapsible collapsed"\n|-\n'
                    taula[usuari]=taula[usuari]+u"! width=400; align=center|Article !! Punts per<br/> article nou !! Punts per octets<br/>(10 cada 1.000) !!  Punts per <br/>revisió d'article!! Total\n"
                linia=u"|-\n|[[{}]] ({} ed, {} oct)\n|{}\n|{}\n|{}\n|{}\n".format(tit,ed,increment,cr,incr,revisa,cr+revisa+incr)
                #print linia
                taula[usuari]=taula[usuari]+linia
                if not usuari in punts.keys():
                    punts[usuari]={}
                    punts[usuari]["art"]=0
                    punts[usuari]["ed"]=0
                    punts[usuari]["increment"]=0
                    punts[usuari]["cr"]=0
                    punts[usuari]["incr"]=0
                    punts[usuari]["revisa"]=0
                punts[usuari]["art"]=punts[usuari]["art"]+1
                punts[usuari]["ed"]=punts[usuari]["ed"]+ed
                punts[usuari]["increment"]=punts[usuari]["increment"]+increment
                punts[usuari]["cr"]=punts[usuari]["cr"]+cr
                punts[usuari]["incr"]=punts[usuari]["incr"]+incr
                punts[usuari]["revisa"]=punts[usuari]["revisa"]+revisa
    text=u"{{Usuari:PereBot/punts viquirepte 2015/encapçalament}}\n\n"
    text=text+u"Actualitzat: --~~~~\n\n"
    for usuari in sorted(taula.keys()):
        art=punts[usuari]["art"]
        ed=punts[usuari]["ed"]
        increment=punts[usuari]["increment"]
        cr=punts[usuari]["cr"]
        incr=punts[usuari]["incr"]
        revisa=punts[usuari]["revisa"]
        text=text+u"===[[Usuari:{}|{}]] {} punts===\n".format(usuari,usuari,cr+revisa+incr)
        text=text+taula[usuari]
        text=text+u"|-\n! TOTAL ({} art, {} ed, {} oct)!! {} !! {}  !!{}!!{}\n".format(art,ed,increment,cr,incr,revisa,cr+revisa+incr)
        text=text+u"\n|}\n\n"
    return text


# El programa comença aquí.
# Llegeix articles i dades arxivades
try:
    fitx=open("puntuador2015.txt",'r')
    artentren,diccedits=pickle.load(fitx)
    fitx.close()
except IOError:
    print u"Fitxer no trobat. Actualització completa."
    artentren=[]
    diccedits={}
print len(artentren)
# Comença a llegir articles de les llistes
reiniciar=True #CANVIAR: True per reiniciar llista (no el diccionari) i llegir les llistes de monuments
if reiniciar==True:
    artentren=[] 
    llegir=True 
    lloc=u"Llistes de monuments"
    paginaunica=False
else:
    llegir=False #CANVIAR: True per llegir les llistes de monuments quan no es reinicia
    lloc=u"Llistes de monuments" #CANVIAR
    paginaunica=False        #CANVIAR: True si lloc és una llista de monuments, False si és una categoria de llistes
site=pywikibot.getSite('ca')
if paginaunica:
    llista=pywikibot.Page(site,lloc)
    print llista
    artentren=artentren+llegeixllista(llista)
    print len(artentren)
elif llegir==True:
    l=catlib.Category(site,lloc).articlesList(recurse=5) 
    #print l
    vistos=[]
    for llista in pagegenerators.PreloadingGenerator(l):
        print llista
        if llista.namespace()==0 and not llista in vistos:
            artentren=artentren+llegeixllista(llista)
            vistos.append(llista)
print len(artentren)
artentren=unic(artentren)
print len(artentren)
#print artentren
# publica la llista d'articles (desactivat)
infllista=u"]]\n#[[".join(artentren)
infllista=u"#[["+infllista+u"]]\n"
paginforme=pywikibot.Page(site,u"Usuari:PereBot/proves")
#paginforme.put(infllista,u"Robot provant de recollir la llista d'articles que entren al repte")
# llegeix els historials
artentren,diccedits=diccedicionsapi(artentren,diccedits)
# desa les dades pel proper dia
fitx=open("puntuador2015.txt",'w')
pickle.dump((artentren,diccedits),fitx)
fitx.close()
# pasa les dades dels historials als punts dels usuaris
textinforme=diccapunts(artentren,diccedits)
# publica taules
paginforme=pywikibot.Page(site,u"Usuari:PereBot/punts viquirepte 2015")
paginforme.put(textinforme,u"Robot ajuda oficiosament a fer recompte de punts")
pywikibot.stopme()