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

از ویکی‌پدیا، دانشنامهٔ آزاد

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

آرگومان‌ها
-cat:نام رده با پسوند یا بدون پسوند
-start:category:! برای شروع از ابتدای ویکی
نکته

ربات برای جلوگیری از خرابکاری فقط بر روی مقالاتی کار می‌کند که عنوانشان با ردهٔ اصلی وجه اشتراک داشته باشد ولی برای زیر رده‌ها این محدودیت وجود ندارد.

<syntaxhighlight lang="python">

  1. !/usr/bin/python
  2. -*- coding: utf-8 -*-
  3. Reza(User:reza1615), 2014
  4. Distributed under the terms of the CC-BY-SA 3.0 .
  5. -*- coding: utf-8 -*-

import catlib,query,config,sys import pagegenerators,re import wikipedia wikipedia.config.put_throttle = 0 wikipedia.put_throttle.setDelay()

  1. ------------------------------------------

faSite=wikipedia.getSite('fa') local_category=u'رده' black_list=[u'بر',u'از',u'در',u'با',u'و',u'،'] msg=u'ربات:افزودن پیش‌فرض برای '

  1. ------------------------------------------

def run(catname):

   catname=catname.replace(u'_',u' ')
   wikipedia.output(u'\03{lightpurple}-----------Work on '+catname+u' ----------\03{default}')
   cat_list=[]
   article_list=[]
   #------------------------for articles---------------------
   oldCat = catlib.Category(faSite, catname)
   cat_text=oldCat.get().replace(u'{{ ',u'الگو:').replace(u'',u'}}')

if u'

' in cat_text or u'

' in cat_text or u'

' in cat_text or u'الگو:Hidden cat' in cat_text or u'الگو:Hiddencategory' in cat_text or u'

' in cat_text:

       return
   gen = pagegenerators.CategorizedPageGenerator(oldCat,recurse=False)
   preloadingGen = pagegenerators.PreloadingGenerator(gen)
   counter=0
   for article in preloadingGen:
       article_list.append(article.title())
       counter+=1
       if counter>420:
           wikipedia.output(u'\03{lightred}Bot do not work on cates more than 420 members\03{default}')
           article_list=[]
           break
   article_dict=check_name (article_list)
   wikipedia.output(u'----add to article----')
   set_cat(article_dict,catname)
   #------------------------for subcat---------------------
   gen = pagegenerators.SubCategoriesPageGenerator(oldCat,recurse=False)
   preloadingGen = pagegenerators.PreloadingGenerator(gen)
   for subcategory in preloadingGen:
       cat_list.append(subcategory.title())
       counter+=1
       if counter>420:
           wikipedia.output(u'\03{lightred}Bot do not work on cates more than 400 members\03{default}')
           cat_list=[]
           break
   cat_dict=check_name (cat_list)
   wikipedia.output(u'----add to subcat----')
   set_cat(cat_dict,catname)

