ویکی‌پدیا:درخواست‌های ربات/تصویر همسنگ

ربات اضافه کننده تصویر بر پایهٔ جعبه اطلاعات ویکی‌های دیگر
این کاربر یک ربات است
وظیفه(ها)دریافت تصویر از مقالهٔ ویکی انگلیسی و افزودن آن به مقالهٔ فارسی (در صورتی که تصویر در ویکی‌انبار باشد)
موافق محرومیت؟خیر
موافق خاموش‌شدن اضطراری؟بله
اجازه‌نامهCC-BY-SA 3.0
تست شده؟بله

کد زیر رباتی برای افزودن تصویر به مقالات فارسی است

شروع به کارویرایش

برای شروع شما می‌توانید از آرگومان‌های استاندارد یا یکی از روش‌های زیر عمل کنید.

تذکر
برای نام مقاله‌ها یا رده‌ها (در ویندوز) باید آنها را به صورت درصدی نوشت

آرگومان‌های پرکاربردویرایش

آرگومان -safe برای ربات‌های اتوماتیک

برای ربات‌هایی که از روی تول‌سرور یا به صورت اتوماتیک اجرا می‌شوند استفاده از آرگومان -safe پیشنهاد می‌گردد.

زمانی که در مقالهٔ انگلیسی در بخش infobox هیچ نگاره‌ای نباشد در صورتی که برای ربات -safe تعریف شده‌باشد آن مقاله را رها کرده و به مقاله بعد می‌رود (حالت امن) و در صورتی که -safe تعریف نگردد ربات با مراجعه به متن مقاله دنبال نگاره آزاد می‌گردد و اولین نگاره‌ای را که یافت به جعبه اطلاعات مقاله ویکی‌فا می‌افزاید البته قبل از افزودن نگاره از ربات‌ران می‌پرسد که آیا برای افزودن آن نگاره اطمینان دارد یا نه، در صورت دریافت پاسخ y یا yes نگاره را می‌افزاید در غیر این‌صورت مقاله را رها می‌کند.

نام صفحه

با استفاده از آرگومان -page: می توانید نام صفحه مورد نظر در ویکی‌فارسی را مشخص کنید تا در صورت بودن، نگاره موجود در جعبهٔ اطلاعات مقالهٔ انگلیسی را به مقالهٔ ویکی‌فا بیافزاید.

python X.py -page:%D8%B1%D8%A7%D8%B3%DA%A9%D9%88%20%D8%A2%D8%B1%D8%A8%D9%88%DA%A9%D9%84

نکته: کد درصدی بالا نام مقالهٔ راسکو آربوکل بود که به کمک ابزار مبدل به صورت درصدی درآمده است.

نام رده

با استفاده از آرگومان -cat: می توانید نام رده مورد نظر در ویکی‌فارسی را مشخص کنید تا جعبه های موجود در مقالات ویکی انگلیسی را جستجو کند و در صورت موجود بودن نگارهٔ آزاد (ویکی‌انبار) آن را به مقاله‌ها بیافزاید

python X.py -cat:%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA%20%D8%A8%D8%A7%D8%B2%DB%8C%DA%AF%D8%B1

در این مثال کد درصدی برابر با مقالات بازیگر بود که به معنی رده:مقالات بازیگر است.

تذکر

برای نوشتن نام رده از پیشوند رده: استفاده نکنید.

کدویرایش

<syntaxhighlight lang="python" line start="1">

  1. !/usr/bin/python
  2. -*- coding: utf-8 -*-
  3. BY: رضا (User:reza1615 on fa.wikipedia)
  4. Distributed under the terms of the CC-BY-SA 3.0.

import wikipedia import pagegenerators,query,sys import re, os, codecs, catlib wikipedia.config.put_throttle = 0 wikipedia.put_throttle.setDelay() secondwiki='en' faSite = wikipedia.getSite('fa') enSite = wikipedia.getSite(secondwiki) txtTmp= faChrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیًٌٍَُِّْٓيك' msg = u'ربات: افزودن نگارهٔ آزاد به مقاله (کد)'

