Usuari:PereBot/robot centre viquipèdies

De la Viquipèdia, l'enciclopèdia lliure

Vegeu els resultats d'aquest programa a Usuari:Pere prlpz/El centre de la Terra segons la Viquipèdia o Usuari:Pere prlpz/The center of the Earth according to Wikipedia.

# -*- coding: utf-8 -*-
# Calcula el centroide dels items de Wikidata amb coordenades i link a cada viquipèdia

import sys
sys.path.append('C:\core')
import pywikibot
#from pywikibot import pagegenerators
#from pywikibot.compat import catlib
import re,urllib,urllib2,json,time,math,pickle

def calcula(wk):
    urlquerys=[]
    if wk=="wikidata":
        urlquerys.append(u"https://wdq.wmflabs.org/api?q=claim[625]%20and%20noclaim[376]&props=625")
        urlquerys.append(u"https://wdq.wmflabs.org/api?q=claim[625]%20and%20claim[376:2]&props=625")
    else:
        urlquerys.append(u"https://wdq.wmflabs.org/api?q=claim[625]%20and%20link[{}]%20and%20noclaim[376]&props=625".format(wk))
        urlquerys.append(u"https://wdq.wmflabs.org/api?q=claim[625]%20and%20link[{}]%20and%20claim[376:2]&props=625".format(wk))
    n=0
    sumax=0
    sumay=0
    sumaz=0
    for urlquery in urlquerys:
        print urlquery
        pllista=urllib.urlopen(urlquery)
        print "obert"
        try:
            pbrut=pllista.read()
            print u"llegit"
            jpag=json.loads(pbrut)
        except:
            print "error en llegir. esperant"
            time.sleep(60)
            try:
                pbrut=pllista.read()
                jpag=json.loads(pbrut)
            except:
                print "error en llegir. esperant"
                time.sleep(100)
                try:
                    pbrut=pllista.read()
                    jpag=json.loads(pbrut)
                except:
                    print "error en llegir. esperant"
                    time.sleep(200)
                    pbrut=pllista.read()
                    jpag=json.loads(pbrut)
        print u"longitud:",len(pbrut)
        if len(pbrut)<200:
            print pbrut
        numdades=len(jpag["items"])
        print numdades,u"punts"
        for it in jpag["props"]["625"]:
            n=n+1
            try:
                trossos=re.split(u"\|",it[2])
            except TypeError:
                print it[2]
                print it
                n=n-1
                continue
            lat=float(trossos[0])
            lon=float(trossos[1])
            if lat<-90 or lat>90 or lon<-180 or lon>180:
                print u"Punt fora de rang",lat,lon
                print it
                n=n-1
                continue
            #print lat,lon
            latr=math.radians(lat)#*math.pi/180
            lonr=math.radians(lon)#*math.pi/180
            #print latr,lonr
            x=math.cos(latr)*math.cos(lonr)
            y=math.sin(lonr)*math.cos(latr)
            z=math.sin(latr)
            sumax=sumax+x
            sumay=sumay+y
            sumaz=sumaz+z
            #print x,y,z
            if n%100000==0:#float(n)/100-int(n/100)==0:
                #print float(n)/100,int(n/100)
                print n,sumax,sumay,sumaz
    print n,sumax,sumay,sumaz
    xcen=sumax/n
    ycen=sumay/n
    zcen=sumaz/n
    print xcen,ycen,zcen
    loncenr=math.atan2(ycen,xcen)
    latcenr=math.asin(zcen)
    latcen=math.degrees(latcenr)
    loncen=math.degrees(loncenr)
    print latcen,loncen
    rcen=(xcen**2+ycen**2+zcen**2)**0.5
    return n,latcen,loncen,rcen    

