Vés al contingut

Usuari:PereBot/robot puja commonscat a Wikidata

De la Viquipèdia, l'enciclopèdia lliure
# -*- coding: utf-8 -*-
# Programa per preparar l'escript per pujar a Wikidata
# el paràmetre commonscat de les categories.
# Les instruccions les imprimeix a la pantalla per copiar-les i enganxar-les
# al Quickstatements.


import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,operator

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

#El programa comença aquí
refresca=True #True perquè refresqui els articles que calgui
site=pywikibot.getSite('ca')
sitecommons=pywikibot.getSite('commons','commons')
miracats=False  #True per categories, False per articles
if miracats:
    nomcat=u"Categories sense enllaç commonscat a Wikidata"
    cat=catlib.Category(site,nomcat)
    arts=cat.subcategoriesList(recurse=False)
else:
    nomcat=u"Pàgines sense enllaç commonscat a Wikidata"
    cat=catlib.Category(site,u"Pàgines sense enllaç commonscat a Wikidata")
    arts=cat.articlesList(recurse=False)   
resultat=u""
informetit=u"==Articles que no s'ha pogut pujar el paràmetre commonscat a Wikidata==\n\n"
informenowd=u"===Articles sense item a Wikidata===\n\n"
informepar=u"===Paràmetre apunta a categoria inexistent a Commons===\n\n"
informenopar=u"===Paràmetre per defecte apunta a categoria inexistent a Commons===\n\n"
artsqueda=arts
pccat=plant(u"Commonscat")
while len(artsqueda)>0:
    if len(artsqueda)>50:
        artslot=artsqueda[:50]
        artsqueda=artsqueda[50:]
    else:
        artslot=artsqueda
        artsqueda=[]
    dicclot={}
    diccinv={}
    llistalot=[]
    diccitem={}
    diccp31={}
    diccdef={}
    for pag in pagegenerators.PreloadingGenerator(artslot):#[:25] per proves
        # Comença la part de buscar el paràmetre a la pàgina
        print pag.title()
        if pag.namespace() in [1,2,3,5,7,9,11,13,15,17]:
            continue
        text=pag.get()
        ccat=u""
        if pccat in pag.templates():
            trobats=re.findall(u"\{\{ ?[Cc]ommons ?cat ?\|(.*?)\}\}",text)
            print u"Trobats:",trobats,len(trobats)
            if len(trobats)==1:
                ccat=trobats[0]
                print u"paràmetre:",ccat
                diccdef[pag]=False
            elif len(trobats)==0:
                trobaplant=re.findall(u"(\{\{ ?[Cc]ommons ?cat.*?\}\})",text)
                print u"El que hi ha:",trobaplant
                if re.search(u"(\{\{ ?[Cc]ommons ?cat ?\}\})",text):
                    ccat=pag.title().replace(u"Categoria:",u"")
                    print u"paràmetre per defecte:",ccat
                    diccdef[pag]=True
            else:
                print u"excés de plantilles Commonscat"
                continue
            if u"|" in ccat:
                trossos=re.split(u"\|",ccat)
                #print trossos
                ccat=trossos[0]
                print u"ccat amb |; queda",ccat
            ccat=ccat.replace(u"Category:",u"").strip()
            if len(ccat)<1:
                print u"massa curt:",ccat
                continue
            #Comença la part de mirar si hi ha la propietat a Wikidata
            try:
                pagdata=pywikibot.ItemPage.fromPage(pag)
                cont=pagdata.get()
                #print cont
            except pywikibot.NoPage:
                print u"No hi ha pàgina a Wikidata"
                informenowd=informenowd+u"# [[:{}]]\n".format(pag.title())
                continue
            qitem=pagdata.title()
            print u"id de Wikidata:",qitem
            diccitem[pag]=qitem
            hihaccatdata=False
            hihap31=False
            for prop in cont["claims"]:
                #print u"PROP:",prop
                if prop=="P373":
                    print u"ja hi ha commonscat"
                    hihaccatdata=True
                if prop=="P31":
                    print u"ja hi ha p31 (instància de)"
                    hihap31=True
            if hihaccatdata==True:
                if refresca==True:
                    try:
                        text=pag.get()
                        pag.put(text,u"bot refrescant la pàgina")
                    except pywikibot.InvalidTitle:
                        print u"títol no vàlid"
                continue
            try:
                catcommons=catlib.Category(sitecommons,ccat)
            except ValueError:
                continue
            except pywikibot.InvalidTitle:
                print u"títol invàlid"
                continue
            diccinv[catcommons]=pag
            llistalot.append(catcommons)
            dicclot[pag]=ccat
            diccp31[pag]=hihap31
        else:
            print u"No plantilla"
    #Comença la part de comprovar que les categories existeixen a Commons
    for catc in pagegenerators.PreloadingGenerator(llistalot):
        pag=diccinv[catc]
        try:
            textcommons=catc.get()
            print catc,u"carregada amb èxit"
        except pywikibot.NoPage:
            print catc,u"no existeix"
            if diccdef[pag]==True:
                informenopar=informenopar+u"# [[:{}]]\n".format(pag.title())
            else:
                informepar=informepar+u"# [[:{}]] {}\n".format(pag.title(),catc.title())
            continue
        #Comença la part d'escriure el resultat
        ccat=dicclot[pag]
        qitem=diccitem[pag]
        linia=u'{}\tP373\t"{}"\tS143\tQ199693'.format(qitem,ccat)#commonscat
        print linia
        resultat=resultat+u"\n"+linia
        if diccp31[pag]==False and miracats==True:
            linia=u'{}\tP31\tQ4167836\tS143\tQ199693'.format(qitem)#és instància de categoria
            print linia
            resultat=resultat+u"\n"+linia
    print u"Resultat fins ara:"
    print resultat
    informe=informetit+informenowd+informepar+informenopar+u"\n\n--~~~~\n"
    print u"Informe:"
    print informe
print u"Acabat"
paginforme=pywikibot.Page(site,u"Usuari:PereBot/"+nomcat)
paginforme.put(informe,u"Pàgines que no s'ha pogut pujar el paràmetre Commonscat a Wikidata")
pywikibot.stopme()