def fixCsmtc(faTxt):

   # ZWNJ
   txt=faTxt
   txt = re.sub(u'‌{2,}', u'‌', txtTmp) # پشت‌سرهم
   txt = re.sub(u'\[\[([^\]\|]*?)‌]](%s+)' % faChrs, ur'\1‌\2', txt) # Piping
   txt = re.sub(u'‌(?![ئاآأإژزرذدوؤةبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|ֹ)', , txt) # در پس
   txt = re.sub(u'(?<![ئبپتثجچحخسشصضطظعغفقکگلمنهیيًٌٍَُِّْٰٓٔ]|[\u0900-\u097F]|f|ֹ)‌', , txt) # در پیش
   return txt

def checksite(image):

   if image.find(u'.ogg')!=-1 or image.find(u'.oga')!=-1 or image.find(u'.ogv')!=-1 or image.find(u'.mid')!=-1:
       return u'local'
   params = {
           'action': 'query',
           'titles': 'File:'+image,#Image name
           'prop': 'imageinfo'

   }
   try:
       queryresult = query.GetData(params, encodeTitle = True)
       items=queryresult['query']['pages']
       for item in items:
           if queryresult['query']['pages'][item]['imagerepository']=='shared':
               return u'commons'
           else:
               return u'local'
   except:
       return u'error'

def enwikiimagecheck(text_en2,safefa):

   try:
       im = re.search(ur'\|\s*(?:[Ff]ile|[Pp]hoto|[Ii]mage).*?\=\s*([^\|]*?)\s*\|', text_en2)
       imagename=im.group(0).split(u'=')[1].replace(u'|',u).strip()
       return imagename
   except:
       if safefa==False:
           im = re.search(ur'\[\[([Ff]ile|[Ii]mage):.*?\|', text_en2)
           imagename=im.group(0).split(u':')[1].replace(u'|',u).strip()
           ask=wikipedia.input(u'Are you sure that you want to add "'+imagename+u'" to fawiki?it is not in enwiki infobox! (y/n) ').decode('utf-8')
           if ask==u'y' or ask==u'Y' or ask==u'yes' or ask==u'Yes' or ask==u'YES':
               ask=True
           else:
               ask=False
           if ask==True:    
               return imagename