# El programa comença aquí
site=pywikibot.getSite('ca')
#sitedata=site.data_repository() 
fig={"ca":u"Nuvola Catalonia flag.svg",
     "es":u"Nuvola Spain flag escudada.svg",
     "en":u"Nuvola United Kingdom flag.svg",
     "fr":u"Nuvola apps klettres.png",
     "it":u"Nuvola Italy flag.svg",
     "de":u"Nuvola German flag.svg",
     "nl":u"Nuvola Dutch flag.svg",
     "ja":u"Nuvola Japan flag.svg",
     "zh":u"Nuvola Chinese flag.svg",
     #"zh-classical":u"Nuvola Taiwanese flag.svg",
     "ko":u"Nuvola Korean flag.svg",
     "eu":u"Nuvola Basque Country flag.svg",
     "ar":u"Green flag.svg",
     "an":u"Flag Aragón.svg",
     "ast":u"Flag of Asturias.svg",
     "pt":u"Nuvola Portuguese flag.svg",
     "gl":u"Nuvola Galician flag.svg",
     "oc":u"Icon of Occitania.svg",
     "ru":u"Nuvola Russian flag.svg",
     "pl":u"Nuvola Polish flag.svg",
     "el":u"Nuvola Greek flag.svg",
     "ro":u"Nuvola apps ro flag.png",
     "br":u"Nuvola Brittany flag.svg",
     "uk":u"Nuvola Ukrainian flag.svg",
     "cs":u"Nuvola Czech flag.svg",
     "hu":u"Nuvola Hungary flag.svg",
     "sr":u"Nuvola Serbian flag.svg",
     "sh":u"Serbo-Croatian language flag.gif",
     "hr":u"Nuvola Croatian flag.svg",
     "bs":u"Nuvola Bosnian flag.svg",
     "sl":u"Nuvola Slovenian flag.svg",
     "sk":u"Nuvola Slovakian flag.svg",
     "sq":u"Nuvola Albanian flag.svg",
     "he":u"Nuvola Israeli flag.svg",
     "bg":u"Nuvola Bulgaria flag.svg",
     "hy":u"Nuvola Armenian flag.svg",
     "no":u"Nuvola Norwegian flag.svg",
     "da":u"Nuvola Danish flag.svg",
     "nn":u"Flag of Vestlandet.svg",
     "sv":u"Nuvola Swedish flag.svg",    
     "fo":u"Nuvola Faroese flag.svg",
     "is":u"Nuvola Icelandic flag.svg",
     "se":u"Sami flag.svg",
     "fi":u"Nuvola Finnish flag.svg",    
     "et":u"Nuvola Estonian flag.svg",
     "lv":u"Nuvola Latvian flag.svg",
     "lt":u"Nuvola Lithuanian flag.svg",
     "az":u"Nuvola Azerbaijanian flag.svg",
     "ka":u"Nuvola Georgian flag.svg",
     "tr":u"Nuvola Turkish flag.svg",
     "mk":u"Nuvola Macedonian flag.svg",
     "be":u"Nuvola Belarus flag 1995.svg",
     "lb":u"Nuvola Luxemburgish flag.svg",
     "wa":u"Flag of Wallonia.svg",
     "vls":u"West-Vlaams.JPG",
     "als":u"Houptsyte.png",
     "ga":u"Nuvola Irish flag.svg",
     "lmo":u"Flag of Lombardy.svg",
     "cy":u"Nuvola welsh flag simplified.svg",
     "fa":u"Nuvola Iranian flag.svg",
     "ku":u"Flag of Kurdistan.svg",
     "uz":u"Nuvola Uzbek flag.svg",
     "tk":u"Nuvola Turkmen flag.svg",
     "kk":u"Nuvola Kazakh flag.svg",
     "rm":u"ISO 639 Icon rm.svg",
     "fur":u"Friuli Flag.svg",
     "sc":u"Nuvola Sardinia flag.svg",
     "pms":u"Flag of Piedmont.svg",
     "co":u"Nuvola Corsica flag.svg",
     "crh":u"Flag of the Crimean Tatar people.svg",
     "bo":u"Flag of Tibet.svg",
     #"zh-min-nan":u"Minyu.png",
     #"zh-yue":u"Pukguy.png",
     "mn":u"Nuvola Mongolian flag.svg",
     "th":u"Nuvola Thai flag.svg",
     "vi":u"Nuvola Vietnamian flag.svg",
     "new":u"Nuvola Nepal flag.svg",
     "hi":u"Nuvola Indian flag.svg",
     "af":u"Nuvola South African flag.svg",
     "ceb":u"ISO 639 Icon ceb.svg",
     "war":u"ISO 639 Icon war.svg",
     "vo":u"Volapük flag.jpg",
     "eo":u"Nuvola Esperanto flag.svg",
     "ms":u"Nuvola Malaysian flag.svg",
     "id":u"Nuvola Indonesian flag.svg",
     "min":u"Flag of Minang.svg",
     "la":u"Vexilloid of the Roman Empire.svg",
     "wikidata":u"Wikidata-logo-en.svg",
     }
