ویکی‌پدیا:درخواست ربات/استخراج مقالات شهرهای ناموجود

نتایج این ربات در زیرصفحهٔ ویکی‌پدیا:گزارش دیتابیس/شهرهای ناموجود ذخیره می‌شود.

#!/usr/bin/python
# -*- coding: utf-8  -*-
#
# Reza(User:reza1615), 2016
#
# Distributed under the terms of MIT License (MIT)
#coding:utf8
import requests,codecs,urllib
import pywikibot,re,string
faSite = pywikibot.Site('fa')
enSite= pywikibot.Site('en')
Botversion ='۲.۰۱'
#u"Q30":u"ایالات متحده آمریکا",u"Q159":u"روسیه",u"Q183":u"آلمان",u"Q142":u"فرانسه"
Qery_list={u"Q43":u"ترکیه",
            u"Q668":u"هند",u"Q29":u"اسپانیا",u"Q20":u"نروژ",u"Q16":u"کانادا",u"Q148":u"جمهوری خلق چین",u"Q298":u"شیلی",
            u"Q33":u"فنلاند",u"Q212":u"اوکراین",u"Q34":u"سوئد",u"Q41":u"یونان",u"Q39":u"سوئیس",u"Q38":u"ایتالیا",u"Q801":u"اسرائیل",
            u"Q79":u"مصر",u"Q219":u"بلغارستان",u"Q36":u"لهستان",u"Q227":u"جمهوری آذربایجان",u"Q189":u"ایسلند",u"Q17":u"ژاپن",
            u"Q224":u"کرواسی",u"Q28":u"مجارستان",u"Q155":u"برزیل",u"Q184":u"بلاروس",u"Q252":u"اندونزی",u"Q399":u"ارمنستان",
            u"Q889":u"افغانستان",u"Q40":u"اتریش",u"Q214":u"اسلواکی",u"Q228":u"آندورا",u"Q237":u"واتیکان",u"Q258":u"آفریقای جنوبی",
            u"Q843":u"پاکستان",u"Q55":u"هلند",u"Q31":u"بلژیک",u"Q881":u"ویتنام",u"Q869":u"تایلند",u"Q45":u"پرتغال",u"Q211":u"لتونی",
            u"Q232":u"قزاقستان",u"Q37":u"لیتوانی",u"Q408":u"استرالیا",u"Q414":u"آرژانتین",u"Q796":u"عراق",u"Q145":u"بریتانیا",u"Q262":u"الجزایر",
            u"Q717":u"ونزوئلا",u"Q884":u"کره جنوبی",u"Q230":u"گرجستان",u"Q96":u"مکزیک",u"Q423":u"کره شمالی",u"Q222":u"آلبانی",u"Q225":u"بوسنی و هرزگوین",
            u"Q1016":u"لیبی",u"Q739":u"کلمبیا",u"Q229":u"قبرس",u"Q334":u"سنگاپور",u"Q218":u"رومانی",u"Q794":u"ایران",u"Q115":u"اتیوپی",u"Q191":u"استونی",
            u"Q858":u"سوریه",u"Q213":u"جمهوری چک",u"Q664":u"نیوزیلند",u"Q27":u"ایرلند",u"Q902":u"بنگلادش",u"Q928":u"فیلیپین",u"Q1033":u"نیجریه",
            u"Q837":u"نپال",u"Q403":u"صربستان",u"Q1049":u"سودان",u"Q347":u"لیختن‌اشتاین",u"Q32":u"لوکزامبورگ",u"Q114":u"کنیا",u"Q77":u"اروگوئه",
            u"Q805":u"یمن",u"Q810":u"اردن",u"Q854":u"سری‌لانکا",u"Q215":u"اسلوونی",u"Q233":u"مالت",u"Q419":u"پرو",u"Q736":u"اکوادور",u"Q238":u"سان مارینو",
            u"Q836":u"میانمار",u"Q217":u"مولداوی",u"Q954":u"زیمبابوه",u"Q963":u"بوتسوانا",u"Q878":u"امارات متحده عربی",u"Q733":u"پاراگوئه",
            u"Q750":u"بولیوی",u"Q35":u"دانمارک",u"Q265":u"ازبکستان",u"Q235":u"موناکو",u"Q241":u"کوبا",u"Q221":u"جمهوری مقدونیه",u"Q916":u"آنگولا",
            u"Q711":u"مغولستان",u"Q822":u"لبنان",u"Q842":u"عمان",u"Q236":u"مونته‌نگرو",u"Q965":u"بورکینافاسو",u"Q1000":u"گابن",u"Q1008":u"ساحل عاج",
            u"Q833":u"مالزی",u"Q953":u"زامبیا",u"Q424":u"کامبوج",u"Q967":u"بوروندی",u"Q117":u"غنا",u"Q819":u"لائوس",u"Q1036":u"اوگاندا",u"Q924":u"تانزانیا",
            u"Q1006":u"گینه",u"Q917":u"بوتان (کشور)",u"Q1032":u"نیجر",u"Q1025":u"موریتانی",u"Q1030":u"نامیبیا",u"Q1037":u"رواندا",u"Q574":u"تیمور شرقی",
            u"Q929":u"جمهوری آفریقای مرکزی",u"Q398":u"بحرین",u"Q962":u"بنین",u"Q971":u"جمهوری کنگو",u"Q974":u"جمهوری دموکراتیک کنگو",
            u"Q1019":u"ماداگاسکار",u"Q1028":u"مراکش",u"Q921":u"برونئی",u"Q792":u"السالوادور",u"Q813":u"قرقیزستان",u"Q1009":u"کامرون",
            u"Q1044":u"سیرالئون",u"Q657":u"چاد",u"Q804":u"پاناما",u"Q863":u"تاجیکستان",u"Q948":u"تونس",u"Q1029":u"موزامبیک",u"Q912":u"مالی",
            u"Q1013":u"لسوتو",u"Q800":u"کاستاریکا",u"Q846":u"قطر",u"Q1045":u"سومالی",u"Q817":u"کویت",u"Q1041":u"سنگال",u"Q874":u"ترکمنستان",
            u"Q970":u"کومور",u"Q1005":u"گامبیا",u"Q730":u"سورینام",u"Q734":u"گویان",u"Q986":u"اریتره",u"Q983":u"گینه استوایی",u"Q1014":u"لیبریا",
            u"Q766":u"جامائیکا",u"Q783":u"هندوراس",u"Q242":u"بلیز",u"Q1011":u"کاپ ورد",u"Q977":u"جیبوتی",u"Q865":u"تایوان",u"Q958":u"سودان جنوبی",
            u"Q774":u"گواتمالا",u"Q1020":u"مالاوی",u"Q1050":u"سوازیلند",u"Q945":u"توگو",u"Q790":u"هائیتی",u"Q778":u"باهاما",u"Q811":u"نیکاراگوئه",
            u"Q678":u"تونگا",u"Q826":u"مالدیو",u"Q1007":u"گینه بیسائو",u"Q697":u"نائورو",u"Q244":u"باربادوس",u"Q1042":u"سیشل",u"Q712":u"فیجی",
            u"Q781":u"آنتیگوا و باربودا",u"Q784":u"دومینیکا",u"Q1027":u"موریس",u"Q786":u"جمهوری دومینیکن",u"Q1039":u"سائوتومه و پرنسیپ",
            u"Q695":u"پالائو",u"Q672":u"تووالو",u"Q763":u"سنت کیتس و نویس",u"Q1246":u"کوزوو",u"Q754":u"ترینیداد و توباگو",u"Q686":u"وانواتو",
            u"Q769":u"گرنادا",u"Q691":u"پاپوآ گینه نو",u"Q710":u"کیریباتی",u"Q683":u"ساموآ",u"Q760":u"سنت لوسیا",u"Q709":u"جزایر مارشال",
            u"Q757":u"سنت وینسنت و گرنادین‌ها",u"Q702":u"ایالات فدرال میکرونزی",u"Q23334":u"آبخاز",u"Q907112":u"ترانس‌نیستریا",u"Q40362":u"جمهوری دموکراتیک عربی صحرا",
            u"Q29999":u"پادشاهی هلند"}
