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()