ویکیپدیا:درخواستهای ربات/مقالهساز/فرودگاهها
این کاربر یک ربات است | |
---|---|
وظیفه(ها) | ساخت مقالههای فرودگاهها و پایگاههای هوایی |
موافق محرومیت؟ | خیر |
موافق خاموششدن اضطراری؟ | بله |
اجازهنامه | CC-BY-SA 3.0 |
تست شده؟ | بله |
کد به روشهای مختلف و به کمک اطلاعات موجود در جعبه اطلاعات و متن بخش آغازین و میانویکیها و بعضاً حتی زیربخشهای مقالهٔ انگلیسی مرتبط با فرودگاه یا پایگاه هوایی، مقالهٔ فارسی را (با جعبهٔ اطلاعات و ردههای مناسب و میانویکی و الگوی خرد مرتبط و الخ) میسازد (مثلاً نام بومی فرودگاه را نخست بر اساس اطلاعات infobox و اگر نبود/نشد از بخش آغازین باز هم اگر نشد از عنوان میانویکی به زبان کشور مربوطه میگیرد). (نمونه)
بسته به نوع کشور متغیرهای بخش SETTING را تغییر دهید. (مثلاً تنظیمات این کد برای کشور قزاقستان است)
برای گذاشتن روی حالت تست (صفحه ذخیره نمیشود ولی صفحهٔ تولیدشده بر روی نمایشگر چاپ میشود)، علامت کامنت (#) پیش از test = False را بردارید و به آن مقدار True دهید.
جا دارد بگویم ایدهٔ ساخت مقاله از روی ویکیهای دیگر از امیر (Ladsgroup) بود و اولین کد به این سبک را وی ساخت که کدش در ویکی هم موجود است.
#!/usr/bin/python
# -*- coding: utf-8 -*-
__version__ = '$Id: airbases.py, v1.0 2010/04/15$'
from BeautifulSoup import UnicodeDammit
import sys, re, urllib2, httplib, socket, codecs, ftplib
import wikipedia, catlib, pagegenerators, noreferences, category
import subprocess, tempfile, os ,config
# SETTING
#test = False
cntName = u'قزاقستان'
cntNameEn = u'Kazakhstan'
cntNameEnAlt = u'Kazakhstan'
langName = u'قزاقی'
langCode = u'kk' # کد ایزو ۶۳۹ زبان رسمی کشور موردنظر
dName = u'аэропорт|аэродром|авиабаза' ###
artDic = {u'Almaty International Airport': u'فرودگاه بینالمللی آلماآتی',
u'Boraldai Airport|Almaty-Burundai Airport': u'فرودگاه برولدای',
u'Aktau Airport': u'فرودگاه آقتائو',
u'Aktobe Airport': u'فرودگاه آقتوبه',
u'Arkalyk Airport': u'فرودگاه آرقالیق',
u'Astana International Airport': u'فرودگاه بینالمللی آستانه',
u'Atbasar Airport': u'فرودگاه آتباسار',
u'Atyrau Airport': u'فرودگاه آتیرائو',
u'Balkhash Airport': u'فرودگاه بالقاش',
u'Zhezkazgan Airport': u'فرودگاه جزقازغان',
u'Ekibastuz Airport': u'فرودگاه اکیباستوز',
u'Sary-Arka Airport': u'فرودگاه ساری-آرقا',
u'Kokshetau Airport': u'فرودگاه کوکشتائو',
u'Kostanay Airport': u'فرودگاه قوستانای',
u'Oral Ak Zhol Airport': u'فرودگاه آق ژول',
u'Oskemen Airport': u'فرودگاه اوسکمن',
u'Pavlodar Airport': u'فرودگاه پاولودار',
u'Petropavlovsk Airport': u'فرودگاه پتروپاولوفسک',
u'Kyzylorda Airport': u'فرودگاه قیزیلاوردا',
u'Semey Airport': u'فرودگاه سمیی',
u'Shymkent Airport': u'فرودگاه شیمکنت',
u'Taldykorgan Airport': u'فرودگاه تالدیقورغان',
u'Taraz Airport': u'فرودگاه تاراز',
u'Zaysan Airport': u'فرودگاه زایسان',
u'Ush Tobe': u'اوش توبه'
}
#locDic = {u'Vaskovo':u'وسکوف'}
enSite = wikipedia.getSite('en')
text = ''
info = dict()
faNums = u'۰۱۲۳۴۵۶۷۸۹'
enNums = u'0123456789'
bLA = u'(?![\w\-])'
bLB = u'(?<![\w\-])'
R = re.compile(ur'\[\[(.+?)(?:\]\]|\|)')
keyTpl = ('nativename-a', 'image', 'caption', 'type', 'owner', 'operator', 'owner-oper', 'location', 'coordinates', 'built', 'used', 'occupants', 'IATA', 'ICAO', 'FAA', 'TC', 'GPS')
def translate(trnsTxt):
trnsTxt = re.sub(u'[Cc]oncrete ?(?:raod|\(material\)|)', u'بتن', trnsTxt)
trnsTxt = re.sub(u'[Aa]sphalt', u'آسفالت', trnsTxt)
trnsTxt = re.sub(u'[Gg]ravel', u'شنوماسه', trnsTxt)
trnsTxt = re.sub(u'(?:[Gg]reen|[Tt]urf ?(?:/|&|and) ?[Ll]awn|[Tt]urf|[Ll]awn|[Gg]rassy?)(?: ?[Gg]rass(?:es|)|)', u'چمن', trnsTxt)
trnsTxt = re.sub(u'[Dd]irt', u'خاکی', trnsTxt)
trnsTxt = re.sub(u'[Ww]ater', u'آب', trnsTxt)
trnsTxt = re.sub(u'[Pp]aved', u'صافشده', trnsTxt)
trnsTxt = re.sub(u'[Pp]assengers', u'مسافران', trnsTxt)
trnsTxt = re.sub(u'[Mm]ovements', u'تحرکات', trnsTxt)
trnsTxt = re.sub(u'[Mm]ilitary ?(?:/|-|&|and) ?[Pp]ublic', u'نظامی/عمومی', trnsTxt)
trnsTxt = re.sub(u'[Pp]ublic ?(?:/|-|&|and) ?[Mm]ilitary', u'نظامی/عمومی', trnsTxt)
trnsTxt = re.sub(u'[Mm]ilitary', u'نظامی', trnsTxt)
trnsTxt = re.sub(u'(?:[Pp]ublic|[Cc]ivilian|[Cc]ivil)', u'عمومی', trnsTxt)
trnsTxt = re.sub(u'[Pp]rivate', u'خصوصی', trnsTxt)
trnsTxt = re.sub(u'[Jj]oint', u'مشترک', trnsTxt)
trnsTxt = re.sub(u'(?:%s |%s )[Gg]overnment' % (cntNameEn, cntNameEnAlt), u'دولت '+cntName, trnsTxt)
trnsTxt = re.sub(bLB+u'[Yy]es', u'بله', trnsTxt)
trnsTxt = re.sub(bLB+u'[Nn]o'+bLA, u'خیر', trnsTxt)
trnsTxt = re.sub(u'[Ss]tatistics?', u'آمار و ارقام', trnsTxt)
trnsTxt = re.sub(u'[Ss]ources?: ?', u'منبع: ', trnsTxt)
trnsTxt = re.sub(u'[Uu]nknown', u'نامعلوم', trnsTxt)
trnsTxt = re.sub(u'[Aa]irport "?(.*?)"?(?: [Ll]td\.?| [Cc]ompany)', ur'شرکت هواپیمایی \1', trnsTxt)
trnsTxt = re.sub(u'"?(.*?)"?(?: [Ll]td\.?| [Cc]ompany)', ur'شرکت \1', trnsTxt)
trnsTxt = re.sub(cntNameEn+u' ?[Aa]ir ?[Ff]orce', u'نیروی هوایی '+cntName, trnsTxt)
trnsTxt = re.sub(u'(?:\[\[|)'+cntNameEnAlt+u'(?:\]\]|)', u'[['+cntName+u']]', trnsTxt)
trnsTxt = re.sub(u'[Aa]bandoned', u'رهاشده', trnsTxt)
trnsTxt = re.sub(u'[Pp]resent', u'اکنون', trnsTxt)
for i in range(0, 10):
trnsTxt = trnsTxt.replace(enNums[i], faNums[i])
for i in range(0, 10):
trnsTxt = trnsTxt.replace('r'+faNums[i], 'r'+enNums[i])
trnsTxt = trnsTxt.replace('h'+faNums[i], 'h'+enNums[i])
trnsTxt = trnsTxt.replace('t'+faNums[i], 't'+enNums[i])
return trnsTxt
def extpar(mstr):
template = re.search(u'\{\{\s*[Ii]nfobox[^|]*?(\|(?:[^\}\{]|\{\{.*?\}\})*?)\}\}', mstr, re.S)
try:
#tplText = translate(template.group(0)) # redunant
m = re.split(u'\|((?:[^\|\}\{]|\{\{.*?\}\}|\[\[.*?\]\])*)', template.group(1), re.S)
for n in m:
if n.strip() != "":
tplSrp = re.search(ur'\s*?(.*?)\s*?=\s*?(.*)\s*?', n, re.S)#([^\=]*?)###\s
tplSrpOne = tplSrp.group(1).strip()
#tplSrpTwo = tplSrp.group(2)
tplSrpTwo = translate(tplSrp.group(2)).strip()#(tplSrpTwo)
if re.sub(ur'[\s\n]*', u'', tplSrpTwo, re.S) != '':
info[tplSrpOne] = tplSrpTwo
else:
info[tplSrpOne] = 'NV'
for i in range(0, len(keyTpl)):
if not info.has_key(keyTpl[i]):
info[keyTpl[i]] = 'NK'
return info
except AttributeError:
print 'ERROR: Infobox'
return False
def englishdictionry(a):
apage = wikipedia.Page(enSite, a)
try:
atext = apage.get()
except wikipedia.IsRedirectPage:
apage = apage.getRedirectTarget()
atext = apage.get()
except wikipedia.NoPage:
return 'False'
if re.search(ur'\[\[fa:(.+?)(?:\]\]|\|)', atext):
R = re.compile(ur'\[\[fa:(.+?)(?:\]\]|\|)')
for aaa in R.findall(atext):
return aaa
else:
return 'False'
def faFinder(a):
apage = wikipedia.Page(enSite, a)
try:
atext = apage.get()
except wikipedia.IsRedirectPage:
apage = apage.getRedirectTarget()
atext = apage.get()
except wikipedia.NoPage:
return 'False'
try:
return re.search(ur'\[\[fa:(.+?)]]', atext).group(1)
except AttributeError:
return 'False'
def main():
for enName in artDic.keys():
print u'[[%s]]' % enName
enpage = wikipedia.Page(enSite, enName)
try:
enText = enpage.get()
except wikipedia.IsRedirectPage:
enpage = enpage.getRedirectTarget()
enText = enpage.get()
except wikipedia.NoPage:
print u'ERROR: NoPage: ' + enName
continue
datadict = extpar(enText) ###
if datadict is False:
continue
faName = artDic[enName]
enPagePermalink = enpage.permalink()
enPagePermalink = enPagePermalink.replace(u'&redirect=no&useskin=monobook', u'')
bazbini = False
cats = u''
stubs = u'\n{{فرودگاه-%s-خرد}}\n' % cntName
if artDic.has_key(enName):
# Name in Lang.
nameInLang = u''
try:
nameInLang = re.search(u'{{[Ll]ang-'+langCode+ur'\|(.*?)}}', enText).group(1)
except AttributeError:
try:
nameInLang = re.search(u'\[\['+langCode+u':(.*?)\]\]', enText).group(1)
except AttributeError:
nameInLang = False
if nameInLang is not False:
nameInLang = re.sub(u' \((?:'+dName+u')\)', u'', nameInLang)
inLang = u'{{به ' + langName + u'|' + nameInLang + u'}} '
else:
inLang = u''
location = u''
if info['location'] != u'NK' and info['location'] != u'NV':
location = re.sub(u'\s*?\[\[(.*?)\]\]\s*?', ur'\1', info['location'])#info['location'] = re.sub(u'\s*?\[\[(.*?)\]\]\s*?', ur'\1', info['location'])
#try:
#location = locDic[info['location']]
#except KeyError:
#location = faFinder(info['location'])
#if location == 'False':
#location = info['location']
#cats += u'[[رده:مقالههای نیازمند به فارسیسازی]]\n'
#bazbini = True
else:
bazbini = True
infobox = re.search(u'\{\{ ?[Ii]nfobox ?[Aa]ir.*?(?:[^\}\{]|\{\{.*?\}\})*?\}\}', enText, re.S)
if not infobox:
continue
infobox = translate(infobox.group(0))
infobox = re.sub(u'\|\s*?name(\s*?)=\s*?.+\s*?', ur'| name\1= '+faName, infobox)
infobox = re.sub(u'\|\s*?location(\s*?)=\s*?.+\s*?', ur'| location\1= [['+location+u']]', infobox)
infobox = infobox.replace(u'[[]]', u'')
if re.search(u'{{[Aa]irport codes.*?}}', enText):
codeTpl = ('IATA', 'ICAO', 'FAA', 'TC', 'GPS')
temp = False
for i in range(0, 4):
if info[codeTpl[i]] != u'NK' and info[codeTpl[i]] != u'NV':
temp = True
if temp is False:
bazbini = True
international = False
if re.search(bLB+u'(?:is|was) an? .*?international air', enText):
international = True
text = infobox + u"\n'''" + faName + u"''' " + inLang
if re.search(bLB+u'(?:is|was) an? .*?air ?(?:port|field)', enText):
text += u'فرودگاهی '
if international is True:
text += u'بینالمللی '
cats += u'[[رده:فرودگاههای بینالمللی ' + cntName + u']]\n' % cntName
elif re.search(bLB+u'(?:is|was) an? .*?air ?base', enText):
text += u'یک [[پایگاه هوایی]] '
if international is True:
text += u'بینالمللی '
cats += u'[[رده:پایگاههای هوایی بینالمللی %s]]\n' % cntName
elif re.search(bLB+u'(?:is|was) an? .*?air ?line', enText):
text += u'یک [[شرکت هواپیمایی]] '
if international is True:
text += u'بینالمللی '
cats += u'[[رده:شرکتهای هواپیمایی بینالمللی %s]]\n' % cntName
else:
cats += u'[[رده:شرکتهای هواپیمایی %s]]\n' % cntName
else:
bazbini = True
if u'عمومی' in info['type']:
text += u'عمومی '
if u'خصوصی' in info['type']:
text += u'خصوصی '
cats += u'[[رده:فرودگاههای خصوصی %s]]\n' % cntName
if u'نظامی' in info['type']:
text += u'نظامی '
cats += u'[[رده:فرودگاههای نظامی %s]]\n' % cntName
stubs += u'{{%s-نظامی-خرد}}' % cntName
text = re.sub(u'بینالمللی (عمومی|خصوصی|نظامی)', ur'بینالمللی و \1', text)
if u'نیروی هوایی' in info['operator']:
cats += u'[[رده:پایگاههای نیروی هوایی %s]]\n' % cntName
if not u'نظامی' in stubs:
stubs += u'{{%s-نظامی-خرد}}' % cntName
text += u'واقع'
if location == u'':
try:
location = re.search(bLB+u'(?:located|situated)(?: within| about) [0-9]+(?: ?[Kk]ms?| kilomete?re?s?)(?: ?\(.*?\))(?: outside| (?:south|north|)(?:east|west|))(?: from| of|) .*?\[\[(.*?)(?:\|.*?)\]\]', enText).group(1)
except AttributeError:
try:
location = re.search(bLB+u'(?:is|was) an? .*?air ?(?:port|field|line|base)(?: located| situated|) in \[\[(.*?)(?:\|.*?)\]\]', enText).group(1)
except AttributeError:
pass
if location != u'':
text += u' در [[%s]]' % location
else:
bazbini = True
text += u' در کشور [[%s]] است' % cntName
if info['operator'] != u'NK' and info['operator'] != u'NV':
if info['operator'] == u'رهاشده':
text += u' که رهاشدهاست و هماکنون مورد استفاده قرار نمیگیرد'
cats += u'[[رده:فرودگاههای رهاشده %s]]\n' % cntName
else:
text += u' که توسط %s اداره میشود' % info['operator']
text += u'.\n'
if re.search(u'\n=+.*?(?:[Aa]ccident|[Ii]ncident).*?=+\n', enText):
text += u'\n== سوانح ==\n{{بخش-خرد}}\n'
if re.search(u'= *[Gg]allery *=', enText):
text += u'\n== نگارخانه ==\n' + re.sub(ur'= *[Gg]allery *=+\n(.*?)\n=', ur'\1', enText, re.S) + u'\n'
bazbini = True
text += u'''
== جستارهای وابسته ==
{{ جستارهای وابسته
| درگاه = هوانوردی | درگاه۲ = %s
| فهرست فرودگاههای %s |
}}
''' % (cntName, cntName)
text += u'\n== منابع ==\n'
if u'<ref' in text:
text += u'{{پانویس|چپچین=بله}}\n'
text += u'* {{یادکرد-ویکی | پیوند = %s | عنوان = %s | زبان = انگلیسی |بازیابی = {{جا:الان|پیوند=نه}}}}\n' % (enPagePermalink, enName)
if re.search(u'= *[Ee]xternal [Ll]inks? *=', enText):
text += u'\n== پیوند به بیرون ==\n' + re.sub(ur'= *[Ee]xternal [Ll]inks? *=+\n(.*?\n.*?)(?=\{\{|\[\[[Cc]ategory:)', ur'\1', enText, re.S)
navbox = u'\n\n{{فرودگاههای %s}}\n' % cntName
RF = re.compile(ur'\[\[[Cc]ategory:(.+?)(?:\]\]|\|)')
for ahah in RF.findall(enText):
pagename = u'Category:'+ahah
if not englishdictionry(pagename) == 'False':
cats += u'\n[['+englishdictionry(pagename)+u']]'
if cats == u'':
bazbini = True
else:
cats = u'\n' + cats
if bazbini is True:
cats += u'\n[[رده:برای بازبینی انسان (فرودگاه)]]\n'
text += stubs + navbox + cats + u'\n\n[[en:'+enName+u']]\n'
text = text.replace(u'\n\n\n', u'\n\n').replace(u']]\n\n[[رده:', u']]\n[[رده:').replace(u'\n\n\n', u'\n\n')
page = wikipedia.Page(wikipedia.getSite(), faName)
#if test is True:
#print text
#wikipedia.stopme()
try:
pagetext = page.get()
except:
page.put(text, u'ربات: ایجاد مقاله ([[وپ:درخواستهای ربات/مقالهساز/فرودگاهها|کد]])')
f = codecs.open(u'wb.txt', 'a', 'utf-8')
f.write(u'[['+page.title()+u']]')
else:
if not u'[[en' in pagetext:
page.put(pagetext + u'\n\n[[en:'+enName+u']]\n', u'ربات: افزودن معادل انگلیسی')
f = codecs.open(u'wb.txt', 'a', 'utf-8')
f.write(u'[['+page.title()+u']]')
try:
main()
except KeyboardInterrupt:
pywikibot.stopme()