llegeix=True #True per llegir del fitxer, False per calcular de nou
completa=True #True per calcular els que no tingui, False només representa amb les dades que ja té
if llegeix==True:
    fitx=open(u"centre món.txt",'r')
    dicc=pickle.load(fitx)
    fitx.close()   
else:
    dicc={}
llegenda=u"El centre de la terra segons cada viquipèdia"
tmapa=u"{{"+u"Location map+|Terra|width=1600|float=center|caption={}|places=".format(llegenda)+u"\n"
taula=u'{| class="wikitable sortable" border="1"\n|+ Centre\n|-\n'
taula=taula+u'! scope="col" | Wiki\n! scope="col" | Punts \n! scope="col" | Profunditat (km)\n ! scope="col" | Prof (% de radi)\n ! scope="col" class="unsortable" | Coordenades \n ! scope="col" | Data de les dades\n'
for llengua in sorted(fig.keys()):
    if llengua=="wikidata":
        wiki=llengua
    else:
        wiki=u"{}wiki".format(llengua)
    print wiki
    if wiki in dicc.keys():
        print u"ja calculat",dicc[wiki]
        num,latc,lonc,radc,temps=dicc[wiki]
    elif completa==True:
        num,latc,lonc,radc=calcula(wiki)
        temps=time.time()
        dicc[wiki]=(num,latc,lonc,radc,temps)
        fitx=open(u"centre món.txt",'w')
        pickle.dump(dicc,fitx)
        fitx.close()
    else:
        continue
    imatge=fig[llengua]
    tmapa=tmapa+u"{{"+u"Location map~|Terra|lat={}|long={}|position=right|marksize=14|mark={}|label={}".format(latc,lonc,imatge,llengua)+u"}}\n"
    if llengua=="wikidata":
        twiki=u"[http://tools.wmflabs.org/autolist/index.php?language=ca&project=wikipedia&category=&depth=12&wdq=CLAIM%5B625%5D%20AND%20NOCLAIM%5B376%5D&pagepile=&statementlist=&run=Run&mode_manual=or&mode_cat=or&mode_wdq=not&mode_find=or&chunk_size=10000 wikidata]"
    else:
        twiki=u"[http://tools.wmflabs.org/autolist/index.php?language={1}&project=wikipedia&category=&depth=12&wdq=CLAIM%5B625%5D%20AND%20LINK%5B{0}%5D%20AND%20NOCLAIM%5B376%5D&pagepile=&statementlist=&run=Run&mode_manual=or&mode_cat=or&mode_wdq=not&mode_find=or&chunk_size=10000 {0}]".format(wiki,llengua)
    tcoord=u"{{"+u"coord|{}|{}|display=inline|name={}".format(latc,lonc,wiki)+u"}}"
    profkm=6371*(1-radc)
    data=time.asctime(time.gmtime(temps))
    taula=taula+u"|-\n"
    taula=taula+u'|{}||{{{{ntr|{}}}}}||{{{{ntr|{:.0f}}}}}|| align="right" |{:.2%}||{}||{}\n'.format(twiki,num,profkm,(1-radc),tcoord,data)
tmapa=tmapa+u"}}\n"
taula=taula+u"|}\n"
#print dicc
text=tmapa+u"{{mapa llista coordenades}}\n"+taula
pagdesti=pywikibot.Page(site,u"Usuari:PereBot/prova")
pagdesti.put(text,u"Robot busca el centre de la Terra")
pywikibot.stopme()