Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- python3
- import requests, html, math
- geni=lambda x:requests.get("https://query.wikidata.org/sparql?query=SELECT%20%3Fid%7B%3Fid%20wdt%3AP2600%20%22"+str(x)+"%22%7D%20LIMIT%201",headers={"Accept":"text/csv","User-Agent":"Bugreporter"}).text[35:].strip()
- def gettarget(q,p):
- q=str(q)
- if q[0]!="Q": q="Q"+q
- p=str(p)
- if p[0]!="P": p="P"+p
- data=requests.get("https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&entity="+q+"&property="+p+"&props=",headers={"User-Agent":"Bugreporter"}).json()
- if "claims" not in data:
- print(q,p)
- data=data["claims"]
- if p not in data: return None
- data=data[p]
- data=[i for i in data if i["rank"]!="deprecated"]
- data1=[i for i in data if i["rank"]=="preferred"]
- if len(data1)>0: data=data1
- if len(data)==0: return None
- data=data[0]["mainsnak"]
- if data["snaktype"]!="value": return None
- data=data["datavalue"]
- if data["type"]=="wikibase-entityid": return data["value"]["id"]
- return data["value"]
- def resolve_redirect(q):
- if not q:
- return ""
- data=requests.get("https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids="+q+"&props=info",headers={"User-Agent":"Bugreporter"}).json()["entities"]
- if q not in data:
- return ""
- else:
- return data[q]["id"]
- def getlabel(q):
- q=str(q)
- if q[0]!="Q": q="Q"+q
- data=requests.get("https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids="+q+"&props=labels&languages=en",headers={"User-Agent":"Bugreporter"}).json()["entities"][q]["labels"]
- if "en" in data:
- return data["en"]["value"]
- else:
- return ""
- import pywikibot
- pywikibot.config.put_throttle=0
- pywikibot.config.minthrottle=0
- pywikibot.config.maxthrottle=0
- pywikibot.config.maxlag=0
- geni_items={}
- def geni_get(id):
- if id in geni_items:
- return geni_items[id]
- geni_id=geni(id)
- if geni_id!="":
- geni_items[id]=geni_id
- return geni_id
- return ""
- def geni_get_or_create(id,name,gender,desc):
- if geni_get(id)!="":
- return geni_get(id)
- data={"labels":{"en":name},"descriptions":{"en":desc},"claims":{}}
- data['claims']['P31']=[{"mainsnak": {"snaktype": "value","property": "P31","datatype": "wikibase-item",
- "datavalue": {"value": {"entity-type": "item","numeric-id": 5},"type": "wikibase-entityid"}
- },"type": "statement","rank": "normal","references": []}]
- data['claims']['P21']=[{"mainsnak": {"snaktype": "value","property": "P21","datatype": "wikibase-item",
- "datavalue": {"value": {"entity-type": "item","numeric-id": 6581072 if gender=="F" else 6581097},"type": "wikibase-entityid"}
- },"type": "statement","rank": "normal","references": []}]
- data['claims']['P2600']=[{"mainsnak": {"snaktype": "value","property": "P2600","datatype": "external-id",
- "datavalue": {"value": id,"type": "string"}
- },"type": "statement","rank": "normal","references": []}]
- ip=pywikibot.ItemPage(pywikibot.Site('wikidata', 'wikidata'))
- ip.editEntity(data, summary="semi-automatic Geni import")
- geni_items[id]=ip.id
- return ip.id
- def showq(id):
- gender=gettarget(id,"P21")
- dob=gettarget(id,"P569")
- dob=dob["time"][1:].replace("T00:00:00Z","") if dob else ""
- dod=gettarget(id,"P570")
- dod=dod["time"][1:].replace("T00:00:00Z","") if dod else ""
- if gender=="Q6581072":
- return getlabel(id)+" ["+id+" "+dob+" - "+dod+"]"
- else:
- return getlabel(id)+" ("+id+" "+dob+" - "+dod+")"
- repo = pywikibot.Site("wikidata", "wikidata")
- genip22={}
- genip25={}
- p40=[]
- def dogeni(id,anf):
- if id=="" or anf==1:
- return
- if id[0]=="Q":
- old_id=id
- id=gettarget(id,"P2600")
- if not id:
- return
- geni_items[id]=old_id
- old_id=geni_get(id)
- layer=1<<int(math.log(anf,2)-1)
- nextanf=anf-layer-(anf&layer)
- nextgender="M" if anf&layer==0 else "F"
- nextid=(genip22 if anf&layer==0 else genip25).get(id,"-")
- if nextid!="-":
- dogeni(nextid,nextanf)
- return
- data=requests.get("https://www.geni.com/api/profile-g"+id+"/immediate-family?access_token="+access_token).json()
- profile_id=data["focus"]["id"]
- unions=data["nodes"][profile_id]["edges"]
- union_id=[i for i in unions.keys() if unions[i]["rel"]=="child"]
- if len(union_id)==0:
- return
- union_id=union_id[0]
- fmid=[i for i in data["nodes"].keys() if union_id in data["nodes"][i]["edges"] and data["nodes"][i]["edges"][union_id]["rel"]=="partner" and data["nodes"][i]["gender"][0].upper()==nextgender]
- if len(fmid)==0:
- return
- fmid=fmid[0]
- fmdata=requests.get("https://www.geni.com/api/"+fmid+"?access_token="+access_token).json()
- cfmid=fmdata["guid"]
- curitem=geni_get(cfmid)
- fmname=fmdata["name"]
- fm=resolve_redirect(gettarget(old_id,("P22" if nextgender=="M" else "P25")))
- input(showq(old_id)+"/"+id+"/"+nextgender+str(anf)+" -- "+fmname+"/"+fm+'/'+cfmid)
- if fm:
- nfmid=gettarget(fm,"P2600")
- if nfmid!=cfmid:
- fmlabel=getlabel(fm)
- fmlabel=fmlabel.replace("(?)","").strip()
- if (fmlabel not in fmname) or curitem or nfmid:
- x=input(showq(fm)+(("/"+nfmid) if nfmid else "")+" vs "+fmname+(" (" if nextgender else " [")+(")" if nextgender else "]")+"/"+cfmid+("/"+curitem if curitem else "")).strip()
- if x!="":
- return
- item = pywikibot.ItemPage(repo, fm)
- claim = pywikibot.Claim(repo, 'P2600')
- claim.setTarget(cfmid)
- item.addClaim(claim, summary="semi-automatic Geni import")
- geni_items[cfmid]=fm
- else:
- if not curitem:
- curitem=geni_get_or_create(cfmid,fmname,nextgender,"")
- if (curitem,old_id) not in p40:
- if int(old_id[1:])<96000000 and int(curitem[1:])<96000000:
- x=input(showq(old_id)+(" P22 " if nextgender=="M" else " P25 ")+showq(curitem))
- if x!="":
- return
- item1 = pywikibot.ItemPage(repo, curitem)
- item2 = pywikibot.ItemPage(repo, old_id)
- claim1 = pywikibot.Claim(repo, ("P22" if nextgender=="M" else "P25"))
- claim1.setTarget(item1)
- statedin = pywikibot.Claim(repo, u'P248')
- statedin.setTarget(pywikibot.ItemPage(repo, "Q2621214"))
- claim1.addSources([statedin])
- item2.addClaim(claim1, summary="semi-automatic Geni import")
- claim2 = pywikibot.Claim(repo, "P40")
- claim2.setTarget(item2)
- statedin = pywikibot.Claim(repo, u'P248')
- statedin.setTarget(pywikibot.ItemPage(repo, "Q2621214"))
- claim2.addSources([statedin])
- item1.addClaim(claim2, summary="semi-automatic Geni import")
- p40.append((curitem,old_id))
- (genip22 if anf&layer==0 else genip25)[id]=cfmid
- dogeni(cfmid,nextanf)
Add Comment
Please, Sign In to add comment