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

    از ویکی‌وحدت

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

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

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

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

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

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

    ویژه: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>