Usuari:PereBot/robot posa commonscat i busca fotos
Aparença
# -*- coding: utf-8 -*-
"""
Programa que agafa els articles d'una categoria d'articles mancats de foto,
tria els que tenen la plantilla Commonscat, i fa una llista amb els que tenen
com a mínim una imatge jpeg a la categoria de Commons. A la llista hi posa
galeries de cada categoria.
A més, posa la plantilla commonscat a les categories que no la tinguin
si a Wikidata hi ha el paràmetre categoria de Commons.
PER FER: Aprofitar per fer llista de pàgines sense interviquis.
"""
import re, sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib
def insertaccat(page,afegit):
"""Funció que inserta la plantilla Commonscat (o un altre text) en una pàgina.
Mira de posar-la davant de la plantilla Viquiespècies i si no hi és va buscant
més llocs fins que al final la posa davant de les categories.
Els arguments són la pàgina i el text a afegir (habitualment la plantilla amb
el seu paràmetre.
Retorna el text amb la plantilla (o sense, si no ha trobat on posar-la).
És una adaptació de la del programa ccat monuments (l'argument és l'objecte pàgina i no el text).
"""
if page.isRedirectPage():
page = page.getRedirectTarget()
text = page.get()
if re.search(u"\{\{([Vv]iquiespècies|[Ww]ikispecies)", text):
text = re.sub(u"\{\{([Vv]iquiespècies|[Ww]ikispecies)", u"%s\n{{Viquiespècies" % afegit, text)
print u"Text afegit davant de la plantilla esborrany"
elif re.search(u"== ?Enllaços externs ?==", text): # PER FER: POSAR LA PLANTILLA ABANS DE VIQUIDITES, VIQUITEXTS, VIQUILLIBRES O VIQUINOTÍCIES, COM A PRIMERA OPCIÓ
text=re.sub(u"(===? ?Enllaços externs ?===?)", u"== Enllaços externs ==\n%s" % afegit, text, count=1)
print u"Text afegit a la secció Enllaços externs"
elif re.search(u"== ?Enllaços ?==", text):
text=re.sub(u"(== ?Enllaços ?==)", u"== Enllaços externs ==\n%s" % afegit, text, count=1)
print u"Text afegit a la secció Enllaços (externs)"
elif re.search(u"== ?Bibliograf[ií]a ?==", text):
text=re.sub(u"== ?Bibliograf[ií]a ?==", u"== Bibliografia ==\n%s" % afegit, text, count=1)
print u"Text afegit a la secció Bibliograf[ií]a"
elif re.search(u"== ?Refer[eè]ncies ?==", text):
text=re.sub(u"== ?Refer[eè]ncies ?==",u"== Referències ==\n%s" % afegit, text, count=1)
print u"Text afegit a la secció Referències"
elif re.search(u"\{\{[Ee]sborrany",text):
text=re.sub(u"\{\{[Ee]sborrany", u"%s\n{{Esborrany" % afegit, text, count=1)
print u"Text afegit davant de la plantilla esborrany"
elif re.search(u"\{\{ORDENA", text):
text=re.sub(u"\{\{ORDENA", u"%s\n{{ORDENA" % afegit, text, count=1)
print u"Text afegit davant de l'ORDENA"
elif re.search(u"\[\[ ?[Cc]ategoria:", text):
text=re.sub(u"\[\[ ?[Cc]ategoria:",u"%s\n[[Categoria:" % afegit, text, count=1)
print u"Text afegit davant de les categories"
else:
print u"No he trobat on afegir el text a %s" % page.title(asLink=True)
return text
def dataccat(data):
"""
Recupera la propietat "categoria de Commons" a Wikidata
L'argument és una pàgina de wikidata (objecte pàgina)
Retorna una cadena.
Si no hi ha la propietat, retorna una cadena buida.
"""
ccat=u""
try:
dict = data.get()
claims = dict[u'claims']
for el in claims:
m = el[u'm']
num = m[1]
if num == 373:
ccat = m[3]
except IndexError:
print u"Error: paràmetre sense contingut a wikidata"
ccat = u""
except wikipedia.NoPage:
print u"Error: no hi ha pàgina a wikidata"
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
except urllib2.HTTPError:
print u"Error HTTP (no deu funcionar el web)"
return ccat
def catexisteix(nomcat):
"""
Funció que comprova si una categoria existeix a Commons
L'argument és el nom de la categoria (sense "category:")
Retorna True o False
Necessita la variable global sitecommons=wikipedia.getSite('commons','commons')
"""
if len(nomcat)>1:
titcat = u"Category:%s" % nomcat
pagcat = wikipedia.Page(sitecommons, titcat)
try:
return pagcat.exists()
except wikipedia.BadTitle:
print u"Error: Mal títol"
return False
except wikipedia.InvalidTitle:
print u"Error: Títol invàlid"
return False
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
return False
except urllib2.HTTPError:
print u"Error HTTP (no deu funcionar el web)"
return False
else:
print u"%s és massa curt per ser un nom de categoria" % nomcat
return False
def galeria(llistimatges):
"""Transforma llista de fotos en galeria"""
gal = "<gallery>\n"
for imatge in llistimatges:
if imatge.isImage():
gal += u"{i}|{i}\n".format(i=imatge.title())
gal += "</gallery>\n\n"
return gal
#La part interessant comença aquí
def main():
catbuscar = u"Amfibis que necessiten una foto" # Categoria d'articles sense foto a buscar (sense subcategories)
catnofoto = catlib.Category(site,catbuscar)
artcat = catnofoto.articlesList(recurse=False)
wikipedia.output(u"%i articles a %s" % (len(artcat), catnofoto))
wikipedia.getall(site, artcat)
numarticles = len(artcat)
print u"%i articles a revisar" % numarticles
paginforme = wikipedia.Page(
site,
u"Usuari:PereBot/Fotos per on manquen" # Canvieu això pel lloc on vulgueu la informació
)
noutext = paginforme.get()
comptarticles = compta = 0
resum = u"\n\n==%s==\n\n" % catbuscar
for pag in artcat:
comptarticles += 1
compta += 1
wikipedia.output(u"{}/{} {}" .format(comptarticles, numarticles, pag))
tottemppar=pag.templatesWithParams()
plantarticle=pag.templates()
nhiha=False
if not (u'Commonscat' in plantarticle): # Aquí comença la part de posar la plantilla commonscat
if u'Commonscat' in plantarticle or \
u'Commons cat' in plantarticle or \
u'Projectes germans' in plantarticle or \
u'Commons category' in plantarticle or \
u'Commons' in plantarticle or \
u'Commonscat-inline' in plantarticle or \
u'Commons cat' in plantarticle or \
u'Wikimedia' in plantarticle:
nhiha=True
treure=False
wikipedia.output(u"%s té la plantilla Commonscat, projectes germans, o similar" % pag.title(asLink=True))
else:
espai = pag.namespace()
if espai not in (0, 14):
print pag, u"no és a l'espai d'articles ni al de categories"
else:
try:
data = wikipedia.DataPage(pag)
except wikipedia.NoPage:
data = False
print u"Error: no hi ha pàgina a wikidata"
except wikipedia.MaxTriesExceededError:
data = False
print u"Error: Temps excedit"
except urllib2.HTTPError:
data = False
print u"Error HTTP (no deu funcionar el web)"
if data != False:
paramdata = dataccat(data)
if paramdata == "":
print u"No hi ha categoria a Commons segons Wikidata"
else:
print u"Categoria segons wikidata: %s" % paramdata
catdata = wikipedia.Page(sitecommons, u"Category:%s" % paramdata)
if catdata.exists():
wikipedia.output(u"la categoria %s existeix a Commons" % paramdata)
try:
noutextart = insertaccat(pag, u"{{Commonscat}}\n")
pag.put(
noutextart,
u"Robot afegint {{Commonscat}} que enllaça a "
u"[[commons:category:%s]]" % paramdata
)
textactualitzat = pag.get(force=True) # Només serveix per recarregar la pàgina i actualitzar a la línia següent
tottemppar = pag.templatesWithParams()
except wikipedia.LockedPage:
print u"Error: Pàgina blocada"
except wikipedia.MaxTriesExceededError:
print u"Error: Temps excedit"
else:
wikipedia.output(
u"la categoria Commons:category:%s "
"NO existeix a Commons" % paramdata
)
for plant in tottemppar: # Aquí comença la part de buscar fotos
if plant[0] == u'Commonscat':
nhiha = True
if plant[1] == []:
try:
data = wikipedia.DataPage(pag)
except wikipedia.NoPage:
data = False
print u"Error: no hi ha pàgina a wikidata"
except wikipedia.MaxTriesExceededError:
data = False
print u"Error: Temps excedit"
except urllib2.HTTPError:
data = False
print u"Error HTTP (no deu funcionar el web)"
if data != False:
paramdata = dataccat(data)
if paramdata == "":
print u"No hi ha categoria a Commons segons Wikidata"
param = ""
else:
param = paramdata
else:
param = plant[1][0]
if len(param)>1:
if catexisteix(param):
print u"La categoria %s existeix a Commons" % param
catcommons = catlib.Category(sitecommons, param)
fotos = catcommons.articlesList()
numfotos = len(fotos)
jpegs = 0
for imatge in fotos:
titfoto = imatge.title()
if re.search(u"\.jpe?g", titfoto, re.I):
jpegs += 1
tit = pag.title()
print u"Hi ha %i imatges a la categoria" % numfotos
print u"de les quals %i són jpeg" % jpegs
subcats = catcommons.subcategoriesList()
try:
print u"Hi ha les subcategories %s a la categoria" % subcats
except UnicodeEncodeError:
print u"Error subcategories amb caràcters no imprimibles"
if jpegs > 0 or len(subcats) > 0:
resum += u"\n===[[{t}]]===\n*[[{t}]]\n*[[:commons:Category:{}]]\n".format(param, t=tit)
if jpegs > 0:
resum += galeria(fotos)
compta += 3
if len(subcats) > 0:
resum += u"*Subcategories:\n"
for subcat in subcats:
resum += u"**[[:commons:%s]]\n" % subcat.title()
compta += 3
if jpegs > 0 or len(subcats) > 0:
if compta>160:
noutext += resum
try:
paginforme.put(noutext,catbuscar)
except EditConflict:
noutext = paginforme.get(force=True)
noutext += resum
paginforme.put(noutext, u"%s (conflicte d'edicions)" % catbuscar)
resum = u""
compta = 0
else:
wikipedia.output(u"La categoria %s no existeix a Commons." % param)
treure=True
noutext=noutext+resum
try:
paginforme.put(noutext, u"%s, tasca acabada." % catbuscar)
except EditConflict:
noutext = paginforme.get(force=True)
noutext += resum
paginforme.put(noutext, u"%s, tasca acabada (conflicte d'edicions)" % catbuscar)
return
#El programa comença aquí
if __name__ == '__main__':
try:
site=wikipedia.getSite('ca')
sitecommons=wikipedia.getSite('commons','commons')
main()
finally:
wikipedia.stopme()