ویکیپدیا:درخواستهای ربات/کد پایه
کد زیر یک کد خام هست که تحت مجوز کریتیو کامنز ارایه میگردد. برای شروع کار با ربات و تقریبا حداقلهای مورد نیاز برای ساخت یک ربات برای fa.wiki را دارا هست.
امکانات کد
ویرایش- تابع تغییر عدد فارسی به انگلیسی یا با کمی تغییر انگلیسی به فارسی
- تابع حذف نیمفاصلههای اشتباه
- مولد صفحه که در صورتی که متغییر arg=True باشد آرگونها فعال میگردند در غیر این صورت ربات فقط یک صفحه یا مجموعه صفحههایی را میگیرد.(همکنون arg=False)
- بخشی که شما عملی خاصی را از ربات انتظار دارید: در این بخش ربات نام صفحه و متن آن صفحه را به شما ارائه میدهد که با تغییر آنها بر اساس نیاز کدنویسی، میتوانید نتیجه بدست آمده را ذخیره نمایید.
ورودی ربات
ویرایشورودی ربات برای کار کردن در حالتی که arg=True باشد به شرح زیر است.
- آرگومان page-:نام یک صفحه یا مجموعه صفحههایی را از شما میگیرد مثال : -page:ایران یا -page:ایران,تهران,شیراز
- آرگومان cat-:نام یک رده یا مجموعه ردههایی را از شما میگیرد مثال : -cat:هنرمندان ایران یا -page:هنرمندان ایران,هنرمندان تهران,هنرمندان شیراز
- آرگومان template-:نام یک الگو یا مجموعه الگوهایی را از شما میگیرد مثال : -template:روی نقشه ایران یا -template:روی نقشه ایران,روی نقشه تهران,روی نقشه شیراز
- آرگومان start-:از یک حرف شروع به فعالیت میکند مثال:-start:ب ==> تمام صفحههایی که بعد از حرف ب قرار دارند را برای ربات به ترتیب الفبا بارگذاری میکند.
- نکته:حروف ی، ک، پ، گ،ژ به علت مشکل در رتبه بندی الفبا فارسی در مدیاوبکی در انتهای الفبا قرار دارند.
- نکته:در صورتی که میخواهید صفحهها در فضای نام دیگری جز فضای نام مقاله باشد مانند (رده، الگو، مدیاویکی،ویکیپدیا،راهنما،درگاه،پرونده،بحث و...) باید از کد ترکیبی استفاده کنید به عنوان مثال -start:الگو:ب یا -start:رده:ج ==> این ربات از ردههایی شروع به کار میکند که بعد از حرف ج باشند.
کد پایه
ویرایش#!/usr/bin/python
# -*- coding: utf-8 -*-
# BY: Z (User:ZxxZxxZ on fa.wikipedia)
# BY: رضا (User:reza1615 on fa.wikipedia)
# Distributed under the terms of the CC-BY-SA 3.0 .
"""
This bot will make direct text replacements. It will retrieve information on
which pages might need changes either from an XML dump or a text file, or only
change a single page.
You can run the bot with the following commandline parameters:
-file - Work on all pages given in a local text file.
Will read any [[wiki link]] and use these articles.
Argument can also be given as "-file:filename".
-cat - Work on all pages which are in a specific category.
Argument can also be given as "-cat:categoryname".
-template - Work on all pages which are in a specific template.
Argument can also be given as "-template:templatename".
-page - Only edit a specific page.
Argument can also be given as "-page:pagetitle". You can give this
parameter multiple times to edit multiple pages.
-ref - Work on all pages that link to a certain page.
Argument can also be given as "-ref:referredpagetitle".
-filelinks - Works on all pages that link to a certain image.
Argument can also be given as "-filelinks:ImageName".
-links - Work on all pages that are linked to from a certain page.
Argument can also be given as "-links:linkingpagetitle".
-start - Work on all pages in the wiki, starting at a given page. Choose
"-start:!" to start at the beginning.
NOTE: You are advised to use -xml instead of this option; this is
meant for cases where there is no recent XML dump.
i.e. "-start:Category:!" or "-start:template:a"
-except:XYZ - Ignore pages which contain XYZ. If the -regex argument is given,
XYZ will be regarded as a regular expression.
-summary:XYZ - Set the summary message text for the edit to XYZ, bypassing the
predefined message texts with original and replacements inserted.
-template:XYZ-
-namespace:n - Number of namespace to process. The parameter can be used
multiple times. It works in combination with all other
parameters, except for the -start parameter. If you e.g. want to
iterate over all user pages starting at User:M, use
-start:User:M.
-always - Don't prompt you for each replacement
other: -
NOTE: Only use either -xml or -file or -cat or -template or-page, but don't mix them.
Examples:
behsaz.py -start:! برای تمام صفحات ویکی
or
behsaz.py -page:آرامگاه کورش
or
behsaz.py -cat:ایران
"""
__version__ = '$Id: $'
import wikipedia
import pagegenerators
import re, os, codecs, catlib
wikipedia.config.put_throttle = 0
wikipedia.put_throttle.setDelay()
faSite = wikipedia.getSite('fa')
enSite = wikipedia.getSite('en')
txtTmp=' '
faChrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیًٌٍَُِّْٓيك'
enChrs=u'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
faNums = u'۰۱۲۳۴۵۶۷۸۹'
arNums = u'٠١٢٣٤٥٦٧٨٩'
enNums = u'0123456789'
msg = u'ربات: ویرایشگر %s'
def BotRun(page,text_fa):
#--------------------------------------------------------------action that you want to do on pages-----------------
print page
print '+++++++++++++++++++++++++++++++++++++++++'
print text_fa
#return result_for_save
#----------------------------------------------------------end of action that you want to do on pages---------------
def fasort(categories):
replacements = (u'پ',u'بي', u'چ' , u'جي', u'ژ',u'زي', u'ک',u'قي', u'گ',u'كي', u'۱',u'z۱', u'۲',u'z۲', u'۳',u'z۳', u'۴',u'z۴', u'۵',u'z۵', u'۶',u'z۶', u'۷',u'z۷', u'۸',u'z۸', u'۹',u'z۹', u'۰',u'z۰')
items,newsort=[],[]
for catory in categories:
old_catory=catory
for i in range(0,len(replacements)-1,2):
catory=str(catory).replace(replacements[i],replacements[i+1])
items.append([old_catory,catory])
items.sort(lambda x, y: cmp(x[1],y[1]))
for item in items:
newsort.append(item[0])
print item[0]
return newsort
def faToEn(faTxt, type):
# changing english to farsi numbers
faChrsToFrcRplc = u'۰۱۲۳۴۵۶۷۸۹«»٬٫٪،؛؟'
enChrsToFrcRplc = u'0123456789""`.%,;?'
if type is 'force':
for i in range(0,18):
enTxt = faTxt.replace(enChrsToFrcRplc[i], faChrsToFrcRplc[i])
elif type is 'safe':
pass
return enTxt
def fixCsmtc(faTxt, type):
# ZWNJ
if type is 'force':
txt = re.sub(u'{2,}', u'', txtTmp) # پشتسرهم
txt = re.sub(u'\[\[([^\]\|]*?)]](%s+)' % faChrs, ur'[[\1|\1\2]]', txt) # Piping
txt = re.sub(u'(?![ئاآأإژزرذدوؤةبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|ֹ)', '', txt) # در پس
txt = re.sub(u'(?<![ئبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|f|ֹ)', '', txt) # در پیش
elif type is 'safe':
###
a=1
return enTxt
def run(generator):
for page in generator:
try:
if not page.canBeEdited():
wikipedia.output( u'Skipping locked page %s' % page.title() )
continue
text_fa = page.get()#------------------------------geting pages content
except wikipedia.NoPage:
wikipedia.output( u'Page %s not found' % page.title() )
continue
except wikipedia.IsRedirectPage:#----------------------geting pages redirects contents
pageRedirect = page.getRedirectTarget()
text_fa = pageRedirect.get()
wikipedia.output( u'Page %s was Redirect but edited!' % pageRedirect )
except:
continue
new_text=BotRun(page,text_fa)
savepart( page,new_text )#---------------saving changes in page with new_text content-----------------------------------
def savepart( page,new_text):
if new_text!=None and page!=None and new_text.find( u'#تغییرمسیر')==-1 and new_text.find( u'#ridirect')==-1 and new_text.find( u'#Ridirect')==-1:
try:
page.put( new_text,msg % page ,watchArticle = None,minorEdit = True)
except wikipedia.EditConflict:
wikipedia.output( u'Skipping %s because of edit conflict' % ( page.title() ) )
except wikipedia.SpamfilterError,url:
wikipedia.output( u'Cannot change %s because of blacklist entry %s' % ( page.title(),url ) )
def main():
summary_commandline,template,gen = None,None,None
exceptions,PageTitles,namespaces = [],[],[]
autoText,autoTitle = False,False
genFactory = pagegenerators.GeneratorFactory()
wikipedia.setAction( msg )
arg=False#------if you dont want to work with arguments leave it False if you want change it to True---
if arg==True:
for arg in wikipedia.handleArgs():
if arg == '-autotitle':
autoTitle = True
elif arg == '-autotext':
autoText = True
elif arg.startswith( '-page:' ):
if len(arg) == 6:
PageTitles.append(wikipedia.input( u'Which page do you want to chage?' ))
else:
PageTitles.append(arg[6:])
elif arg.startswith( '-cat:' ):
if len(arg) == 5:
PageTitles.append(wikipedia.input( u'Which Category do you want to chage?' ))
else:
PageTitles.append('Category:'+arg[5:])
elif arg.startswith( '-template:' ):
if len(arg) == 10:
PageTitles.append(wikipedia.input( u'Which Template do you want to chage?' ))
else:
PageTitles.append('Template:'+arg[10:])
elif arg.startswith('-except:'):
exceptions.append(arg[8:])
elif arg.startswith( '-namespace:' ):
namespaces.append( int( arg[11:] ) )
elif arg.startswith( '-ns:' ):
namespaces.append( int( arg[4:] ) )
elif arg.startswith( '-summary:' ):
wikipedia.setAction( arg[9:] )
summary_commandline = True
else:
generator = genFactory.handleArg(arg)
if generator:
gen = generator
else:
PageTitles = [raw_input(u'Page:> ').decode('utf-8')]
if PageTitles:
pages = [wikipedia.Page(faSite,PageTitle) for PageTitle in PageTitles]
gen = iter( pages )
if not gen:
wikipedia.stopme()
if namespaces != []:
gen = pagegenerators.NamespaceFilterPageGenerator( gen,namespaces )
preloadingGen = pagegenerators.PreloadingGenerator( gen,pageNumber = 60 )#---number of pages that you want load at same time
run(preloadingGen)
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()