Usuari:PereBot/robot puntuador repte 2015
Aparença
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()