Vés al contingut

Usuari:PereBot/robot autors articles

De la Viquipèdia, l'enciclopèdia lliure
# -*- coding: utf-8 -*-
# Recull l'activitat dels editors als articles d'una categoria
# i dels seus interviquis

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

# Torna títols dels interviquis d'una pàgina
def interviquis(pag):
    pagdata=wikipedia.DataPage(pag)
    #print pagdata
    try:
        cont= pagdata.get()
        #print cont
    except wikipedia.NoPage:
        print u"No hi ha pàgina de dades"
        return {}
    iws=cont[u'links']
    print iws
    return iws

# Prefix a partir de nom del projecte
def prefix(codiproj0):
    lloc=codiproj0.find(u"wiki")
    lleng=codiproj0[:lloc].replace(u"_",u"-")
    fam=codiproj0[lloc:]
    if lleng==u"commons":
        fam=u"commons"
    elif fam==u"wiki":
        fam=u"wikipedia"
    prefixos={u"wikipedia":u":", u"wikiquote":u":q:", u"wikisource":u":s:", "commons":":", u"wikivoyage":u":voy:", u"wikinews":u":n:", u"wikibooks":u":b:"}
    return prefixos[fam]+lleng+u":"
    
# Torna codi de llengua i pàgina a partir de codi estil "cawiki" i títol
def artiw(codiproj0,tit):
    lloc=codiproj0.find(u"wiki")
    lleng=codiproj0[:lloc].replace(u"_",u"-")
    fam=codiproj0[lloc:]
    if fam==u"wiki":
        fam=u"wikipedia"
    if codiproj0==u"commonswiki":
        proj=wikipedia.getSite('commons','commons')
    else:
        proj=wikipedia.getSite(lleng,fam)
    print proj,tit
    pagiw=wikipedia.Page(proj,tit)
    return codiproj0,pagiw

# 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"
    articles=catlib.unique(articles)         
    return categories, articles

# Afegeix estadístiques de l'historial d'un article als
# diccionaris existents
def historial(pag,diccedits,dicccrea,diccafegeix,diccaftreu):
    hist=pag.getVersionHistory()
    for i,linia in enumerate(hist):
        #print linia
        usuari=linia[2]
        #print usuari
        try:
            mida=linia[4]-hist[i+1][4]
        except IndexError:
            mida=linia[4]
            if usuari in dicccrea:
                dicccrea[usuari]=dicccrea[usuari]+1
            else:
                dicccrea[usuari]=1
        #print mida
        if usuari in diccedits:
            diccedits[usuari]=diccedits[usuari]+1
        else:
            diccedits[usuari]=1
        if mida>0:
            if usuari in diccafegeix:
                diccafegeix[usuari]=diccafegeix[usuari]+mida
            else:
                diccafegeix[usuari]=mida
        if usuari in diccaftreu:
            diccaftreu[usuari]=diccaftreu[usuari]+mida
        else:
            diccaftreu[usuari]=mida
        if not usuari in dicccrea:
            dicccrea[usuari]=0
        if not usuari in diccafegeix:
            diccafegeix[usuari]=0
    return diccedits,dicccrea,diccafegeix,diccaftreu
    wikipedia.stopme()

# Agafa el valor número num d'un diccionari
def minnum(dicc,num,val0):
    llista=[]
    for clau in dicc.keys():
        llista.append(dicc[clau])
    llista.sort()
    llista.reverse()
    if len(llista)>num:
        valor=llista[num]
        if valor>val0:
            val0=valor
    return val0

