User:Reza1615/BOT/new interwiki-test.py

<source lang='python'>

  1. !/usr/bin/python

from __future__ import unicode_literals

  1. -*- coding: utf-8 -*-
  2. Reza (User:reza1615)
  3. Distributed under the terms of the CC-BY-SA 3.0 .
  4. -*- coding: utf-8 -*-

import wikipedia,pagegenerators,config import query,time,login,codecs,re import wikidata

  1. -------------------------------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"ربات:ایجاد تغییرمسیر از فاصله به نیم‌فاصله"

  1. ----------------------------------------------------------------
  1. -------------------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.'

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

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()