ویکی‌پدیا:درخواست‌های ربات/جایگزین‌کننده پیوندهای قرمز انگلیسی

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

<syntaxhighlight lang='python'>

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

import query,re,wikipedia import codecs,config,time#,string import MySQLdb as mysqldb wikipedia.config.put_throttle = 0 wikipedia.put_throttle.setDelay() mysite='fa'

def Check_Page_Exists(page_link):

   page_link=page_link.replace(u' ',u'_')
   site = wikipedia.getSite(mysite)
   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 namespacefinder( enlink ,firstsite):

   try:
       enlink=unicode(str(enlink),'UTF-8').replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(u'fa:',u)
   except:
       enlink=enlink.replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(u'fa:',u) 
   enlink=enlink.replace(u' ',u'_')
   site = wikipedia.getSite(firstsite)
   params = {
       'action': 'query',
       'prop': 'langlinks',
       'titles': enlink,
       'redirects': 1,
       'lllimit':500,
   }
   a=1    
   if a:
       categoryname = query.GetData(params,site)
       for item in categoryname[u'query'][u'pages']:
           fanamespace=categoryname[u'query'][u'pages'][item]['ns']
       return fanamespace
   else: 
       return False

def redirect_find( page_link):

   page_link=page_link.replace(u' ',u'_')
   params = {
       'action': 'query',
       'redirects':"",
       'titles': page_link
   }
   query_page = query.GetData(params,wikipedia.getSite('en'))
   try:
       redirect_link=query_page[u'query'][u'redirects'][0]['to']
       return False
   except:
       if 'missing=""' in str(query_page):
           return False
       else:
           return True

def englishdictionry( enlink ,firstsite,secondsite):

   try:
       enlink=unicode(str(enlink),'UTF-8').replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(unicode(mysite,'UTF-8')+u':',u)
   except:
       enlink=enlink.replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(unicode(mysite,'UTF-8')+u':',u)
   if enlink.find('#')!=-1:
       return False
   if enlink==u:
       return False    
   enlink=enlink.replace(u' ',u'_')
   site = wikipedia.getSite(firstsite)
   sitesecond= wikipedia.getSite(secondsite)
   params = {
       'action': 'query',
       'prop': 'langlinks',
       'titles': enlink,
       'redirects': 1,
       'lllimit':500,
   }
   try:
       categoryname = query.GetData(params,site)  
       for item in categoryname[u'query'][u'pages']:
           case=categoryname[u'query'][u'pages'][item][u'langlinks']
       for item in case:
           if item[u'lang']==secondsite:
               intersec=item[u'*']
               break
       result=intersec
       if result.find('#')!=-1:
           return False
       return result
   except: 
       return False

def switchnamespace(namespace):

   if namespace==0:
      return u' '
   if namespace==4:
      return u'wikipedia:'
   if namespace==10:
      return u'template:'
   if namespace==12:
      return u'help:'
   if namespace==14:
      return u'category:'
   return False

def revert(text2,text):

   Regexs=re.compile(ur'\{\{\s*(?:[Cc]ite|[Cc]itation)(?:\{\{.*?\}\}|.)*?\}\}',re.DOTALL) 
   citebase = Regexs.findall(text)
   citetarget = Regexs.findall(text2)
   i=-1
   for m in citebase:
          i+=1
          text2=text2.replace(citetarget[i],citebase[i])
   return text2

