درخواستهای ربات/ویکیساز
این ربات برای ویکیسازی مقالات به صورت رباتیک و خودکار کاربرد دارد. شرح عملکرد آن در کاربر:FawikiPatroller/ویکیسازی رباتیک موجود است.
روش کار
ابتدا باید کوئریای از فهرست عنوان مقالات تهیه شود و در فولدر ربات قرار داده شود تا ربات بتواند از آن برای ویکیسازی استفاده کند. در کد YourBot نام حساب کاربری شماست آن را تغییر دهید.
کوئری
Select page_title FROM page WHERE
page_namespace = 0 AND page_namespace = 0 AND page_is_redirect = 0 AND page_title LIKE "%_%" AND LENGTH(page_title) < 150 AND LENGTH(page_title) > 5
AND NOT (page_title LIKE "%(%" or page_title LIKE "%ی%" or page_title LIKE "%ک%" or page_title LIKE "%۱%" or page_title LIKE "%۲%"
or page_title LIKE "%۳%" or page_title LIKE "%۴%" or page_title LIKE "%۵%" or page_title LIKE "%۶%" or page_title LIKE "%۷%"
or page_title LIKE "%۸%"or page_title LIKE "%۹%"or page_title LIKE "%۰%"or page_title LIKE "%1%"or page_title LIKE "%2%"or page_title LIKE "%3%"
or page_title LIKE "%4%"or page_title LIKE "%5%" or page_title LIKE "%6%" or page_title LIKE "%7%" or page_title LIKE "%8%" or page_title LIKE "%9%"
or page_title LIKE "%0%") ORDER BY LENGTH(page_title) DESC;
دستور اجرای sql
sql fawiki_p < links.sql > wiki_Articles.txt
کد
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Reza(User:reza1615), 2013
#
# Distributed under the terms of the CC-BY-SA 3.0.
# -*- coding: utf-8 -*-
import wikipedia,pagegenerators,re,pywikibot,query
import fa_cosmetic_changes,sys,codecs,string,login,time
wikipedia.config.put_throttle = 0
wikipedia.put_throttle.setDelay()
#--------------------------------------------------------------------------------------
bot_version=u'(۷.۵)'
disambig_template=u'الگو:ابهامزدایی'
film_name=u'فیلمها'
no_templates=[u'الگو:خوبیده',u'الگو:برگزیده',u'الگو:مقاله برگزیده',u'الگو:ویکیسازی رباتیک نه']
no_fa_words=[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'زیباترین',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'ناگه',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'شب']
original_lang='fa'
film_cat=u'رده:مقالههای خرد سینمایی'
site_category=ur'رده'
hidden_cat=u'\n[[رده:ویکیسازی رباتیک]]'
Black_links=u'کاربر:FawikiPatroller/Black Links'
White_Links=u'کاربر:FawikiPatroller/White Links'
no_words=u'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
#--------------------------------------------------------------------------------------
site = wikipedia.getSite(original_lang)
'''
Select page_title FROM page WHERE
page_namespace = 0 AND page_namespace = 0 AND page_is_redirect = 0 AND page_title LIKE "%_%" AND LENGTH(page_title) < 150 AND LENGTH(page_title) > 5
AND NOT (page_title LIKE "%(%" or page_title LIKE "%ی%" or page_title LIKE "%ک%" or page_title LIKE "%۱%" or page_title LIKE "%۲%"
or page_title LIKE "%۳%" or page_title LIKE "%۴%" or page_title LIKE "%۵%" or page_title LIKE "%۶%" or page_title LIKE "%۷%"
or page_title LIKE "%۸%"or page_title LIKE "%۹%"or page_title LIKE "%۰%"or page_title LIKE "%1%"or page_title LIKE "%2%"or page_title LIKE "%3%"
or page_title LIKE "%4%"or page_title LIKE "%5%" or page_title LIKE "%6%" or page_title LIKE "%7%" or page_title LIKE "%8%" or page_title LIKE "%9%"
or page_title LIKE "%0%") ORDER BY LENGTH(page_title) DESC;
sql fawiki_p < links.sql > wiki_Articles.txt
zip wiki_Articles wiki_Articles.txt
'''
fa_link_text = codecs.open('/data/project/YourBot/pywikipedia/wiki_Articles.txt','r' ,'utf8')
fa_link_text = fa_link_text.read().replace(u'page_title',u'').strip()
fa_link_list=fa_link_text.replace(u'_',u' ').replace(u'\r',u'').strip().split(u'\n')
#--------------------------------------------------------------------------------------
def login_wiki():
password_wiki = open("/data/project/YourBot/pywikipedia/passfile2", 'r')
password_wiki=password_wiki.read().replace('"','').strip()
passwords=password_wiki.split(',')[1].split(')')[0].strip()
usernames=password_wiki.split('(')[1].split(',')[0].strip()
botlog=login.LoginManager(password=passwords,username=usernames,site=site)
botlog.login()
def templatequery(enlink):
temps=[]
if enlink==u'':
return []
enlink=enlink.replace(u' ',u'_')
params = {
'action': 'query',
'prop':'templates',
'titles': enlink,
'redirects': 1,
'tllimit':500,
}
try:
categoryname = query.GetData(params,site)
for item in categoryname[u'query'][u'pages']:
templateha=categoryname[u'query'][u'pages'][item][u'templates']
break
for temp in templateha:
temps.append(temp[u'title'].replace(u'_',u' '))
return temps
except:
return []
TEMP_REGEX = re.compile(
'{{(?:msg:)?(?P<name>[^{\|]+?)(?:\|(?P<params>[^{]+?(?:{[^{]+?}[^{]*?)?))?}}')
def compileLinkR(withoutBracketed=False, onlyBracketed=False):
"""Return a regex that matches external links."""
notAtEnd = '\]\s\. :;,<>"\|\)'
notAtEndb = '\]\s\. :;,<>"\|'
notInside = '\]\s<>"'
regex = r'(?P<url>http[s]?://[^%(notInside)s]*?[^%(notAtEnd)s]' \
r'(?=[%(notAtEnd)s]*\'\')|http[s]?://[^%(notInside)s]*' \
r'[^%(notAtEnd)s])' % {'notInside': notInside, 'notAtEnd': notAtEnd}
regexb = r'(?P<urlb>http[s]?://[^%(notInside)s]*?[^%(notAtEnd)s]' \
r'(?=[%(notAtEnd)s]*\'\')|http[s]?://[^%(notInside)s]*' \
r'[^%(notAtEnd)s])' % {'notInside': notInside, 'notAtEnd': notAtEndb}
if withoutBracketed:
regex = r'(?<!\[)' + regex
elif onlyBracketed:
regex = r'\[' + regexb
else:
regex=r'(?:(?<!\[)'+ regex+r'|\['+regexb+')'
linkR = re.compile(regex)
return linkR
def findmarker(text, startwith=u'@@', append=None):
# find a string which is not part of text
if not append:
append = u'@'
mymarker = startwith
while mymarker in text:
mymarker += append
return mymarker
def catquery(enlink):
cats=[]
enlink=enlink.replace(u' ',u'_')
params = {
'action': 'query',
'prop': 'categories',
'titles': enlink,
'redirects': 1,
'cllimit':500,
}
try:
categoryname = query.GetData(params,site)
for item in categoryname[u'query'][u'pages']:
categoryha=categoryname[u'query'][u'pages'][item][u'categories']
break
for cat in categoryha:
cats.append(cat[u'title'])
return cats
except:
return False
def fa_replaceExcept(text, old, new, exceptions,marker='', site=None):
if site is None:
site = pywikibot.getSite()
exceptionRegexes = {
'comment': re.compile(r'(?s)<!--. *?-->'),
'header': re.compile(r'\r?\n=+. +=+ *\r?\n'),
'pre': re.compile(r'(?ism)<pre>. *?</pre>'),
'source': re.compile(r'(?is)<syntaxhighlight. *?</' + 'source>'),
'category': re.compile(ur'\[\['+site_category+ur'\:. *?\]\]'),
'ref': re.compile(r'(?ism)<ref[>]. *?</ref>'),
'startspace': re.compile(r'(?m)^ (. *?)$'),
'table': re.compile(r'(?ims)^{\|. *?^\|}|<table>. *?</table>'),
'hyperlink': compileLinkR(),
'gallery': re.compile(r'(?is)<gallery. *?>. *?</gallery>'),
'link': re.compile(r'\[\[[^\]\|]*(\|[^\]]*)?\]\]'),
'URL': re.compile(r'\[. *?\]'),
'file': re.compile(r'\[\[([fF]ile|پرونده|تصویر)\:[^\]\|]*(\|[^\]]*)?\]\]'),
'interwiki': re.compile(r'(?i)\[\[:?(%s)\s?:[^\]]*\]\][\s]*'
% '|'.join(site.validLanguageLinks() +
site.family.obsolete.keys())),
'property': re.compile(r'(?i)\{\{\s*#property:\s*p\d+\s*\}\}'),
'invoke': re.compile(r'(?i)\{\{\s*#invoke:. *?}\}'),
}
if isinstance(old, basestring):
old = re.compile(old)
dontTouchRegexes = []
except_templates = False
for exc in exceptions:
if isinstance(exc, basestring):
if exc in exceptionRegexes:
dontTouchRegexes.append(exceptionRegexes[exc])
elif exc == 'template':
except_templates = True
else:
dontTouchRegexes.append(re.compile(r'(?is)<%s>. *?</%s>'
% (exc, exc)))
if exc == 'source':
dontTouchRegexes.append(re.compile(
r'(?is)<syntaxhighlight. *?
'))
else: dontTouchRegexes.append(exc) if except_templates: marker1 = findmarker(text) marker2 = findmarker(text, u'##', u'#') Rvalue = re.compile('{{{. +?}}}') Rmarker1 = re.compile('%(mark)s(\d+)%(mark)s' % {'mark': marker1}) Rmarker2 = re.compile('%(mark)s(\d+)%(mark)s' % {'mark': marker2}) dontTouchRegexes.append(Rmarker1) origin = text values = {} count = 0 for m in Rvalue.finditer(text): count += 1 while u'}}}%d{{{' % count in origin: count += 1 item = m.group() text = text.replace(item, '%s%d%s' % (marker2, count, marker2)) values[count] = item inside = {} seen = set() count = 0 while TEMP_REGEX.search(text) is not None: for m in TEMP_REGEX.finditer(text): item = m.group() if item in seen: continue seen.add(item) count += 1 while u'}}%d{{' % count in origin: count += 1 text = text.replace(item, '%s%d%s' % (marker1, count, marker1)) for m2 in Rmarker1.finditer(item): item = item.replace(m2.group(), inside[int(m2.group(1))]) for m2 in Rmarker2.finditer(item): item = item.replace(m2.group(), values[int(m2.group(1))]) inside[count] = item index = 0 markerpos = len(text) while True: match = old.search(text, index) if not match: break nextExceptionMatch = None for dontTouchR in dontTouchRegexes: excMatch = dontTouchR.search(text, index) if excMatch and ( nextExceptionMatch is None or excMatch.start() < nextExceptionMatch.start()): nextExceptionMatch = excMatch
if nextExceptionMatch is not None \ and nextExceptionMatch.start() <= match.start(): index = nextExceptionMatch.end() else: if callable(new): replacement = new(match) else: new = new.replace('\\n', '\n') replacement = new
groupR = re.compile(r'\\(?P<number>\d+)|\\g<(?P<name>. +?)>') while True: groupMatch = groupR.search(replacement) if not groupMatch: break groupID = groupMatch.group('name') or \ int(groupMatch.group('number')) try: replacement = replacement[:groupMatch.start()] + \ match.group(groupID) + \ replacement[groupMatch.end():] except IndexError: print '\nInvalid group reference:', groupID print 'Groups found:\n', match.groups() raise IndexError text = text[:match.start()] + replacement + text[match.end():] break index = match.start() + len(replacement) markerpos = match.start() + len(replacement) text = text[:markerpos] + marker + text[markerpos:]
if except_templates: for m2 in Rmarker1.finditer(text): text = text.replace(m2.group(), inside[int(m2.group(1))]) for m2 in Rmarker2.finditer(text): text = text.replace(m2.group(), values[int(m2.group(1))]) return text
def redirect_find(page_link,wiki):
page_link=page_link.replace(u' ',u'_') site = wikipedia.getSite(wiki.replace(u'_',u'-')) params = { 'action': 'query', 'redirects':"", 'titles': page_link } query_page = query.GetData(params,site) try: redirect_link=query_page[u'query'][u'redirects'][0]['to'] return redirect_link except: if 'missing=""' in str(query_page): return False else: return page_link.replace(u'_',u' ')
def wikify(link):
wikipedia.output(u'--------------'+link+'----------------') counter=0 passing=True item_in_text=[] page = wikipedia.Page(site,link) old_text=page.get() temp_list=templatequery(link) for i in no_templates: if i in temp_list: passing=False wikipedia.output(u'\03{lightblue}The page has '+i+' so it is passed\03{default}') break if passing: Black_page = wikipedia.Page(site,Black_links) Black_List=Black_page.get().replace(u'*',u).replace(u'\r',u).split(u'\n')
White_page = wikipedia.Page(site,White_Links) White_List=White_page.get().replace(u'*',u).replace(u'\r',u).split(u'\n') old_text,cleaning_version,msg_clean=fa_cosmetic_changes.fa_cosmetic_changes(old_text,page) old_text=old_text.replace(u'\r',u).strip() text=old_text text2=text exceptions = ['URL','math', 'template', 'timeline','comment','header','pre','source','category','ref','startspace','table','hyperlink','gallery','link','interwiki','property','invoke', 'inputbox'] fa_links = len(page.linkedPages()) page_size=sys.getsizeof(old_text) size_limitation=page_size/1000 counter=fa_links added_item=u' ' wikipedia.output(' Number of Links limitation = '+str(size_limitation-counter)) for item in fa_link_list: pass_root=True if item.strip().find(u' ')==-1 or item.strip()==link.strip(): continue if counter > size_limitation: wikipedia.output(u'\03{lightred}Link limitation is Reached!\03{default}') break if old_text.find(item.strip())!=-1: text3 = re.sub(ur"(\n|\*|\#|\s)"+item.strip()+ur"(\n|\.|\s|\،)", ur"",text) if text3==text: continue else: continue if item not in Black_List: #if (old_text.find(u' '+item.strip()+u' ')!=-1 or old_text.find(u' '+item.strip()+u'،')!=-1 or old_text.find(u' '+item.strip()+u'.')!=-1 or old_text.find(u'\n'+item.strip()+u'\n')!=-1 or old_text.find(u'\n'+item.strip()+u' ')!=-1 or old_text.find(u' '+item.strip()+u'\n')!=-1) and (item not in Black_List): for white in White_List: if item in white and (old_text.find(u' '+white.strip()+u' ')!=-1 or old_text.find(u' '+white.strip()+u'\n')!=-1 or old_text.find(u'\n'+white.strip()+u' ')!=-1): item=white.strip() break #-------------------------------- if old_text.find(u''+item.strip()+u'')!=-1: wikipedia.output(u'\03{lightred}The link '+item+u' is in the text so it is passed!\03{default}') item_in_text.append(item) continue #-------------------------------- for i in item_in_text: if item in i: pass_root=False break if not pass_root: wikipedia.output(u'\03{lightblue}The link '+item+u' is part of a link in the text so it is passed!\03{default}') continue #-------------------------------- Item_R=redirect_find(item.strip(),original_lang) if not Item_R: continue if old_text.find(u''+Item_R.strip()+u'')!=-1 or Item_R.strip()==link.strip() or item in link or Item_R in link: wikipedia.output(u'\03{lightred}The link '+Item_R+' is in the text so it is passed!\03{default}') continue #--------------------------------------- item_cat=catquery(item) if item_cat: if film_cat in item_cat: wikipedia.output(u'The '+item+u' was film link so it is passed!') continue #--------------------------------------- for i in item_cat: if film_name in i: pass_root=False break if not pass_root: wikipedia.output(u'The '+item+ u' had film category so it is passed!') continue #---------------------------------------- temp_list=templatequery(item) if not disambig_template in temp_list: item_test=item for i in no_words: item_test=item_test.replace(i,u) if item_test!=item: wikipedia.output(u'\03{lightred}Link'+item+u' had bad characters!\03{default}') continue if item.split(u' ')[0] in no_fa_words or item.split(u' ')[-1] in no_fa_words: wikipedia.output(u'\03{lightred}Link'+item+u' had bad characters!\03{default}') continue pre_text={ur'\s':u' ',ur'\n':u'\n',ur'\*':u'*',ur'\#':u'#'} for i in pre_text: if old_text==text and (pre_text[i]+item.strip()+u' ' in old_text): text = fa_replaceExcept(old_text, i+item.strip()+ur'\s', pre_text[i]+ur''+item.strip()+ur' ', exceptions) if old_text!=text: break if old_text==text and (pre_text[i]+item.strip()+u'\n' in old_text): text = fa_replaceExcept(old_text, i+item.strip()+ur'\n', pre_text[i]+ur''+item.strip()+ur'\n', exceptions) if old_text!=text: break if old_text==text and (pre_text[i]+item.strip()+u'.' in old_text): text = fa_replaceExcept(old_text, i+item.strip()+ur'.', pre_text[i]+ur''+item.strip()+ur'.', exceptions) if old_text!=text: break if old_text==text and (pre_text[i]+item.strip()+u'،' in old_text): text = fa_replaceExcept(old_text, i+item.strip()+ur'\،', pre_text[i]+ur''+item.strip()+ur'،', exceptions) if old_text!=text: break
if old_text!=text: counter+=1 wikipedia.output(u'\03{lightgreen}+ '+item+u'\03{default}') old_text=text added_item=added_item+u''+item+u'، '
if text!=text2: added_item=added_item.strip()[:-1] if not hidden_cat.strip() in text: text=text+hidden_cat page.put(text,u'ویکیسازی رباتیک' +bot_version+u' >'+added_item +msg_clean) wikipedia.output(u'Sleep for 60 seconds!') time.sleep(180)
def main():
gen=None preloadingGen=False PageTitles = [] genFactory = pagegenerators.GeneratorFactory() for arg in wikipedia.handleArgs(): if arg.startswith ('-new'): arg=arg.replace(':',) if len(arg) == 4: genfa = pagegenerators.NewpagesPageGenerator(200, False, site,0) else: genfa = pagegenerators.NewpagesPageGenerator(int(arg[4:]), False, site,0) preloadingGen = pagegenerators.PreloadingGenerator(genfa,60) break elif arg.startswith('-page'): if len(arg) == 5: PageTitles.append(wikipedia.input(u'Which page do you want to chage?')) else: PageTitles.append(arg[6:]) break elif arg.startswith('-file'): textfilename = arg[6:] if not textfilename: textfilename = pywikibot.input( u'Please enter the local file name:') gen = pagegenerators.TextfilePageGenerator(textfilename,site=site) else: generator = genFactory.handleArg(arg) if generator: gen = generator if not gen: wikipedia.stopme() if PageTitles: pages = [wikipedia.Page(site,PageTitle) for PageTitle in PageTitles] gen = iter(pages) if not preloadingGen: preloadingGen = pagegenerators.PreloadingGenerator(gen,pageNumber = 60)
for pages in preloadingGen: #try: wikify(pages.title()) #except: #wikipedia.output('Code or system has an error !!') #pass
if __name__ == "__main__":
login_wiki() main()
</syntaxhighlight>