# Converteix diccionaris en taules
def dicataula(diccedits,dicccrea,diccafegeix,diccaftreu,llengua):
    text=u'{| class="wikitable sortable" border="1"\n|+ Editors\n'
    text=text+u"|-\n"
    text=text+u'! scope="col" | Editor\n'
    text=text+u'! scope="col" | Edicions\n'
    text=text+u'! scope="col" | Articles creats\n'
    text=text+u'! scope="col" | Octets afegits\n'
    text=text+u'! scope="col" | Afegits nets\n'
    claus=diccedits.keys()+dicccrea.keys()+diccafegeix.keys()+diccaftreu.keys()
    claus=set(claus)
    anonusuaris=anonedit=anoncrea=anonafegeix=anonaftreu=0
    petitsusuaris=petitsedit=petitscrea=petitsafegeix=petitsaftreu=0
    nummin=20 #5 per proves, previst 30
    minedits=minnum(diccedits,nummin,12)
    mincrea=minnum(dicccrea,nummin,1)
    minafegeix=minnum(diccafegeix,nummin,1000)
    minaftreu=minnum(diccaftreu,nummin,200)
    for usuari in claus:
        try:
            nomusuari=unicode(usuari)
        except TypeError:
            print u"Nom d'usuari intractable"
            nomusuari=u"Nom intractable"
        if re.search(u"[a-zA-Z]",nomusuari) or not "." in nomusuari:
            if diccedits[usuari]>=minedits or dicccrea[usuari]>=mincrea or diccafegeix[usuari]>=minafegeix or diccaftreu[usuari]>=minaftreu:
                text=text+dicalinia(usuari,diccedits,dicccrea,diccafegeix,diccaftreu,llengua)
            else:
                petitsusuaris=petitsusuaris+1
                petitsedit=petitsedit+diccedits[usuari]
                if usuari in dicccrea.keys():
                    petitscrea=petitscrea+dicccrea[usuari]
                if usuari in diccafegeix.keys():
                    petitsafegeix=petitsafegeix+diccafegeix[usuari]
                petitsaftreu=petitsaftreu+diccaftreu[usuari]
        else:
            anonusuaris=anonusuaris+1
            anonedit=anonedit+diccedits[usuari]
            if usuari in dicccrea.keys():
                anoncrea=anoncrea+dicccrea[usuari]
            if usuari in diccafegeix.keys():
                anonafegeix=anonafegeix+diccafegeix[usuari]
            anonaftreu=anonaftreu+diccaftreu[usuari]
    if anonusuaris>0:
        text=text+u"|-\n"
        text=text+u"|{} anònims||{}||{}||{}||{}\n".format(anonusuaris,anonedit,anoncrea,anonafegeix,anonaftreu)
    if petitsusuaris>0:
        text=text+u"|-\n"
        text=text+u"|{} usuaris més||{}||{}||{}||{}\n".format(petitsusuaris,petitsedit,petitscrea,petitsafegeix,petitsaftreu)
    sumausuari=len(claus)
    sumaedits=0
    for usuari in diccedits.keys():
        sumaedits=sumaedits+diccedits[usuari]
    sumacrea=0
    for usuari in dicccrea.keys():
        sumacrea=sumacrea+dicccrea[usuari]
    sumaafegeix=0
    for usuari in diccafegeix.keys():
        sumaafegeix=sumaafegeix+diccafegeix[usuari]
    sumaaftreu=0
    for usuari in diccaftreu.keys():
        sumaaftreu=sumaaftreu+diccaftreu[usuari]
    text=text+u"|-\n"
    text=text+u"!{} usuaris!!{}||{}||{}||{}\n".format(sumausuari,sumaedits,sumacrea,sumaafegeix,sumaaftreu)
    text=text+u"|}\n"
    text=text+u"S'han agrupat els usuaris amb menys de {} edicions, {} articles creats, {} octets afegits i {} octets afegits nets (afegits menys eliminats).".format(minedits,mincrea,minafegeix,minaftreu)
    return text

def dicalinia(usuari,diccedits,dicccrea,diccafegeix,diccaftreu,llengua):
    #print usuari,u"edicions:",diccedits[usuari],u"crea:",dicccrea[usuari],u"afegeix:",diccafegeix[usuari],u"aftreu:",diccaftreu[usuari]
    pref=prefix(llengua)
    try:
        text=u"|-\n|[["+pref+u"User:"+usuari+u"]]||"
    except TypeError:
        print u"nom invàlid. usuari:",usuari
        text=u"|-\n|Nom d'usuari no vàlid||"
    text=text+str(diccedits[usuari])+u"||"
    if usuari in dicccrea:
        text=text+str(dicccrea[usuari])+u"||"
    else:
        text=text+u"0"+u"||"
    if usuari in diccafegeix:
        text=text+str(diccafegeix[usuari])+u"||"
    else:
        text=text+u"0"+u"||"
    text=text+str(diccaftreu[usuari])+u"\n"
    return text

#Transforma llista d'articles en una cadena presentable
def llistaneta(llista,codiproj):
    pref=prefix(codiproj)
    text=u""
    for nom in llista:
        text=text+u"[[{}{}]], ".format(pref,nom)
    return text

# El programa comença aquí.
cawiki=wikipedia.getSite('ca') 
site=cawiki #Canviar aquí per canviar de Viquipèdia origen
diccedits={}
dicccrea={}
diccafegeix={}
diccaftreu={}
llistarticles={}
nomcat=u"catalans històrics" #Canviar aquí per canviar de categoria
cat=catlib.Category(site,nomcat)
cats,articles=miracatfiltre(cat)
for pag in articles:
    print pag
    iws=interviquis(pag)
    for codilleng in iws.keys():
        lleng,art=artiw(codilleng,iws[codilleng][u'name'])
        #print art
        if lleng not in llistarticles.keys():
            llistarticles[lleng]=[]
        llistarticles[lleng].append(art.title())
        if lleng not in diccedits.keys():
            diccedits[lleng]={}
            dicccrea[lleng]={}
            diccafegeix[lleng]={}
            diccaftreu[lleng]={}
        diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng]=historial(art,diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng])
if len(articles)>0:
    textinf=u"==[[:categoria:{}]]==\n\n".format(nomcat)
    textinf=textinf+u"{} articles en {} subcategories\n\n".format(len(articles),len(cats))
    for lleng in sorted(diccedits.keys()):
        textinf=textinf+u"=== {} ===\n".format(lleng)
        textinf=textinf+u"{} articles\n\n".format(len(llistarticles[lleng]))
        textinf=textinf+llistaneta(llistarticles[lleng],lleng)+u"\n\n"
        textinf=textinf+dicataula(diccedits[lleng],dicccrea[lleng],diccafegeix[lleng],diccaftreu[lleng],lleng)+u"\n\n"
    paginforme=wikipedia.Page(cawiki,u"Usuari:PereBot/autors articles/"+nomcat)
    paginforme.put(u"\n"+textinf+u"\n",u"Estadístiques d'edicions")
else:
    print u"No hi ha articles a la categoria."
wikipedia.stopme()