def getlinks(enlink,falink,first,mysite):

       site = wikipedia.getSite(mysite)
       try:
           page = wikipedia.Page(site,enlink)
           linktos=page.getReferences()
       except:
           return False
       for page in linktos:    
               namespacefa=page.namespace()
               if namespacefa==1 or namespacefa==2 or namespacefa==3 or namespacefa==5 or namespacefa==7 or namespacefa==8 or namespacefa==9 or namespacefa==11 or namespacefa==13 or namespacefa==15 or namespacefa==101:
                       continue
               if first:
                   if namespacefa==0 :    
                       continue
               try:
                   text=page.get()
               except :
                   continue
               time.sleep(2)    
               wikipedia.output(u'checking '+page.title()+u' .....')    
               enlink=enlink.strip()
               text2=text
               fanum=enlink.replace(u'1',u'۱').replace(u'2',u'۲').replace(u'3',u'۳').replace(u'4',u'۴').replace(u'5',u'۵')
               fanum=fanum.replace(u'6',u'۶').replace(u'7',u'۷').replace(u'8',u'۸').replace(u'9',u'۹').replace(u'0',u'۰')    
               fanum_text=re.sub(ur'[1234567890۱۲۳۴۵۶۷۸۹۰\(\)\,\،\.]',ur, fanum).strip()
               if  fanum_text and fanum!=enlink:
                   search_list=[enlink,enlink.lower(),enlink.upper(),enlink.replace(u',',u'،')]
               else:
                   search_list=[enlink,enlink.lower(),enlink.upper(),enlink.replace(u',',u'،'),fanum]
               if text.find(enlink)!=-1:   
                   for enlink in search_list:     
                       text2=text2.replace(u''+enlink+u'',u''+falink+u'').replace(u'[['+enlink+u'|',u'[['+falink+u'|').replace(u'\r',u)
                       text2=text2.replace(u''+enlink+u'',u''+falink+u'').replace(u'[['+enlink+u'|',u'[['+falink+u'|')
                       text2=text2.replace(u''+enlink+u' ',u''+falink+u'').replace(u'[['+enlink+u' |',u'[['+falink+u'|')
                       text2=text2.replace(u''+enlink+u' ',u''+falink+u'').replace(u'[['+enlink+u' |',u'[['+falink+u'|')
                       text2=text2.replace(u''+enlink+u' ',u''+falink+u'').replace(u'[['+enlink+u' |',u'[['+falink+u'|')
                       #-------------------------------------------for cats-----------------------------------
                       text2=text2.replace(u''+enlink+u'',u''+falink+u'').replace(u'[[:'+enlink+u'|',u'[[:'+falink+u'|')
                       text2=text2.replace(u' '+enlink+u'',u''+falink+u'').replace(u'[[: '+enlink+u'|',u'[[:'+falink+u'|')
                       text2=text2.replace(u' '+enlink+u' ',u''+falink+u'').replace(u'[[: '+enlink+u' |',u'[[:'+falink+u'|')
                       text2=text2.replace(u''+enlink+u' ',u''+falink+u'').replace(u'[[:'+enlink+u' |',u'[[:'+falink+u'|')
                       text2=text2.replace(u''+enlink+u' ',u''+falink+u'').replace(u'[[:'+enlink+u' |',u'[[:'+falink+u'|')
                       text2=text2.replace(u' '+enlink+u' ',u''+falink+u'').replace(u'[[: '+enlink+u' |',u'[[:'+falink+u'|')
                   #if string.count(text2,enlink)==1 and text2.find(enlink+u'#')==-1:    
                       #text2=text2.replace(enlink,falink,1)        
                   if text2.find(falink)==-1:
                       wikipedia.output(u'\03{lightblue}could not find any link\03{default}')
                   text2=revert(text2,text)                        
                   if text!=text2:
                       try:
                           page.put(text2,u'ربات :جایگزینی پیوند قرمز با مترادف فارسی '+enlink+u' > '+falink+u'')
                           wikipedia.output(u'\03{lightgreen}the page '+page.title()+u' had replcae item '+enlink+u' > '+falink+u'\03{default}')
                       except:
                           wikipedia.output(u'\03{lightred}the page '+page.title()+u' could not replaced so it passed\03{default}')
                           continue
               else:
                    wikipedia.output(u'\03{lightred}could not find andy link\03{default}')        
  1. ------------------------------------------------------------ sql part