Qery_list={u"Q17":u"ژاپن"}
#Qery_list={u"Q30":u"ایالات متحده آمریکا"}

arabic_country=[u"اردن",u"اریتره",u"ازواد",u"اسرائیل",u"الجزایر",u"امارات متحده عربی",u"بحرین",u"تونس"
                ,u"جیبوتی",u"داعش",u"سودان",u"سوریه",u"سومالی‌لند",u"سومالی",u"صحرای غربی",u"عراق",u"عربستان سعودی"
                ,u"عمان",u"فلسطین",u"قطر",u"لبنان",u"لیبی",u"مراکش",u"مصر",u"موریتانی",u"پانتلند",u"چاد"
                ,u"کردستان سوریه",u"کورماکیتیس",u"کومور",u"کویت",u"یمن"]

def getArabic(title,Country):
    arsite = pywikibot.Site('ar', 'wikipedia')
    ensite = pywikibot.Site('en', 'wikipedia')
    params = {
        'action': 'query',
        'redirects': '',
        'titles': title
    }
    query_res = pywikibot.data.api.Request(site=ensite, **params).submit()


    normalizeds = query_res['query'].get('normalized', [])
    if len(normalizeds):
        title = normalizeds[0]['to']
        
    redirects = query_res['query'].get('redirects', [])
    if len(redirects):
        title = redirects[0]['to']


    wikidata = pywikibot.Site('wikidata', 'wikidata')
    
    endbName = ensite.dbName()
    fadbName = arsite.dbName()
    params = {
        'action': 'wbgetentities',
        'sites': endbName,
        'titles': title,
        'props': 'sitelinks'
    }

    try:
        query_res = pywikibot.data.api.Request(site=wikidata, **params).submit()
    except:
        return ''

    matches_titles = {}
    entities = query_res.get('entities', {})
    for qid, entity in entities.items():
        if fadbName in entity.get('sitelinks', {}):
            ar_title = entity['sitelinks'][fadbName]

            # for not updated since addition of badges on Wikidata items
            if not isinstance(title, str):
                ar_title = ar_title['title']
            return ar_title.replace(u'ي',u'ی').replace(u'ك',u'ک').replace(u'ة',u'ه').replace(u'(مدینه)',u'('+Country+u')').replace(u'(عمران)',u'('+Country+u')')

    return ''


