الگو:الگوها و یا ربات های مورد نیاز

از ویکی‌وحدت

الگوها و یا ربات های مورد نیاز مدخلی است که در آن به الگوها و یا ربات هایی که نیاز به ایجادشان در ویکی وحدت احساس می‌شود خواهیم پرداخت. این الگوها و یا ربات ها در صف تولید و یا اضافه شدن قرار خواهند گرفت که به ترتیب اولویت اقدام به ایجاد آنها خواهیم نمود.

الگوهای مورد نیاز

الگوی کارهای در دست اقدام

ربات های مورد نیاز

الگوی ورودی کاربران ویکی وحدت

ده نویسنده برتر تمام زمان‌ها

ویژه:ContributionScores/15/all/notools

فعالیت کاربران در ۳۰ روز گذشته

ویژه:ContributionScores/all/30/notools

ده نویسنده برتر هفت روز گذشته

ویژه:ContributionScores/15/7/notools


fa:user:Mohsenmadani

ربات های مورد نیاز

ربات ویکی سازی مقالات

این ربات برای ویکی‌‌سازی مقالات به صورت رباتیک و خودکار کاربرد دارد. شرح عملکرد آن در کاربر: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>