User:Reza1615/BOT/new interwiki-test.py
<source lang='python'>
- !/usr/bin/python
from __future__ import unicode_literals
- -*- coding: utf-8 -*-
- Reza (User:reza1615)
- Distributed under the terms of the CC-BY-SA 3.0 .
- -*- coding: utf-8 -*-
import wikipedia,pagegenerators,config import query,time,login,codecs,re import wikidata
- -------------------------------localization--------------------
Orgine_lang='fa' ignore_templates=[u'الگو:ویکیداده نه',u'الگو:رده بهتر',u'الگو:حذف سریع',u'الگو:حذف زماندار/پیغام',u'الگو:پیشنهاد حذف ۲',u'الگو:ادغام با',u'الگو:ادغام شد در',u'الگو:درخواست ادغام',u'الگو:رده پنهان',u'الگو:Hiddencat',u'الگو:انتقال رده',u'الگو:تغییر مسیر رده',u'الگو:DB',u'الگو:DELETE',u'الگو:Db',u'الگو:Db-Reason',u'الگو:Db-because',u'الگو:Db-reason',u'الگو:Delbecause',u'الگو:Delete because',u'الگو:Delete',u'الگو:Deletebecause',u'الگو:Speedy delete',u'الگو:Speedy',u'الگو:Speedydelete',u'الگو:حذف فوری',u'الگو:حس',u'الگو:کاندید حذف',u'الگو:بدون منبع مدتدار',u'الگو:بدون منبع ۲',u'الگو:بدون منبع۲',u'الگو:Prod',u'الگو:نامزد حذف',u'الگو:Proposed deletion',u'الگو:حذف زماندار'] Orgine_Category_Name=u'رده:' Orgine_Template_Name=u'الگو:' Orgine_Chrs = u'ءاآأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیيك'+u'ًٌٍَُِّْ' Orgine_NUM=u'۰۱۲۳۴۵۶۷۸۹' Second_Lang='en' Second_Lang_NUM='0123456789' Confilict_Template=u'\nTemplate:تداخل میانویکی' skip_new=200 Local_Remove_IWs_Summary=u'ربات: حذف میانویکی موجود در ویکیداده: ' Interwwiki_name=u' میانویکی' ZWNJ_Redirect_Summary=u"ربات:ایجاد تغییرمسیر از فاصله به نیمفاصله"
- ----------------------------------------------------------------
- -------------------Summary which uses in wikidata and they should be english ----
creat_summary="Bot: Import page from {0}wiki".format(Orgine_lang) update_link_summary="Bot: Update site links from {0}wiki".format(Orgine_lang) update_link_labels_summary="Bot: Update site links and labels from {0}wiki".format(Orgine_lang) update_Labels_summary=u'Bot: Update of labels.'
- -------------------------------------------------------------------------------
Orgine_Site=wikipedia.getSite(Orgine_lang,fam='wikipedia') repo = Orgine_Site.data_repository() SafeWork=True mysite=wikipedia.getSite('wikidata','wikidata')
def remove_old_IW (page):
Regex=re.compile(ur'(\[\[([a-z]{2,3}|[a-z]{2,3}\-[a-z\-]{2,}|simple):.*?\]\])') text=u removed_iw=[] WD_Data = wikipedia.DataPage(page) if not WD_Data.exists(): return False WD_Dict=WD_Data.get() WD_Dict= WD_Dict['links'] try: text=page.get() except wikipedia.IsRedirectPage: page = page.getRedirectTarget() try: text=page.get() except: return False except: return False if not text: return False old_text=text text=text.replace(u'\r',u) IWs = Regex.findall(text) if IWs: for iw in IWs: has_hash=False iw_link=iw[0] if '#' in iw_link: has_hash=True iw_prf=iw[1]+u'wiki' iw_prf=iw_prf.replace(u'-',u'_') ineterwiki_row_link=iw_link.replace(u'[['+iw[1]+u':',u).replace(u']]',u).replace(u'_',u' ').strip() if (iw_prf in WD_Dict) or has_hash or ((iw_prf in WD_Dict) and ineterwiki_row_link!=redirect_find( ineterwiki_row_link,iw[1]).replace(u'_',u' ').strip()): wikipedia.output('\03{lightred}- \03{default}'+iw_link) text=text.replace(iw_link+u'\n',u).replace(iw_link,u) removed_iw.append(iw[1]) else: if Confilict_Template in text: text=text.replace(u'\n'+Confilict_Template,u).replace(Confilict_Template,u) wikipedia.output('\03{lightred}- R'+Confilict_Template+' \03{default}') page.put(text.strip(),u'ربات:حذف الگوی تداخل رفع شده') IWs = Regex.findall(text) if old_text!=text: if IWs: if not Confilict_Template in text: if page.namespace()!=10 : text+=Confilict_Template else: if text.find(u)!=-1: text=text.replace(u,Confilict_Template+u'\n') else: return False wikipedia.output('\03{lightblue}+ A'+Confilict_Template+' \03{default}') else: my_old_text=text text=text.replace(Confilict_Template,u) if my_old_text!=text: wikipedia.output('\03{lightred}- R'+Confilict_Template+' \03{default}') text = re.sub('[\r\n]{3,}', "\n\n",text) text=text.replace(u,u).replace(u'\n',u).replace(u'\n\n',u) if removed_iw: if len(removed_iw)>10: removed_iw_NUM=str(len(removed_iw)) for i in range(0,10): removed_iw_NUM = removed_iw_NUM.replace(u'0123456789'[i], Orgine_NUM[i])
removed_links_summary=removed_iw_NUM+Interwwiki_name else: removed_links_summary=u', '.join(removed_iw)
if IWs: page.put(text.strip(),Local_Remove_IWs_Summary+removed_links_summary+u' + '+Confilict_Template) else: try: page.put(text.strip(),Local_Remove_IWs_Summary+removed_links_summary) except wikipedia.LockedPage: wikipedia.output(u'Skipping(locked page)') return True
return False
def login_wiki(mode):
if mode==1: dataSite=wikipedia.getSite('wikidata','wikidata') if mode==2: dataSite=wikipedia.getSite(Orgine_lang,'wikipedia') try: password_wiki = open("/home/javadyou/pywikipedia/passfile", 'r') except: password_wiki = open(wikipedia.config.datafilepath(config.password_file), '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=dataSite) #botlog.logout() botlog.login()
def save_file(case,type):
if type=='error': file = 'zzinterwiki_import_errors.txt' else: file = 'zzinterwiki_conflicts.txt' try: file_text = codecs.open(file,'r' ,'utf8' ) file_text = file_text.read().strip() except: file_text=u if not case in file_text: with codecs.open(file ,mode = 'a',encoding = 'utf8' ) as f: f.write(u'\n'+case)
def templatequery(pagelink):
temps=[] pagelink=pagelink.split(u'#')[0].strip() if pagelink==u: return False pagelink=pagelink.replace(u' ',u'_') params = { 'action': 'query', 'prop':'templates', 'titles': pagelink, 'redirects': 1, 'tllimit':500, } try: categoryname = query.GetData(params,Orgine_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 False
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: return page_link.replace(u'_',u' ')
def Check_Page_Exists(page_link, wiki):
page_link=page_link.replace(u' ',u'_')
site = wikipedia.getSite(wiki.replace(u'_',u'-')) params = { 'action': 'query', 'prop':'info', 'titles': page_link } query_page = query.GetData(params,site) try: for i in query_page[u'query'][u'pages']: redirect_link=query_page[u'query'][u'pages'][i]['pageid'] return True# page existed except: return False# page not existed
def get_interwikis(link,lang):
Orgine_Site=wikipedia.getSite(lang.replace(u'_',u'-'),fam='wikipedia') if link.find('#')!=-1: return False if link==u: return False link=link.replace(u' ',u'_') appenddict={} try: params = { 'action': 'query', 'prop': 'langlinks', 'titles': link, 'redirects': 1, 'lllimit':500, } pagename = query.GetData(params,Orgine_Site) for item in pagename[u'query'][u'pages']: case=pagename[u'query'][u'pages'][item][u'langlinks'] for lang in case: L_lang=lang['lang'] L_link=lang['*'] if not (L_lang in appenddict): if L_lang=='nb': L_lang='no' appenddict[L_lang]=L_link return appenddict except: return appenddict
def check_item(wiki,link):
site=wikipedia.getSite(wiki.replace(u'_',u'-'),fam='wikipedia') page=wikipedia.Page(site,link) data=wikipedia.DataPage(page) try: items=data.get() except wikipedia.NoPage: return True except: wikipedia.output("\03{lightred}Item has been created. Skipping...\03{default}") return False
def set_lable(data,new_langs,item):
dic_item=data.get() old=dic_item['links'] changes=False for cases in new_langs: if cases=='nb': cases='no' dic_item['links'][cases]=new_langs[cases] if old!=dic_item['links']: wikipedia.output('added '+cases+'......................') for langs in dic_item['links']: if langs=='nb': langs='no' value=dic_item['links'][langs].strip() lang=langs.replace('wiki',).replace('_','-') try: value=unicode(value,'UTF8') except: pass if lang !='fa': value = value.split(u'(')[0].strip() if lang =='es' or lang=='pt' or lang=='pt-br': value = value.replace(u"Anexo:",u"") if lang == 'cs': value = value.replace(u"Príloha:",u"") if lang == 'de-ch': value = value.replace(u"ß",u"ss") try : a=dic_item['label'][lang] except: item.labels[lang] = value changes=True wikipedia.output('\03{lightgreen}for '+value+' added as label of '+lang+'\03{default}') if changes: changes=True else: wikipedia.output("Doesn't need any update!") changes=False return item,changes
def Update_data(data_add,appenddict):
item = wikidata.api.getItemById(data_add.title()) summary= confilict={} new_langs={} for lang in appenddict: if lang=='nb': lang='no' site_lang=lang interlangLinks=appenddict[lang] status=check_item(site_lang,interlangLinks) if not status: wikipedia.output(site_lang+' has confilict!') confilict[site_lang]=interlangLinks continue summary=update_link_summary item.sitelinks[lang+"wiki"] = interlangLinks new_langs[lang+"wiki"] = interlangLinks
if confilict: item_confilict=u'* '+data_add.title()+u' Confilict > ' for i in confilict: item_confilict+=u'[[:'+i+u':'+confilict[i]+u'|'+i+u'wiki]]-' save_file(item_confilict[:-1],'conflict') if SafeWork: wikipedia.output('\03{lightred}-->'+data_add.title()+' Passed! because of safe mode and conflict\03{default}') return False if summary: item,changes=set_lable(data_add,new_langs,item) if changes: summary=update_link_labels_summary try: wikidata.api.save(item, summary) wikipedia.output('\03{lightblue}Page '+data_add.title()+' : '+summary+'\03{default}') return True except Exception,e: try: wikipedia.output('\03{lightred}Page '+data_add.title()+' Passed! error was : '+str(e)+' \03{default}') except: wikipedia.output('\03{lightred}Page '+data_add.title()+'Passed!\03{default}') return False
def find_diff(my_data,interwiki_links):
dictionary = my_data.get() dictionary= dictionary['links'] appenddict={} for lang in interwiki_links: if lang=='nb': lang='no' L_lang=lang.replace(u'-',u'_') L_link=interwiki_links[lang] if L_link.find(u'/')!=-1: wikipedia.output(u'Passed template doc!') continue if not (L_lang in appenddict): if not ((L_lang+'wiki') in dictionary): appenddict[L_lang]=L_link wikipedia.output('\03{lightblue}+ '+L_lang +u' > '+L_link+' \03{default}') if appenddict: done=Update_data(my_data,appenddict) if done: return True else: wikipedia.output(str(appenddict)) item = wikidata.api.getItemById(my_data.title()) new_langs={} item,changes=set_lable(my_data,new_langs,item) if changes: summary=update_Labels_summary wikidata.api.save(item, summary) wikipedia.output('\03{lightblue}Page '+my_data.title()+' : '+summary+'\03{default}') return True return False
def Check_Second_Lang(title):
for i in range(0,10): title = title.replace(Orgine_NUM[i], Second_Lang_NUM[i]) new_title = re.sub(u'['+Orgine_Chrs+u']', "",title) if new_title==title: check_title=Check_Page_Exists(title, Second_Lang) if check_title: return title return False
def run(preloadingGen,hasnew,Remove_IW):
if hasnew: pagecount=0 else: pagecount=skip_new+1 for Orgin_page in preloadingGen: pagecount+=1 other_wiki=False if not str(Orgin_page.namespace()) in [u'0',u'14',u'100',u'102']: continue wikipedia.output(str(u'----------------------')) Orgine_title=Orgin_page.title() if Orgin_page.namespace>0 and Orgine_title.find(u'/')!=-1: wikipedia.output(u'It is a subpage!') continue if not Orgin_page.exists(): wikipedia.output(u'Page '+Orgine_title+ u' not existed so it is passed!') continue # checking for ignore templates #if Orgin_page: try: do_work=True page_templates=templatequery(Orgine_title) if page_templates: for template in ignore_templates: if template in page_templates: do_work=False wikipedia.output(u'\03{lightred}Page '+Orgine_title+u' had Template:'+template.replace(Orgine Template Name,u'')+' so it is passed!\03{default}') break if not do_work: continue #---- interwiki_links=get_interwikis(Orgine_title,Orgine_lang)# get site's interwikis
if (Orgin_page.namespace()==14 or Orgin_page.namespace()==10) and (not Second_Lang in interwiki_links) and Orgine_lang!=Second_Lang:# adding en interwiki! Second_IW=Check_Second_Lang(Orgine_title.replace(Orgine_Template_Name,u'Template:').replace(Orgine_Category_Name,u'Category:')) if Second_IW: interwiki_links[Second_Lang]=Second_IW wikipedia.output(u'--Bot suggested '+ Second_IW +u' as '+Second_Lang+u'.wiki link!--') interwiki_links[Orgine_lang]=Orgine_title
#------------------ my_page = wikipedia.Page(Orgine_Site, Orgine_title) my_data = wikipedia.DataPage(my_page) if len(interwiki_links)==1: Remove_NOIW=False if my_data.exists():# creating new item #------------------------------------------------case 0 (NoIW-Item)--------------- wikipedia.output(u'NoIW-Item= '+Orgine_title) wikipedia.output(u"Doesn't need update!") continue else: #------------------------------------------------case 1 (NoIW-NoItem)--------------- if pagecount < skip_new: continue wikipedia.output(u'NoIW-\03{lightred}NoItem\03{default}= '+Orgine_title) for i in range(0,2): try: my_data.createitem(creat_summary) except: if i<1: login_wiki(1) time.sleep(1) if my_data.exists(): break if my_data.exists(): wikipedia.output(u'created item= '+creat_summary) else:# switch to mode 2 (temparay item) save_file(u''+Orgine_title+u'','error') wikipedia.output(u'\03{lightred}Item creation had error..!1\03{default}') else: Remove_NOIW=True if my_data.exists():# normal updating to existed item #------------------------------------------------case 2 (IW-Item) --------------- wikipedia.output(u'IW-Item= '+Orgine_title) try: done=find_diff(my_data,interwiki_links) if done: wikipedia.output(u'\03{lightgreen}Item updated!\03{default}') else: wikipedia.output(u'\03{lightyellow}Item did not updated..!2\03{default}') except: save_file(u''+Orgine_title+u'','error') wikipedia.output(u'\03{lightyellow}Item did not updated and bot passes..!\03{default}') continue else: for iw in interwiki_links: other_wiki_link=redirect_find( interwiki_links[iw],iw) if not other_wiki_link.strip(): continue other_wiki_page = wikipedia.Page(iw, other_wiki_link) other_wiki_data = wikipedia.DataPage(other_wiki_page) if other_wiki_data.exists():# creating new item other_wiki=True break if other_wiki: #----------------------------------------------case 3 (IW-OtherWikiItem)--------------- wikipedia.output(u'IW-\03{lightgreen}OtherWikiItem\03{default}= '+Orgine_title) wikipedia.output(u'Updating item...') try: done=find_diff(other_wiki_data,interwiki_links) if done: wikipedia.output(u'\03{lightgreen}Item updated!\03{default}') else: wikipedia.output(u'\03{lightyellow}Item did not updated..!3\03{default}') except: continue else: #----------------------------------------------case 4 (IW-NoItem)--------------- if pagecount < skip_new: continue wikipedia.output(u'IW-\03{lightred}NoItem\03{default}= '+Orgine_title) sitelinks,labels = [],[] for iw in interwiki_links: inter_value=interwiki_links[iw] if iw !='fa': inter_value = inter_value.split(u'(')[0].strip() if iw =='es' or iw=='pt' or iw=='pt-br': inter_value = inter_value.replace(u"Anexo:",u"") if iw == 'cs': inter_value = inter_value.replace(u"Príloha:",u"") if iw == 'de-ch': inter_value = inter_value.replace(u"ß",u"ss")
sitelinks.append({"site": iw+"wiki", "title": interwiki_links[iw]}) labels.append({"language": iw, "value": inter_value}) values = {"sitelinks": sitelinks,"labels": labels} wikipedia.output(u"Creating item for %s" % (Orgin_page.title())) try: my_data.createitem(value = values, summary = creat_summary) except: wikipedia.output(u"\03{lightred}Bot couldn't make an item for "+Orgin_page.title()+u" so it is passed!\03{default}") continue
#----Removing Iterwikis from Local wiki (it needes to have a flag on local wiki!) if Orgin_page.namespace()!=10 and Remove_IW and Remove_NOIW: remove_result=remove_old_IW (Orgin_page) if not remove_result: wikipedia.output(u"\03{lightpurple}Bot couldn't remove interwikis from "+Orgin_page.title()+u" in Local wiki!F\03{default}") #else: except: continue
def main():
wikipedia.config.put_throttle = 0 gen=None wikipedia.put_throttle.setDelay() hasnew,preloadingGen,Remove_IW=False,False,True PageTitles,namespaces = [], genFactory = pagegenerators.GeneratorFactory() for arg in wikipedia.handleArgs(): if arg.startswith('-newcat'): arg=arg.replace(':',) if len(arg) == 7: genfa = pagegenerators.NewpagesPageGenerator(200, False, None,14) else: genfa = pagegenerators.NewpagesPageGenerator(int(arg[7:])+skip_new, False, None,14) preloadingGen = pagegenerators.PreloadingGenerator( genfa,60) hasnew=True break elif arg.startswith ('-new'): arg=arg.replace(':',) if len(arg) == 4: genfa = pagegenerators.NewpagesPageGenerator(200, False, None,0) else: genfa = pagegenerators.NewpagesPageGenerator(int(arg[4:])+skip_new, False, None,0) preloadingGen = pagegenerators.PreloadingGenerator( genfa,60) hasnew=True break elif arg.startswith ('-remove'): Remove_IW=True elif arg == '-autotitle': autoTitle = True 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('-namespace:'): namespaces=int(arg[11:]) elif arg.startswith('-force'): SafeWork = False else: generator = genFactory.handleArg( arg ) if generator: gen = generator if not gen: wikipedia.stopme() if PageTitles: pages = [wikipedia.Page( Orgine_Site,PageTitle ) for PageTitle in PageTitles] gen = iter( pages ) if namespaces: gen = pagegenerators.NamespaceFilterPageGenerator( gen,namespaces ) if not preloadingGen: preloadingGen = pagegenerators.PreloadingGenerator( gen,pageNumber = 60) run(preloadingGen,hasnew,Remove_IW)
if __name__ == "__main__":
login_wiki(1) login_wiki(2) main()