def set_cat(dict,catname):

   for title in dict:
       if u'سید ' in title:
           wikipedia.output(u'\03{lightred}Bot do not work on Peoples article (seied)\03{default}')
           continue
       first_part_cat=catname.split(u' ')[0].replace(u'رده:',u).strip()
       if not local_category+u':' in title:
           if not first_part_cat in title:
               wikipedia.output(u'\03{lightred}page does not have main categoies words!'+first_part_cat+u'not in '+title+u'\03{default}')
               continue
       wikipedia.output(u'----'+title)
       add=u
       fapage = wikipedia.Page( faSite,title)
       text_old=fapage.get()
       text_old = re.sub(u'الگو:(?:DEFAULTSORT)', u'{{ترتیب‌پیش‌فرض:', text_old)
       text_old=re.sub(ur'الگو:(ترتیب‌پیش‌فرض\n?', ur, text_old)
       text_old=text_old.replace(u'[[ ',u'').replace(u' ',u']]').replace(local_category+u' :',local_category+u':').replace(u'category:',local_category+u':').replace(u'Category:',local_category+u':')
       text_old=text_old.replace(u'category :',local_category+u':').replace(u'Category :',local_category+u':')
       text=text_old
       if u'{{ترتیب‌پیش‌فرض:' in text:
           wikipedia.output(u'\03{lightred}Bot do not work on pages with  so it is passed!\03{default}')
           continue
       if u'[[رده:زادگان' in text or u'[[رده:درگذشتگان' in text or u'[[رده:اهالی' in text or u'[[رده:افراد' in text or u'سید ' in title:
           wikipedia.output(u'\03{lightred}Bot do not work on Peoples article (category1)\03{default}')
           continue
       cats= re.findall(ur'(\[\['+local_category+u'\:.*?\]\])',text, re.S)
       object_type=True
       person_cat_words=[u'نخست‌وزیران',u'مسئولان روابط عمومی‎',u'درگذشتگان‎',u'زادگان‎',u' اهل ',u'اهالی',u'نمایندگان',u'بازیگران',u'بازیکنان',u'سیاست‌مدار']
       for i in person_cat_words:
           if i+u' ' in u'-'.join(cats):
               object_type=False
               break
       if not object_type:
           wikipedia.output(u'\03{lightred}Bot do not work on Peoples article (category2)\03{default}')
           continue
       stub_temps=[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"کشتی‌گیر"]
       object_type=True
       for i in stub_temps:
           if u'الگو:'+ i+u'-خرد' in text or u'الگو:'+ i.replace(u' ',u' ')+u'-خرد' in text :
               object_type=False
               break
       if not object_type:
           wikipedia.output(u'\03{lightred}Bot do not work on Peoples article (khord)\03{default}')
           continue
       for category in cats:
           if u'|' in category or catname!=category.replace(u'',u'').replace(u'',u):
               continue
           first_category=category.replace(u']]',u)
           add=title.replace(dict[title],u).strip()
           for a in black_list:
               if a+u' ' in add:
                   if add[:len(a)+1]==a+u' ':
                      add=add[len(a)+1:]
                      break
           text=text.replace(category,first_category+u'|'+add+u']]',1)
       if text!=text_old:
           wikipedia.output(u'\03{lightgreen}'+first_category+u']‌] > '+first_category+u'|'+add+u']‌]\03{default}')
           fapage.put(text,msg+first_category+u']] > '+first_category+u'|'+add+u']‌]')

def check_name (list):

   result_dict={}
   repeated_dict=check_repeating(list,u)
   for i in repeated_dict:
           result_dict[i]=repeated_dict[i]
   while repeated_dict:
       repeated_dict=get_dict(repeated_dict)
       for i in repeated_dict:
           result_dict[i]=repeated_dict[i]
   result_dict=clean_dict(result_dict)
   return result_dict

def clean_dict(result_dict):

   new_dict={}
   for list in result_dict:
       if len(result_dict[list])<3:
           continue
       for i in result_dict[list]:
           if i==list:
              continue
           if not i in new_dict:
               new_dict[i]=list
           elif len(new_dict[i])< len(list):
               new_dict[i]=list
           else:
               continue
   return new_dict

def get_dict(result_dict):

   repeated_dict_old={}
   for list in result_dict:
       rest=[]
       for i in result_dict[list]:
               if list+u' ' in i:
                   rest.append(i.replace(list+u' ',u))
       repeated_dict_old=check_repeating(rest,list+u' ')
   return repeated_dict_old

def check_repeating(list,prefix):

   names={}
   repeated_name={}
   for page_title in list:
       first_part=page_title.split(u' ')[0]
       if not first_part.strip():
           continue
       if not first_part  in names:
           names[first_part]=(prefix+page_title).strip()
       else:
           if (prefix+first_part).strip() in repeated_name:
               repeated_name[(prefix+first_part).strip()]=repeated_name[(prefix+first_part).strip()]+u'|'+(prefix+page_title).strip()
           else:
               repeated_name[(prefix+first_part).strip()]=names[first_part]+u'|'+(prefix+page_title).strip()
   for i in repeated_name:
       repeated_name[i]=repeated_name[i].split(u'|')
   return repeated_name

def main():

   CatTitles,gen=u,u
   genFactory = pagegenerators.GeneratorFactory()
   for arg in wikipedia.handleArgs():
       if arg.startswith( '-cat' ):
           if len(arg) == 4:
               CatTitles=wikipedia.input( u'Which page do you want to chage?' )
           else:
               CatTitles= arg[5:]
           CatTitles=local_category+u':'+CatTitles.replace(local_category+u':',u).replace(u'Category:',u).replace(u'category:',u)
           break
       else:
           generator = genFactory.handleArg(arg)
           if generator:
               gen = generator
   if CatTitles:
       run(CatTitles)
       gen=u
   if not gen:
       wikipedia.stopme()    
       sys.exit()
   preloadingGen = pagegenerators.PreloadingGenerator(gen,pageNumber = 60)
   for catname in preloadingGen:
       run(catname.title())

if __name__ == '__main__':

   main()