def get_query(Qadress,Country):
    text,text2=u'\n',u'\n'
    myurl="https://query.wikidata.org/sparql?format=json&query=SELECT%20?item%20?enarticle%20(COUNT(DISTINCT%20?sitelink)%20AS%20?linkcount)%20?itemLabel%20WHERE%20{%20?item%20wdt:P31/wdt:P279%2a%20wd:Q486972%20.%20?sitelink%20schema:about%20?item%20.%20?item%20wdt:P17%20wd:"+Qadress+"%20.%20optional%20{%20?enarticle%20schema:about%20?item%20;%20schema:isPartOf%20%3Chttps://en.wikipedia.org/%3E%20.}%20minus%20{%20?article%20schema:about%20?item%20.%20?article%20schema:inLanguage%20%22fa%22%20.%20?article%20schema:isPartOf%20%3Chttps://fa.wikipedia.org/%3E%20}%20SERVICE%20wikibase:label%20{%20bd:serviceParam%20wikibase:language%20%22en,fa%22%20.%20}%20}%20GROUP%20BY%20?item%20?itemLabel%20?enarticle%20ORDER%20BY%20DESC(?linkcount)"
    resp = requests.get(myurl)
    resp=resp.json()
       
    counter=0
    for items in resp["results"]["bindings"]:
        #try:
            
            Qitems,items_title=u'',u''
            Qitems=items["item"]["value"]
            try:
                if u'/Q' in Qitems:
                    Qitems=u'Q'+Qitems.split(u'/Q')[1].strip()
                #print str(items)
                items_title=items["enarticle"]["value"]
            except:
                continue
            if u'wiki/' in items_title:
                items_title=items_title.split(u'wiki/')[1]
                items_title=items_title.replace(u'%20',u' ').strip()
                items_title=urllib.unquote(items_title.encode('utf8')).decode('utf8')
            Link_count=items["linkcount"]["value"].strip()
            arabictitle=u''
            if Country in arabic_country:
                arabictitle=getArabic(items_title,Country)
                addlast=u'||'+arabictitle+u'\n'
            else:
                addlast=u'\n'
            try:
                enpage=pywikibot.Page(enSite,items_title)
                entext=enpage.get()
            except:
                with codecs.open( u'erroritme.txt',mode = 'a',encoding = 'utf8' ) as fars:
                    fars.write(Qitems+u'\t'+items_title+u'\n' )
                continue
            if re.sub(ur'\{\{ *([Gg]eobox|[Ii]nfobox)',u'',entext)==entext:
                 continue
            na_lang=re.findall(ur'\| *native_name *\=([^\|\n]+)(?:\n|\|)',entext)
            if not na_lang:
                if u'{{lang' in entext:
                    na_lang=entext.split(u'{{lang')[1].split('}}')[0]
                    if string.count(na_lang,u'|')>1:
                        na_lang=na_lang.split(u'|')[2].strip()
                    else:
                        if u'|' in na_lang:
                            na_lang=na_lang.split(u'|')[1].strip()
                        else:
                            na_lang=na_lang
            else:
                na_lang=na_lang[0].strip()
            if len(addlast.strip())<2:
                if na_lang and len(na_lang.split(u'{')[0].strip())<len(items_title)+5:
                    addlast=u'||'+na_lang.split(u'{')[0].strip()+u'\n'
                else:
                    na_lang=u''
                    addlast=u'|| \n'
            else:
                na_lang=arabictitle
            counter+=1
            if counter > 2000:
                break
            text+=u'|-\n|{{جا:formatnum:'+str(counter)+u'}}||[[:en:'+items_title+u']]||'+Qitems+u'||{{جا:formatnum:'+Link_count+u'}}\n'
            na_lang=na_lang.split(u'{')[0].strip()
            if na_lang.strip() and len(na_lang.strip())<25 and re.sub(u'[a-zA-Z]+',u'',na_lang)==na_lang:
                text2+=u'|-\n| '+na_lang+u' > نام‌فارسی @ '+items_title+u' \n'
            else:
                text2+=u'|-\n| نام‌فارسی @ '+items_title+u' \n'
        #except:
        #    continue
    return text,text2