querys='SELECT /* SLOW_OK */ DISTINCT pl_title,pl_namespace FROM pagelinks INNER JOIN page ON pl_from = page_id WHERE pl_title NOT IN(SELECT page_title FROM page WHERE page_namespace = 0) AND pl_namespace = 0 AND page_namespace = 0;' wikipedia.output(querys) site = wikipedia.getSite(mysite) conn = mysqldb.connect(mysite+"wiki.labsdb", db = site.dbName(),

                      user = config.db_username,
                      passwd = config.db_password)

cursor = conn.cursor() cursor.execute(querys) results = cursor.fetchall()

  1. ------------------------------sql finsh------------------
  2. ++++++++++++++++++++++

our_text=u'\n' for i in results:

   our_text+=switchnamespace(i[1])+unicode(i[0],'UTF-8')+u'\n'

with codecs.open('zzredlinks.txt' ,mode = 'w',encoding = 'utf8' ) as f:

   f.write(our_text)

del f,conn,cursor,our_text

  1. +++++++++++++++++++++++
  1. results=[['Shiraz, Iran',0],['Book',0],['book',0]]

for enlink in results:

   if switchnamespace(enlink[1]):    
       enlink=switchnamespace(enlink[1])+unicode(enlink[0],'UTF-8').strip()
       enlink=enlink.replace(u'_',u' ').strip()
       enlink2=re.sub(u'[ابضصثقفغعهخحجچشسیلتنمکگظطزرذدپو]',ur, enlink)
       if enlink2==enlink:
           count=-1
           for i in u'۰۱۲۳۴۵۶۷۸۹':
               count+=1
               enlink=enlink.replace(i,str(count))
           #if not redirect_find( enlink):
           #   wikipedia.output(u'it was redirect so aborted!')    
           #   continue
           falink=englishdictionry( enlink ,'en',mysite)
           if falink:
               if namespacefinder( enlink ,'en')!=namespacefinder( falink ,'fa'):
                   continue    
               wikipedia.output(u'---------------------------------------------')
               wikipedia.output(enlink+u' > '+falink)
               getlinks(enlink,falink,True,mysite)

del results,enlink

  1. ------------------------------------------------------------ sql part

querys='SELECT /* SLOW_OK */ DISTINCT pl_title,pl_namespace FROM pagelinks INNER JOIN page ON pl_from = page_id WHERE pl_title NOT IN(SELECT page_title FROM page WHERE page_namespace = 0) AND pl_namespace = 0 AND page_namespace = 0;' wikipedia.output(querys) site = wikipedia.getSite(mysite) conn = mysqldb.connect(mysite+"wiki.labsdb", db = site.dbName(),

                      user = config.db_username,
                      passwd = config.db_password)

cursor = conn.cursor() cursor.execute(querys) results = cursor.fetchall()

  1. ------------------------------sql finsh------------------
  2. +++++++++++++++++++++++

our_text=u'\n' for i in results:

   our_text+=switchnamespace(i[1])+unicode(i[0],'UTF-8')+u'\n'

with codecs.open('zzredlinks.txt' ,mode = 'w',encoding = 'utf8' ) as f:

   f.write(our_text)

del f,conn,cursor,our_text

  1. +++++++++++++++++++++++
  1. ---------------------------------for checking articles after while !!-----------------------------------------

for enlink in results:

   if switchnamespace(enlink[1]):
       enlink=switchnamespace(enlink[1])+unicode(enlink[0],'UTF-8').strip()
       enlink=enlink.replace(u'_',u' ').strip()  
       enlink2=re.sub(u'[ابضصثقفغعهخحجچشسیلتنمکگظطزرذدپو]',ur, enlink)
       if enlink2==enlink:
           count=-1
           for i in u'۰۱۲۳۴۵۶۷۸۹':
               count+=1
               enlink=enlink.replace(i,str(count))
           #if not redirect_find( enlink):
           #    continue 
           falink=englishdictionry( enlink ,'en',mysite)
           if falink:
               if namespacefinder( enlink ,'en')!=namespacefinder( falink ,'fa'):
                   continue  
               wikipedia.output(u'---------------------------------------------')
               wikipedia.output(enlink+u' > '+falink)
               getlinks(enlink,falink,False,mysite)