Lankide:PereBot/robot commonskat

Wikipedia, Entziklopedia askea
# -*- coding: utf-8 -*-
# Programa per posar la plantilla commonscat.
# El programa mira si a l'article hi ha Commonscat
# Si no hi és busca la plantilla Commonscat a Wikidata
# i la posa. 
# Si l'article té la plantilla Commons, Projectes germans 
# o una altra de semblant aleshores no fa res.
# PER FER:
# Si hi és, comprova que existeixi la categoria a Commons i
# si no existeix esborra o substitueix la plantilla.

import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,urllib2
import re

# 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')
def catexisteix(nomcat):
    if len(nomcat)>1:
        titcat=u"Category:"+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 nomcat,u"és massa curt per ser un nom de categoria"
        return False

# Funció que treu la plantilla Commonscat d'una pàgina.
# Vegeu insertaccat per les instruccions.
def treuccat(page):
    if page.isRedirectPage():
        page=page.getRedirectTarget()
    text=page.get()
    text=re.sub(u"\{\{ *[Cc]ommonscat *\|*.*\}\}\n?",u"",text)
    return text

# Funció que canvia el paràmetre de la plantilla Commonscat en una pàgina.
# Els arguments són la pàgina i el nou paràmetre (no la plantilla sencera).
# Vegeu insertaccat per les instruccions.
def canviaccat(page,param):
    if page.isRedirectPage():
        page=page.getRedirectTarget()
    text=page.get()
    text=re.sub(u"\{\{ *[Cc]ommonscat *\|*.*\}\}",u"{{Commonscat|"+param+u"}}",text)
    return text

# 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).
#
def insertaccat(page,afegit):
    if page.isRedirectPage():
        page=page.getRedirectTarget()
    text=page.get()
    if re.search(u"\{\{([Ww]ikie?spezieak|[Ww]ikispecies)",text):
        text=re.sub(u"\{\{([Ww]ikie?spezieak|[Ww]ikispecies)",afegit+u"\n{{Wikispezieak",text)
        print u"Text afegit davant de la plantilla Viquiespècies"
    elif re.search(u"\{\{[Ww]ikiztegia",text):
        text=re.sub(u"\{\{[Ww]ikiztegia",afegit+u"\n{{Wikiztegia",text)
        print u"Text afegit davant de la plantilla Wikiztegia"
    elif re.search(u"== ?Kanpo loturak ?==",text):  
        text=re.sub(u"(===? ?Kanpo loturak ?===?)",u"== Kanpo loturak ==\n"+afegit,text,count=1)
        print u"Text afegit a la secció Enllaços externs"
    elif re.search(u"== ?Kanpoko loturak ?==",text):  
        text=re.sub(u"(===? ?Kanpoko loturak ?===?)",u"== Kanpoko loturak ==\n"+afegit,text,count=1)
        print u"Text afegit a la secció Enllaços externs"
    elif re.search(u"== ?Ikus, gainera ?==",text):
        text=re.sub(u"== ?Ikus, gainera ?==",u"== Ikus, gainera ==\n"+afegit,text,count=1)
        print u"Text afegit a la secció Ikus, gainera"
    elif re.search(u"== ?Ikus gainera ?==",text):
        text=re.sub(u"== ?Ikus gainera ?==",u"== Ikus gainera ==\n"+afegit,text,count=1)
        print u"Text afegit a la secció Ikus gainera"
    elif re.search(u"== ?Erreferentziak ?==",text):
        text=re.sub(u"== ?Erreferentziak ?==",u"== Erreferentziak ==\n"+afegit,text,count=1)
        print u"Text afegit a la secció Referències"
    elif re.search(u"\{\{(.* ?)zirriborroa(\|?.*?)\}\}",text):
        text=re.sub(u"\{\{(.* ?)zirriborroa(\|?.*?)\}\}",afegit+ur"{{\1zirriborroa\2}}",text,count=1)
        print u"Text afegit davant de la plantilla esborrany"
    elif re.search(u"\{\{DEFAULTSORT",text):
        text=re.sub(u"\{\{DEFAULTSORT",afegit+u"\n{{DEFAULTSORT",text,count=1)
        print u"Text afegit davant de l'ORDENA"
    elif re.search(u"\[\[ ?[Kk]ategoria:",text):
        text=re.sub(u"\[\[ ?[Kk]ategoria:",afegit+u"\n[[Kategoria:",text,count=1)
        print u"Text afegit davant de les categories"
    else:
        print u"No he trobat on afegir el text a [["+page.title()+u"]]"
    return text


# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat,catprevies=[],filtre=u""):
    articles=cat.articlesList(recurse=False)
    categories=cat.subcategoriesList(recurse=False)
    for scat in categories:
        print scat
#        print u"Títol",scat.title()
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre==u"":
                nopassa=False
                print u"Filtre desactivat"
            else:
                nopassa=re.search(filtre,scat.title())                
            if not nopassa:
                print u"Sí que es llegeix", scat
                noucats,nouarts=miracatfiltre(scat,catprevies+categories,filtre)
                categories=categories+noucats
                articles=articles+nouarts
            else:
                print u"No es llegeix", scat
        else:
            print u"Aquesta ja la tinc vista"
    categories=catlib.unique(categories)
    articles=catlib.unique(articles)
    print u"Llegits",len(categories),u"categories i",len(articles),u"articles a",cat 
    return categories, articles

# 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.
def dataccat(data):
    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


#El programa comença aquí
site=wikipedia.getSite('eu') #Canviar aquí per canviar de viquipèdia
catbuscar=u"Euskal Herria" #Posar aquí la categoria que es revisarà
missatge=u"" #Missatge promocional. Normalment "" (cap missatge).
categoria = catlib.Category(site,catbuscar)
filtrecats=u"Kategoria:(Carnivora|Canidae|(Baix Llobregat|Maresme|Vallès" # categories grans que ja estan fetes i no cal repetir 
filtrecats=filtrecats+u"|Katal(un|an)|Andorra|Valentzi|Midi-Pyrénées).*"
filtrecats=filtrecats+u"|.*([Tt]xakur|Pirinio|Balear).*)" # categories grans que ja estan fetes i no cal repetir
mirasubcategories=True #False per no mirar subcategories; True per mirar-les
if mirasubcategories:
    cats, asc  = miracatfiltre(categoria,filtre=filtrecats)
    asc=cats+asc
else:
    asc=categoria.articlesList(recurse=False)
comptapotencial=len(asc)
print "Articles a la categoria",comptapotencial
#asc=asc[21500:] #Per fer només un grapat d'articles a la vegada. TREURE SI NO CAL.
#asc.reverse()
comptarevisar=len(asc)
sitecommons=wikipedia.getSite('commons','commons')
pagprova=wikipedia.Page(site,u"User:PereBot/proba")
informeno=""
comptaarticles=0
comptajaentenen=0
comptaposoplant=0
comptanoiw=0
comptatrec=0
comptacanvio=0
for pag in asc:
    comptaarticles=comptaarticles+1
    print comptaarticles,"/",comptarevisar,":",pag
    if pag.isRedirectPage():
        pag=pag.getRedirectTarget()
    if pag.exists():
#                        print u"ARTICLE "+nom+u" EXISTEIX"
        plantarticle=pag.templates()
        treure=False
        nhiha=False
        posada=False
#                        print plantarticle
#       canviar la línia següent per canviar de viquipèdia
        if u'Commonskat' in plantarticle or u'Commonscat' in plantarticle or u'Commons' in plantarticle or u'Commons category' in plantarticle or u'Commonscat-inline' in plantarticle or u'Commons cat' in plantarticle or u'Wikimedia' in plantarticle:
            nhiha=True
            treure=False
            print pag, u"té la plantilla Commonscat, projectes germans, o similar"
        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==u"":
                    print u"No hi ha categoria a Commons segons Wikidata"
                else:
                    print u"Categoria segons wikidata:",paramdata
                    catdata=wikipedia.Page(sitecommons,u"Category:"+paramdata)
                    if catdata.exists():
                        print u"la categoria",paramdata,u"existeix a Commons"
#                        textoriginal=pag.get()  # nomès per proves a l'espai d'usuari
#                        pagprova.put(textoriginal,u"Robot copiant pàgina per fer proves")   # nomès per proves a l'espai d'usuari
                        try:
                            noutext=insertaccat(pag,u"{{commonskat}}\n") # el paràmetre {{#property:P373}} no és necessari a eu.wiki ni ca.wiki perquè és el comportament per defecte de la plantilla
                            pag.put(noutext,u"Robotak {{Commonskat}} gehitu du. Txantiloiak [[commons:category:"+paramdata+u"]] lotu du, Wikidataren arabera.") # per fer proves posar pagprova, sinó pag
                        except wikipedia.LockedPage:
                            print u"Error: Pàgina blocada"
                        except wikipedia.MaxTriesExceededError:
                            print u"Error: Temps excedit"
                    else:
                        print u"la categoria Commons:category:"+paramdata,u"NO existeix a Commons"
wikipedia.stopme()