def BotRun(page,text_fa,text_en,safefa):

   try:
       pagename=page.replace(u'Fa:',u).replace(u'fa:',u).replace(u'',u'').replace(u'',u).strip()
   except:    
       pagename=unicode(str(page),'UTF-8').replace(u'Fa:',u).replace(u'fa:',u).replace(u'',u'').replace(u'',u).strip()
   page=wikipedia.Page(faSite,pagename)
  1. --------------------------------------------------------------action that you want to do on pages-----------------
   text_fa2=text_fa.replace(u'\n',u).replace(u'\r',u)
   text_en2=text_en.replace(u'\n',u).replace(u'\r',u)
   imagename=u
   try: 
       imagename=enwikiimagecheck(text_en2,safefa)
       if imagename:
           if checksite(imagename)==u'commons':
              try:
                 imfa = re.search(ur'\|\s*(?:عکس|نگاره|تصویر).*?\=.*?\|', text_fa2)
                 
                 if imfa:
                     try:
                        imagenamefa=imfa.group(0).split(u'=')[1].replace(u'|',u).strip()
                        if imagenamefa.find(u'Replace this image male.svg')!=-1 or imagenamefa.find(u'Replace this image female.svg')!=-1:
                           text_fa2=text_fa2.replace(u'Replace this image male.svg',u,1).replace(u'Replace this image female.svg',u,1)
                           text_fa=text_fa.replace(u'Replace this image male.svg',u,1).replace(u'Replace this image female.svg',u,1)
                           imfa = re.search(ur'\|عکس|نگاره|تصویر.*?\=.*?\|', text_fa2)
                           imagenamefa=imfa.group(0).split(u'=')[1].replace(u'|',u).strip()
                        if imagenamefa!=u:    
                           wikipedia.output(u'infobox has image')
                           return False
                        imageparameter=imfa.group(0).split(u'=')[0]
                        text_fa=text_fa.replace(imageparameter+u'=',imageparameter+u'='+imagename.strip(),1)
                        wikipedia.output( u"\03{lightpurple} --image added to infobox!-- \03{default}" )
                        try:
                            imfasize = re.search(ur'\|\s*(?:سایز تصویر|اندازه تصویر|عرض تصویر|سایز نگاره|اندازه نگاره|عرض نگاره|سایز عکس|انداز عکس|عرض عکس|سایز_تصویر|اندازه_تصویر|عرض_تصویر|سایز_نگاره|اندازه_نگاره|عرض_نگاره|سایز_عکس|انداز_عکس|عرض_عکس).*?\=.*?\|', text_fa2)
                            imagenamesize=imfasize.group(0).split(u'=')[1].replace(u'|',u).strip()
                            imagesizeparameter=imfasize.group(0).split(u'=')[0]
                            text_fa=text_fa.replace(imagesizeparameter+u'='+imagenamesize,imagesizeparameter+u'=200px',1)
                        except:
                            pass
                        return text_fa
                     except:
                         wikipedia.output( u"--infobox doesn't be in fa.wiki--" )
                         return False
              except:
                  wikipedia.output( u"--infobox doesn't be in fa.wiki page---" )
                  return False
           else:
               wikipedia.output( u"--en wiki's image is local!--" )
               return False
   except:
       wikipedia.output( u"--en infobox doesn't has image--" )
       return text_fa
  1. ----------------------------------------------------------end of action that you want to do on pages---------------

def enpageget(interwiki):

           text_en=u' '
           for inter in interwiki:
               inters=str(inter)
               if inters.find(secondwiki+':')!=-1:
                   enSite = wikipedia.getSite(secondwiki)
                   page=wikipedia.Page(enSite,inter.title())
                   try:
                       if not page.canBeEdited():
                           wikipedia.output( u'Skipping locked page %s' % page.title() )
                           return u' '
                       text_en = page.get()#------------------------------geting pages content
                       return text_en
                   except wikipedia.NoPage:
                       wikipedia.output( u'Page %s not found' % page.title() )
                       continue
                   except wikipedia.IsRedirectPage:#----------------------geting pages redirects contents
                        pageRedirect = page.getRedirectTarget()
                        text_en = pageRedirect.get()
                        wikipedia.output( u'Page %s was Redirect but edited!' %  pageRedirect )
                        return text_en
                   except:
                        continue
                   return u' '

def run(generator,safefa):

       for pages in generator:
           try:
               pagename=unicode(str(pages),'UTF-8').replace(u'Fa:',u).replace(u'fa:',u).replace(u'',u'').replace(u'',u).strip()
           except:
              pagename=str(pages).replace(u'Fa:',u).replace(u'fa:',u).replace(u'',u'').replace(u'',u).strip()
           if pagename.find(u':')!=-1:
               continue
           pagefa=wikipedia.Page(faSite,pagename)
           try:
               if not pagefa.canBeEdited():    
                           wikipedia.output( u'Skipping locked page %s' % pagefa.title() )
                           continue
               text_fa = pagefa.get()#------------------------------geting pages content
               interwikis= pagefa.interwiki()
           except wikipedia.NoPage:
               wikipedia.output( u'Page %s not found' % pagefa.title() )
               continue
           except wikipedia.IsRedirectPage:#----------------------geting pages redirects contents
                pageRedirect = pagefa.getRedirectTarget()
                text_fa = pageRedirect.get()
                interwikis= pagefa.interwiki()
                wikipedia.output( u'Page %s was Redirect but edited!' %  pageRedirect )

           except:
                continue
           if interwikis==[]:
               wikipedia.output( u'---------------------------')
               wikipedia.output( pagename)
               wikipedia.output( u"dosen't have english page!")
               continue
           text_en=enpageget(interwikis)
           try:
              test=text_en.replace(u'\n',u)
           except:
               wikipedia.output( u'---------------------------')
               wikipedia.output( pagename)
               wikipedia.output( u"dosen't have english page!")
               continue    
           if text_en==u' ' or text_en==u:
               wikipedia.output( u'---------------------------')
               wikipedia.output( pagename)
               wikipedia.output( u"dosen't have english page!")
               continue
           wikipedia.output( u'---------------------------')
           wikipedia.output( pagename)
           new_text=BotRun(pagename,text_fa,text_en,safefa)
           
           if new_text:
               savepart(pagename,new_text )#---------------saving changes in page with new_text content-----------------------------------
           else:
               wikipedia.output( u'Skipping %s ' %  pagename )