def save_page(text,text2,Country):
    is_arabic=False
    link_adress=u'ویکی‌پدیا:گزارش دیتابیس/شهرهای ناموجود/'+Country
    upper_page=u'{{الگوی بالای فهرست شهرهای ناموجود|'+Country+u'}}\n'
    upper=u'{|class="wikitable sortable"\n!#!!مقالهٔ شهر{{سخ}} در ویکی‌انگلیسی!!ویکی{{سخ}}داده!!میان{{سخ}}ویکی'
    down=u'|}'
    #if Country in arabic_country:
    #upper+=u'!!عنوان به زبان محلی{{سخ}} با کمی تغییرات'
    my_text=upper_page+u'\n<div style="float: right">\n'+upper+text+down+u'\n</div>\n<div style="float: right">\n{|class="wikitable sortable"\n!برای ابزار به‌ویکی‌فا انبوه {{سخ}} ستون زیر را کپی کنید'+text2+down+u'\n</div>'
    fapage=pywikibot.Page(faSite,link_adress)
    my_text=fapage.put(my_text,u'ربات: بروزرسانی آمار شهرهای ناموجود')

passport=True
for Ql in Qery_list:
        if Qery_list[Ql]==u'اسلوونی':
            passport=True
        if not passport:
            continue

    #try:
        pywikibot.output(u'------- '+Qery_list[Ql]+u' ---------')
        text,text2=get_query(Ql,Qery_list[Ql])
        save_page(text,text2,Qery_list[Ql])
    #except:
    #    continue
#with codecs.open( 'Myresult2.txt',mode = 'w',encoding = 'utf8' ) as f:
#        f.write( str(my_dict) )