ویکیپدیا:درخواستهای ربات/افزودن الگو ناوباکس به مقالات
این ربات برای افزودن الگوی ناوباکس به مقالاتی است که درون ناوباکس پیوند دارند.
آرگومانها
ویرایشاین ربات با همه آرگومانهای استاندارد پای ویکیپدیا کار می کند مانند
- -start:template:!
- -newtem:100
- -file:text.txt
نمونه دستور
ویرایشاین دستور به ۱۰۰ الگوی جدید ایجاد شده در صورتی که ناوباکس باشند مراجعه میکند و به مقالاتشان آن ناوباکسها را می افزاید
python navebox.py -newtem:100
نمونه ۲
ویرایشاین دستور به مقالات موجود در ناوباکسهای فهرست شده در یک فایل متنی الگو ناوباکس می افزاید.
همه الگوها را به صورت زیر
[[الگو:تست]] [[الگو:تست۱]] [[الگو:تست۲]] [[الگو:تست۳]]
در فایل text.txt ذخیره کنید
python navebox.py -file:text.txt
نکته
ویرایشبرای جلوگیری از خرابکاری در مقالات و نیافزودن ناوباکسهای اشتباه، این ربات فقط ناوباکسهایی که توسط کاربران بالای ۱۰۰۰ ویرایش ساخته میشود را میافزاید.
کد
ویرایش#!/usr/bin/python
# Reza (User:reza1615)
# -*- coding: utf-8 -*-
import pywikibot, json, sys, re, os
from pywikibot import pagegenerators
fasite = pywikibot.Site('fa','wikipedia')
_cache={}
botversion='1706'
boxes=['infobox','Geobox','Taxobo', 'جعبه']
def solve_redirect(tem,fapage,fapage_redi,delink):
tem = pywikibot.Page(fasite,tem.title())
try:
text=tem.get()
text=text.replace('[[ ','[[').replace(' ]]',']]').replace(' |','|').replace('[['+fapage.title()+']]','[['+fapage_redi.title()+'|'+fapage.title()+']]')
text=text.replace('[['+fapage.title()+'|','[['+fapage_redi.title()+'|')
tem.put(text,'ربات:اصلاح تغییرمسیر')
except:
pass
def link_filtering(tem_text,links):
mytext='\n'
tem_text_f=tem_text.replace('\r','')
tem_text_f=tem_text_f.replace('\n*',' ')
tem_text_f=tem_text_f.replace(' |','|').replace(' |','|').replace(' |','|').replace(' |','|')
tem_text_f=tem_text_f.replace(' =','=').replace(' =','=').replace(' =','=').replace(' =','=')
our_test_text=re.sub(r'\{\{ *[Nn]ational.*?squad','',tem_text_f)
if our_test_text!=tem_text_f:
for i in tem_text_f.split('\n|'):
if 'p1' not in i and 'p2' not in i and 'p3' not in i and 'p4' not in i and 'p5' not in i and 'p6' not in i and 'p7' not in i and 'p8' not in i and 'p9' not in i and 'p0' not in i and 'coach' not in i:
mytext+=i
elif tem_text_f!=re.sub(r'\{\{ *[nN]avbox with columns','',tem_text_f):
for i in tem_text_f.split('\n|'):
if re.sub(r'^ *col\d{1,2} *\=','',i)==i:
mytext+=i
elif tem_text_f!=re.sub(r'\{\{ *[Yy]ear [Nn]obel [pP]rize [Ww]inners','',tem_text_f):
for i in tem_text_f.split('\n|'):
if re.sub(r'(chemistry|physics|medicine|economy|literature|peace)','',i)==i:
mytext+=i
elif tem_text_f!=re.sub(r'\{\{ *([Cc]ounty|جستارهای کشور)','',tem_text_f):
for i in tem_text_f.split('\n|'):
if re.sub(r'^ *(cr|md|ua|bd|ct|rv|cl|history|geography|politics|military|economy|society|culture|symbols) *\=','',i)==i:
mytext+=i
elif tem_text_f!=re.sub(r'\{\{ *([Uu]S state navigation box|[uU]S county navigation box)','',tem_text_f):
for i in tem_text_f.split('\n|'):
for i in range(1, 9):
if 'body{}'.format(i) not in i:
mytext+=i
else:
list_ = ['list ', 'list=', 'list1', 'list2', 'list3', 'list4', 'list5', 'list6', 'list7', 'list8', 'list9', 'list0', 'فهرست۰', 'فهرست۹', 'فهرست۸', 'فهرست۷', 'فهرست۶', 'فهرست۵', 'فهرست۴', 'فهرست۳', 'فهرست۲', 'فهرست۱', 'content1', 'content2', 'content3', 'content4', 'content5', 'content6', 'content7', 'content8', 'content9', 'content0']
for i in tem_text_f.split('\n|'):
for j in list_:
if j in i:
break
else:
mytext+=i
black_text=' '
dict={'<noinclude>':'</noinclude>','{{یادکرد':'}}','<ref':'</ref','{{cite':'}}','{{Cite':'}}'}
for a in dict:
count=0
for i in mytext.split(a):
count+=1
if count>1:
black_text+=i.split(dict[a])[0]
black_links2 = re.findall(r'\[\[(.*?)(?:\||\]\])',black_text+mytext, re.S)
new_links,delink=[],[]
for i in links:
itest=i.split('|')[0].replace('_',' ').replace(' ',' ')
if not itest.strip():
delink.append(i)
if itest in black_links2 or itest in new_links or ':' in i:
continue
else:
if itest=='آذرشهر':
new_links.append(i)
continue
itest=itest.strip()
itest=re.sub(r'[۱۲۳۴۵۶۷۸۹۰]','',itest)
itest=re.sub(r'\((میلادی|قمری|پیش از میلاد|قبل از میلاد)\)','',itest)
b_list=['کاپیتان (فوتبال)','استان','دهستان','کشور','شهر','شهرستان','بخش','فروردین','اردیبهشت','خرداد',
'تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند','ژانویه','فوریه','مارس','ژوئیه','ژوئن',
'آوریل','اوت','سپتامبر','نوامبر','دسامبر','می','اکتبر']
itest=re.sub(r'('+'|'.join(b_list).replace(')','\)').replace('(','\(')+')','',itest)
if not itest.strip():
delink.append(i)
continue
itest=re.sub(r'[^صثقفغعهخحجچشسیبلاتنمکگظطزرذدپوژآيئؤًٌٍَُِّْٔ]','',itest)
if not itest.strip():
continue
new_links.append(i)
return new_links,delink
def boxfind(text_en):
text_en=text_en.replace('{{ ','{{').replace('{{ ','{{').replace('{{template:','{{').replace('{{Template:','{{').replace('\r','')
start=False
box='\n'
diff=1
linebaz,linebasteh=0,0
for our_box in boxes:
our_box=our_box.strip()
up_our_box=our_box[0].upper()+our_box[1:]
lower_our_box=our_box[0].lower()+our_box[1:]
regex_result=re.findall('(\{\|([\n\s]+|)\{\{([\s]+|)'+our_box+')',text_en, re.IGNORECASE)
if regex_result:
if regex_result[0][0].strip():
pre_template='{|'
post_tempate='|}'
text_en=text_en.replace('{| ','{|').replace('{| ','{|').replace('{|\n','{|').replace('{|\n','{|')
text_en=text_en.replace(' |}','|}').replace(' |}','|}').replace('\n|}','|}').replace('\n|}','|}')
else:
pre_template,post_tempate='',''
lines=text_en.split('\n')
for line in lines:
if line=='':
continue
if line.find(pre_template+'{{'+lower_our_box)!=-1 :# lower case
start=True
linebaz,linebasteh=0,0
box+=pre_template+'{{'+lower_our_box+line.split(pre_template+'{{'+lower_our_box)[1]+'\n'
linebaz += line.count( pre_template+"{{" )
linebasteh += line.count( "}}"+post_tempate )
diff=linebaz-linebasteh
continue
if line.find(pre_template+'{{'+up_our_box)!=-1 :# upper case
start=True
linebaz,linebasteh=0,0
box+=pre_template+'{{'+up_our_box+line.split(pre_template+'{{'+up_our_box)[1]+'\n'
linebaz += line.count( pre_template+"{{" )
linebasteh += line.count( "}}" +post_tempate)
diff=linebaz-linebasteh
continue
if start==True and diff!=0:
linebaz += line.count( pre_template+"{{" )
linebasteh += line.count( "}}"+post_tempate )
diff=linebaz-linebasteh
box+=line+'\n'
if diff==0 and start==True:
break
if box.strip():
break
return box.replace('}}|}','}}\n|}')
def Get_box (txt):
my_box=boxfind(txt)
if my_box.strip():
return my_box.strip()
txt=txt.replace('\r','')
lines=txt.split('\n')
matn=' '
for line in lines:
linebaz=line.count(line,'{{')
linebaste=line.count(line,'}}')
diff=linebaz-linebaste
if diff==0:
line=line.replace('{{','$AAAA$').replace('}}','!BBBB!')
linebaz=0
linebaste=0
matn+=line+'\n'
my_box=''
for our_box in boxes:
our_box=our_box.strip()
try:
my_box= re.search(r'(\{\{\s*['+our_box[0].lower()+our_box[0].upper()+r']'+our_box[1:]+r'[_\s](?:\{\{.*?\}\}|[^\}])*\}\})',matn, re.S).group(1)# if Template box has other name please chang this regex
my_box=my_box.replace('$AAAA$','{{').replace('!BBBB!','}}')
break
except:
continue
if not my_box.strip():
return False
return my_box.strip()
def addtext (fapage,text,addtemplate,addtemplate2,msg_clean,username_r,tempetype):
text_t=text.replace('_',' ')
if '{{ابهامزدایی' in text_t or '{{نمایه' in text_t or '{{نام کوچک' in text_t or '{{نام خانوادگی' in text_t or '{{مقالات مجموعهنمایه' in text_t:
return False
text=text.replace(addtemplate+'\n','')
if tempetype=='navbox':
if 'رده:' in text:
num=text.find('[[رده:')
text=text[:num]+addtemplate+'\n'+text[num:]
else:
text+='\n'+addtemplate
elif tempetype=='sidebar':
ourbox=Get_box (text)
if not ourbox:
text=addtemplate+'\n'+text
my_text_result=re.findall(r'\{\{(?:ویکی[ ]?سازی|منبع|بدون منبع|لحن|تمیزکاری|طفرهآمیز|نامفهوم|تبلیغات|بهبود منبع|طرفداری|درستی|ادغام با|ادغام از|ادغام|در دست ویرایش ۲|تازه درگذشته|اصلاح ترجمه|رده-نیاز)(?:.*?)?\}\}',text, re.IGNORECASE)
if my_text_result:
for i in my_text_result:
text=i+'\n'+text.replace(i+'\n','').replace(i,'')
else:
return False
else:
return False
try:
fapage.put(text,'[[وپ:ابزارک|افزودن ناوباکس]] '+botversion+'> '+addtemplate2+' (درخواست [['+username_r+']])'+msg_clean)
return True
except:
pass
return False
def templatequery(enlink):
temps=[]
try:
enlink=str(enlink).replace('[[','').replace(']]','').replace('en:','').replace('fa:','')
except:
enlink=enlink.replace('[[','').replace(']]','').replace('en:','').replace('fa:','')
enlink=enlink.split('#')[0].strip()
enlink=enlink.replace(' ','_')
if _cache.get(tuple([enlink, 'templatequery'])):
return _cache[tuple([enlink, 'templatequery'])]
if enlink=='':
_cache[tuple([enlink, 'templatequery'])]=False
return False
params = {
'action': 'query',
'prop':'templates',
'titles': enlink,
'redirects': 1,
'tllimit':500,
}
try:
categoryname = pywikibot.data.api.Request(
site=fasite, parameters=params)
categoryname = categoryname.submit()
for item in categoryname['query']['pages']:
templateha=categoryname['query']['pages'][item]['templates']
break
for temp in templateha:
temps.append(temp['title'].replace('_',' ').replace('الگو:','').replace('template:','').strip())
_cache[tuple([enlink, 'templatequery'])]=temps
return temps
except:
_cache[tuple([enlink, 'templatequery'])]=False
return False
def check_user_edits(username):
username=username.replace(' ','_')
if _cache.get(tuple([username, 'check_user_edits'])):
return _cache[tuple([username, 'check_user_edits'])]
params = {
'action': 'query',
'list': 'users',
'ususers': username,
'usprop':'editcount'
}
try:
usernamequery = pywikibot.data.api.Request(
site=fasite, parameters=params)
usernamequery = usernamequery.submit()
if usernamequery['query']['users'][0]['editcount']>1000:
_cache[tuple([username, 'check_user_edits'])]=True
return True
else:
_cache[tuple([username, 'check_user_edits'])]=False
return False
except:
_cache[tuple([username, 'check_user_edits'])]=False
return False
def check_user(fapage):
First_user=''
try:
page_history=fapage.getVersionHistory()
First_user=page_history[-1][2]
if check_user_edits(First_user):
return True,First_user
else:
return False,First_user
except:
return False,First_user
def add_nav(preloadingGen,username_r):
for tem in preloadingGen:
tem_title=tem.title().replace('الگو:','')
if not re.sub(r'[^صثقفغعهخحجچشسیبلاتنمکگظطزرذدپوژآيئؤًٌٍَُِّْٔ]','',tem_title).strip():
continue
if '/' in tem_title or '\\' in tem_title:
continue
try:
tem_text=tem.get()
except:
continue
tem_text=tem_text.replace('{{ ','{{').replace('{{ ','{{').replace('{{الگو:','{{').replace('{{Template:','{{').replace('{{template:','{{')
TempTemplates=templatequery(tem.title())
if not TempTemplates:
continue
if not 'Navbox' in TempTemplates and not 'نوار جانبی' in TempTemplates:
continue
if 'Navbox' in TempTemplates:
tempetype='navbox'
if 'نوار جانبی' in TempTemplates:
tempetype='sidebar'
added_template=tem.title().replace('الگو:','').replace('template:','').replace('Template:','')
if tem.namespace()!=10:
continue
redirects=tem.getReferences(redirectsOnly=True)
redirect_list=[]
for i in redirects:
redirect_list.append(i.title().replace('الگو:','').replace('template:','').replace('Template:',''))
links=tem.linkedPages()
link_t=[]
for i in links:
link_t.append(i.title())
links_ref=tem.getReferences()
link_t2=[]
for i in links_ref:
link_t2.append(i.title())
links=[x for x in link_t if x not in link_t2]
links,delink=link_filtering(tem_text,links)
old_tem_text=tem_text
for nonlink in delink:
tem_text=tem_text.replace('[['+nonlink+']]',nonlink.split('|')[0])
if old_tem_text!=tem_text:
tem.put(tem_text,'ربات:برداشتن پیوندهای نالازم')
added_links=[]
for faTitle in links:
try:
fapage=pywikibot.Page(fasite, faTitle)
text=fapage.get()
except pywikibot.exceptions.IsRedirectPageError:
fapage_redi = fapage.getRedirectTarget()
try:
text=fapage_redi.get()
solve_redirect(tem,fapage,fapage_redi)
fapage=fapage_redi
except:
continue
except:
continue
old_text=text
for i in redirect_list:
text=text.replace('{{'+i+'}}','{{'+added_template+'}}').replace('{{'+i+'|','{{'+added_template+'|')
fatemplates=templatequery(fapage.title())
text=text.replace('{{ ','{{').replace(' }}','}}').replace('{{الگو:','{{').strip()
if not fatemplates:
continue
if '{{'+added_template+'}}' not in text and (not added_template in fatemplates):
addtemplate2='[[الگو:'+added_template+']]'
addtemplate='{{'+added_template+'}}'
addtext_result= addtext (fapage,text,addtemplate,addtemplate2,' ',username_r,tempetype)
if addtext_result:
added_links.append(faTitle)
continue
if old_text!=text:
try:
fapage.put(text,'ربات:اصلاح تغییرمسیر ناوباکس')
except:
pass
continue
my_result={}
if added_links:
my_result['msg']='الگو به «'+'»، «'.join(added_links)+'» افزوده شده!'
else:
my_result['msg']='الگو در همهٔ مقالات موجود است!'
print(json.dumps(my_result, ensure_ascii=False))
def main():
gen = None
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'navbox_transfer.json')
with open(file_path, 'r') as f:
run_data = json.loads(f.read())
if not run_data:
return
if '-newtem' in sys.argv:
gen = pagegenerators.NewpagesPageGenerator(site=fasite, total=100, namespaces=(10))
else:
gen = [pywikibot.Page(fasite, run_data['template'])]
with open(file_path, 'w') as f:
f.write('{}')
add_nav(gen,run_data['user'])
if __name__ == "__main__":
main()
else:
faPage = pywikibot.Page(fasite, sys.argv[1])
add_nav([faPage],sys.argv[2])