def savepart( page,new_text):

           pagename=page.replace(u'Fa:',u).replace(u'fa:',u).replace(u'',u'').replace(u'',u).strip()
           page=wikipedia.Page(faSite,pagename)
           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 categorydown(listacategory):

   wikipedia.config.put_throttle = 0
   wikipedia.put_throttle.setDelay()
   count=1
   for catname in listacategory:
       count+=1
       if count==200:
           break
       gencat = pagegenerators.SubCategoriesPageGenerator(catname, recurse=False)
       for subcat in gencat:
           try:
               wikipedia.output(subcat)
           except:
               wikipedia.output(str(subcat))
           if subcat in listacategory:
               continue
           else:
               listacategory.append(subcat)
   return listacategory

def facatlist(facat):

   wikipedia.config.put_throttle = 0
   wikipedia.put_throttle.setDelay()
   count=0
   listenpageTitle=[]
   PageTitle=facat.replace(u'',u'').replace(u'',u).strip()
   language='fa'
   PageTitles =[PageTitle]  
   for PageTitle in PageTitles:
       cat = catlib.Category( wikipedia.getSite(language),PageTitle )
       listacategory=[cat]
       listacategory=categorydown(listacategory)
       for enpageTitle in listacategory:
                  enpageTitle=str(enpageTitle).split(u'|')[0].split(u']]')[0].replace(u'[[',u).strip()
                  cat = catlib.Category( wikipedia.getSite(language),enpageTitle )
                  gent = pagegenerators.CategorizedPageGenerator( cat )
                  for pagework in gent:
                     count+=1
                     try:
                         link=str(pagework).split(u'|')[0].split(u']]')[0].replace(u'[[',u).strip()
                     except:
                         pagework=unicode(str(pagework),'UTF-8')
                         link=pagework.split(u'|')[0].split(u']]')[0].replace(u'[[',u).strip()
                     wikipedia.output(link)
                     fapagetitle=link
                     wikipedia.output(u'adding '+fapagetitle+u' to fapage lists')
                     listenpageTitle.append(fapagetitle)
   if listenpageTitle==[]:
       return False
   return listenpageTitle

def main():

   summary_commandline,template,gen = None,None,None
   exceptions,PageTitles,namespaces = [],[],[]
   cat=
   safefa=False
   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==False:
       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:
                   cat=wikipedia.input( u'Which Category do you want to chage?' )
               else:
                   cat='Category:'+arg[5:]
           elif arg.startswith( '-template:' ):
               if len(arg) == 10:
                   template.append(wikipedia.input( u'Which Template do you want to chage?' ))
               else:
                   template.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( '-safe' ):
               safefa=True
           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 cat!=:
       facatfalist=facatlist(cat)
       if facatfalist!=False:
           run(facatfalist,safefa)    
   if PageTitles:
       pages = [wikipedia.Page(faSite,PageTitle) for PageTitle in PageTitles]
       gen = iter( pages )
   if not gen:
       wikipedia.stopme()
       sys.exit()
   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,safefa)

if __name__ == "__main__":

   try:
       main()
   finally:
       wikipedia.stopme()