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

از ویکی‌پدیا، دانشنامهٔ آزاد
#!/usr/bin/python
# -*- coding: utf-8  -*-
#
# Reza(User:reza1615), 2017
# Saeid (User:Saeidpourbabak), 2017
#
# Distributed under the terms of MIT License (MIT)

import wikipedia,re,query
import MySQLdb as mysqldb
import config
from operator import itemgetter
wikipedia.config.put_throttle = 0
wikipedia.put_throttle.setDelay()
def numbertopersian(a):
    a = str(a)
    a = a.replace(u'0', u'۰')
    a = a.replace(u'1', u'۱')
    a = a.replace(u'2', u'۲')
    a = a.replace(u'3', u'۳')
    a = a.replace(u'4', u'۴')
    a = a.replace(u'5', u'۵')
    a = a.replace(u'6', u'۶')
    a = a.replace(u'7', u'۷')
    a = a.replace(u'8', u'۸')
    a = a.replace(u'9', u'۹')
    a = a.replace(u'.', u'٫')
    return a

def check_user(username):
    username=username.replace(u' ',u'_')
    params = {
        'action': 'query',
        'list': 'users',
        'ususers': username,
        'usprop':'editcount'    
    }
    try:
        usernamequery = query.GetData(params,wikipedia.getSite('fa'))
        if usernamequery[u'query'][u'users'][0][u'editcount']>100:
            return True
        else:
            return False
    except:
        return False

def get_query(query):
    # sql part
    site = wikipedia.getSite('fa')
    conn = mysqldb.connect("fawiki.labsdb", db = site.dbName(),
                           user = config.db_username,
                           passwd = config.db_password)
    cursor = conn.cursor()

    wikipedia.output(u'Executing query:\n%s' % query)
    query = query.encode(site.encoding())
    cursor.execute(query)
    my_list=cursor.fetchall()
    return my_list

#List_days_ago=[u'NOW() - INTERVAL 1 YEAR <rev_timestamp',u'NOW() - INTERVAL 9 MONTH <rev_timestamp',u'NOW() - INTERVAL 6 MONTH <rev_timestamp',u'NOW() - INTERVAL 3 MONTH <rev_timestamp',u'NOW() - INTERVAL 1 MONTH <rev_timestamp',u'NOW() - INTERVAL 1 DAY <rev_timestamp']
List_days_ago=[u'NOW() - INTERVAL 1 DAY <rev_timestamp']

for days_ago in List_days_ago:
    # تعداد مقالات گشت خورده
    query_patroled_pages=u'''SELECT distinct log_title
    FROM actor JOIN logging ON log_actor = actor_id LEFT JOIN user_groups ON log_actor = ug_user AND ug_group = 'bot'
    WHERE log_type ='patrol'
    AND log_action='patrol'
    AND (
      log_params LIKE '%auto";i:0;}'
      OR log_params LIKE '%0'
      )
    AND log_title IN (
      SELECT page_title
      FROM page
      WHERE page_namespace = 0
    )
    AND ug_group IS NULL
    AND '''+days_ago+u'''
    GROUP BY log_title;'''
    query_patroled_pages=query_patroled_pages.replace(u'rev_timestamp',u'log_timestamp')
    my_list_patroled_pages =get_query(query_patroled_pages)


    # کل ویرایش انجام شده
    query_num_edit=u'''SELECT page_title
    FROM revision JOIN page ON rev_page=page_id
    JOIN actor ON rev_actor = actor_id
    WHERE actor_name NOT LIKE 'پیام_به_کاربر_جدید'
    AND actor_name NOT LIKE 'FawikiPatroller'
    AND page_namespace = 0

    AND actor_user NOT IN (
      SELECT ug_user
      FROM user_groups
      WHERE (
        ug_group = 'bot'
      )
    )
    AND '''+days_ago+u'''
    ORDER BY page_title;'''
    my_list_num_edit =get_query(query_num_edit)

    #کل مقالات ویرایش شده
    query_pages_edited=u'''SELECT DISTINCT page_title
    FROM revision JOIN page ON rev_page=page_id
    JOIN actor ON rev_actor = actor_id
    WHERE actor_name NOT LIKE 'پیام_به_کاربر_جدید'
    AND actor_name NOT LIKE 'FawikiPatroller'
    AND page_namespace = 0

    AND actor_user NOT IN (
      SELECT ug_user
      FROM user_groups
      WHERE (
        ug_group = 'bot'
      )
    )
    AND '''+days_ago+u'''
    ORDER BY page_title;'''
    my_list_pages_edited =get_query(query_pages_edited)

    # کل ویرایش کاربر تایید نشده
    query_none_autopatrolled_edited=u'''SELECT page_title
    FROM revision JOIN page ON rev_page=page_id
    JOIN actor ON rev_actor = actor_id
    WHERE actor_name NOT LIKE 'پیام_به_کاربر_جدید'
    AND actor_name NOT LIKE 'FawikiPatroller'
    AND page_namespace = 0

    AND actor_user NOT IN (
      SELECT ug_user
      FROM user_groups
      WHERE (
        ug_group = 'autopatrolled'
        OR ug_group = 'bureaucrat'
        OR ug_group = 'sysop'
        OR ug_group = 'bot'
        OR ug_group = 'eliminator'
        OR ug_group = 'patroller'
        OR ug_group = 'botadmin'
      )
    )
    AND '''+days_ago+u'''

    ORDER BY page_title;'''
    my_list_none_autopatrolled_edited =get_query(query_none_autopatrolled_edited)

    #کل مقالات کاربر تایید نشده
    query_none_autopatrolled_pages_edited=u'''SELECT DISTINCT page_title
    FROM revision JOIN page ON rev_page=page_id
    JOIN actor ON rev_actor = actor_id
    WHERE actor_name NOT LIKE 'پیام_به_کاربر_جدید'
    AND actor_name NOT LIKE 'FawikiPatroller'
    AND page_namespace = 0

    AND actor_user NOT IN (
      SELECT ug_user
      FROM user_groups
      WHERE (
        ug_group = 'autopatrolled'
        OR ug_group = 'bureaucrat'
        OR ug_group = 'sysop'
        OR ug_group = 'bot'
        OR ug_group = 'eliminator'
        OR ug_group = 'patroller'
        OR ug_group = 'botadmin'
      )
    )
    AND '''+days_ago+u'''

    ORDER BY page_title;'''
    my_list_none_autopatrolled_pages_edited =get_query(query_none_autopatrolled_pages_edited)

    # تعداد گشت‌زنی بر پایهٔ کاربر
    query_patroled_edits=u'''SELECT actor_name, COUNT(log_id) cnt
    FROM actor JOIN logging ON log_actor = actor_id LEFT JOIN user_groups ON log_actor = ug_user AND ug_group = 'bot'
    WHERE log_type ='patrol'
    AND log_action='patrol'
    AND (
      log_params LIKE '%auto";i:0;}'
      OR log_params LIKE '%0'
      )
    AND log_title IN (
      SELECT page_title
      FROM page
      WHERE page_namespace = 0
    )
    AND ug_group IS NULL
    AND '''+days_ago+u'''
    GROUP BY actor_name
    ORDER BY cnt DESC;'''
    query_patroled_edits=query_patroled_edits.replace(u'rev_timestamp',u'log_timestamp')
    my_list_patroled_edits =get_query(query_patroled_edits)
    
    #ویرایش واگردانی‌شده بر پایه کاربر
    #  OR rev_comment LIKE '%_به_آخرین_تغییری_که_%'
    query_reverted_edited_by_user=u'''
    SELECT actor_name, COUNT(comment_text) cnt
    FROM revision JOIN page join comment  ON rev_page=page_id and rev_comment_id=comment_id
    JOIN actor ON rev_actor = actor_id
    WHERE page_namespace = 0
    AND (
          comment_text LIKE '%خنثی‌سازی_ویرایش%توسط%'
          OR comment_text LIKE '%ویرایش%به_وسیلهٔ_[[ویکی‌پدیا:تفاوت_سریع|تفاوت_سریع]]_خنثی_شد.%'

          OR comment_text LIKE '%آخرین_تغییر_متن_رد_شد%و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%تغییر_آخر_متن_رد_شد%و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%آخرین%تغییر_متن_رد_شد_و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%_به_آخرین_تغییری_که_%'
          OR comment_text LIKE '%خنثی‌سازی%وپ:توینکل%'
          OR comment_text LIKE '%خنثی‌سازی%وپ:تل%'
          OR comment_text LIKE '%برگردانده%وپ:توینکل%'
          OR comment_text LIKE '%برگردانده%وپ:تل%'
          OR comment_text LIKE '%به_نسخهٔ%ویرایش%واگردانده_شد%وپ:توینکل%'
          OR comment_text LIKE '%به_نسخهٔ%ویرایش%واگردانده_شد%وپ:تل%'
          OR comment_text LIKE '%با_فرض_حسن_نیت%ویرایش%'
          OR comment_text LIKE '%ویرایش‌های%با_فرض_حسن_نیت%خنثی‌سازی_شد%'
          OR comment_text LIKE '%ویرایش%بحث%خنثی‌سازی_شد:%'
          OR comment_text LIKE '%ویرایش%بحث%واگردانی_شد%'
          OR comment_text LIKE '%ویرایش‌های%با_فرض_حسن_نیت%واگردانده_شد%'
          OR comment_text LIKE '%واگردانی_به_نسخهٔ%وپ:توینکل%'
          OR comment_text LIKE '%واگردانی%ویرایش%وپ:توینکل%'
          OR comment_text LIKE '%تغییرات%به_نسخهٔ%واگردانده_شد%'
          OR comment_text LIKE '%واگردانی_به_نسخهٔ%تاریخ%توسط%'

          OR comment_text LIKE '%واگردانی_ویرایش‌های%وپ:هاگ%'
          OR comment_text LIKE '%برگرداندن_ویرایش‌های%وپ:هاگ%'


          OR comment_text LIKE 'ویرایش%به_آخرین_تغییری_که%انجام_داده_بود%'
          OR comment_text LIKE '%خرابکاری%خنثی‌سازی%وپ:توینکل%'
          OR comment_text LIKE '%خرابکاری%خنثی‌سازی%وپ:تل%'
          OR comment_text LIKE '%خنثی‌سازی%به_آخرین_نسخهٔ%وپ:توینکل%'
          OR comment_text LIKE '%خنثی‌سازی%به_آخرین_نسخهٔ%وپ:تل%'
          OR comment_text LIKE '%ویرایش%خرابکارانهٔ%به_آخرین_ویرایش%'
          OR comment_text LIKE '%ویرایش%خرابکارانهٔ%بحث%واگردانی_شد%'
          OR comment_text LIKE '%خرابکاری%به_نسخهٔ%واگردانده_شد.%'
    )
    AND NOW() - INTERVAL 1 DAY <rev_timestamp group by actor_name ORDER BY cnt DESC;'''
    my_list_reverted_edited_by_user =get_query(query_reverted_edited_by_user)
    
    # ویرایش واگردانی شده
    #OR comment_text LIKE '%_به_آخرین_تغییری_که_%'
    query_reverted_edited=u'''SELECT page_title,comment_text
    FROM revision JOIN page join comment ON rev_page=page_id and rev_comment_id=comment_id
    WHERE page_namespace = 0
    AND (
          comment_text LIKE '%خنثی‌سازی_ویرایش%توسط%'
          OR comment_text LIKE '%ویرایش%به_وسیلهٔ_[[ویکی‌پدیا:تفاوت_سریع|تفاوت_سریع]]_خنثی_شد.%'

          OR comment_text LIKE '%آخرین_تغییر_متن_رد_شد%و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%تغییر_آخر_متن_رد_شد%و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%آخرین%تغییر_متن_رد_شد_و_برگردانده_شد_به_نسخهٔ%'
          OR comment_text LIKE '%_به_آخرین_تغییری_که_%'
          OR comment_text LIKE '%خنثی‌سازی%وپ:توینکل%'
          OR comment_text LIKE '%خنثی‌سازی%وپ:تل%'
          OR comment_text LIKE '%برگردانده%وپ:توینکل%'
          OR comment_text LIKE '%برگردانده%وپ:تل%'
          OR comment_text LIKE '%به_نسخهٔ%ویرایش%واگردانده_شد%وپ:توینکل%'
          OR comment_text LIKE '%به_نسخهٔ%ویرایش%واگردانده_شد%وپ:تل%'
          OR comment_text LIKE '%با_فرض_حسن_نیت%ویرایش%'
          OR comment_text LIKE '%ویرایش‌های%با_فرض_حسن_نیت%خنثی‌سازی_شد%'
          OR comment_text LIKE '%ویرایش%بحث%خنثی‌سازی_شد:%'
          OR comment_text LIKE '%ویرایش%بحث%واگردانی_شد%'
          OR comment_text LIKE '%ویرایش‌های%با_فرض_حسن_نیت%واگردانده_شد%'
          OR comment_text LIKE '%واگردانی_به_نسخهٔ%وپ:توینکل%'
          OR comment_text LIKE '%واگردانی%ویرایش%وپ:توینکل%'
          OR comment_text LIKE '%تغییرات%به_نسخهٔ%واگردانده_شد%'
          OR comment_text LIKE '%واگردانی_به_نسخهٔ%تاریخ%توسط%'
          
          OR comment_text LIKE '%واگردانی_ویرایش‌های%وپ:هاگ%'
          OR comment_text LIKE '%برگرداندن_ویرایش‌های%وپ:هاگ%'
          

          OR comment_text LIKE 'ویرایش%به_آخرین_تغییری_که%انجام_داده_بود%'
          OR comment_text LIKE '%خرابکاری%خنثی‌سازی%وپ:توینکل%'
          OR comment_text LIKE '%خرابکاری%خنثی‌سازی%وپ:تل%'
          OR comment_text LIKE '%خنثی‌سازی%به_آخرین_نسخهٔ%وپ:توینکل%'
          OR comment_text LIKE '%خنثی‌سازی%به_آخرین_نسخهٔ%وپ:تل%'
          OR comment_text LIKE '%ویرایش%خرابکارانهٔ%به_آخرین_ویرایش%'
          OR comment_text LIKE '%ویرایش%خرابکارانهٔ%بحث%واگردانی_شد%'
          OR comment_text LIKE '%خرابکاری%به_نسخهٔ%واگردانده_شد.%'
    )
    AND '''+days_ago+u''';'''
    my_list_reverted_edited =get_query(query_reverted_edited)
    
    patroler_users_dict={}
    for a , b in my_list_patroled_edits:
        if a:
             patroler_users_dict[unicode(a,'UTF-8')]=int(b)
    b=0
    for a,b in my_list_reverted_edited_by_user:
        if a:
            a=unicode(a,'UTF-8').replace(u'_',u' ')
            if a in patroler_users_dict:
                #wikipedia.output(patroler_users_dict[a])
                #wikipedia.output(a+u'   >   '+str(b))
                patroler_users_dict[a]=patroler_users_dict[a]+int(b)
                #wikipedia.output(a+u'   >   '+str(patroler_users_dict[a]))
            else:
                patroler_users_dict[a]=int(b)
    patroler_users_dict_list=sorted(patroler_users_dict.items(), key=itemgetter(1), reverse=True)

    #wikipedia.output(u'---------------------')
    #wikipedia.output(patroler_users_dict_list)
    savetext = u"{{سردر تغییرات اخیر/گشت‌زن‌ها"
    count=0
    patrol_actor_numbers=0
    for a in patroler_users_dict_list:
        b=a[1]
        a=a[0]
        if re.sub(ur'[a-zA-Zصثقفغعهخحجچشسیبلاتنمکگظطزرذدپوطكژ]+','',a)!=a:#نام آی‌پی در فهرست نیاید
            count+=1
            if count<11:
                try:
                    savetext = savetext + u"|" + a + u"|" + numbertopersian(b)
                except:
                    savetext = savetext + u"|" + unicode(a,'UTF-8') + u"|" + numbertopersian(b)
        patrol_actor_numbers+=b
    #wikipedia.output(savetext+u'}}')

    reverted_users=[]
    num_actor_not_ok=0
    reverted_article_list=[]
    for article,comment in my_list_reverted_edited:
        try:
            try:
                comment=unicode(comment,'UTF-8').replace(u'_',u' ')
            except:
                comment=comment.replace(u'_',u' ')
            user_n=u''
            if u'[[Special:Contributions/' in comment:
                user_n=comment.split(u'[[Special:Contributions/')[1].split(u'|')[0].strip()
            if not user_n:
                if u'[[ویژه:مشارکت‌ها/' in comment:
                    user_n=comment.split(u'[[ویژه:مشارکت‌ها/')[1].split(u'|')[0].strip()
            if user_n:
                if re.sub(ur'[a-zA-Zصثقفغعهخحجچشسیبلاتنمکگظطزرذدپوطكژ]+','',user_n)!=user_n:
                    user_n=ur'IP'
                if not user_n in reverted_users:
                    if user_n==ur'IP':
                        num_actor_not_ok+=1
                    else:
                        if not check_user(user_n):
                            num_actor_not_ok+=1
                    reverted_users.append(user_n)
        except:
            continue
        if not article in my_list_patroled_pages:
            reverted_article_list.append(article)
    for article in my_list_patroled_pages:
        if not article[0] in reverted_article_list:
            reverted_article_list.append(article[0])
    reverted_article_list = list(set(reverted_article_list))
    arti=u'\n'
    #print str(reverted_article_list)
    for i in reverted_article_list:
        arti+=u'#'+unicode(i,'UTF-8')+u'\n'
    to_save={
    u'تعداد نسخه ویرایش‌شده ':numbertopersian(len(my_list_num_edit)),
    u'تعداد مقاله ویرایش‌شده':numbertopersian(len(my_list_pages_edited)),#this
    u'تعداد نسخه توسط تاییدنشده ':numbertopersian(len(my_list_none_autopatrolled_edited)),
    u'تعداد مقاله توسط تائیدنشده ':numbertopersian(len(my_list_none_autopatrolled_pages_edited)),
    u'تعداد مقاله گشت‌خورده ':numbertopersian(len(arti.split(u'\n'))-1),
    u'تعداد نسخه‌های آسیب‌زننده ':numbertopersian(len(my_list_reverted_edited)),
    u"تعداد نسخه گشت‌خورده":numbertopersian(patrol_actor_numbers),
    u"تعداد کاربران گشت‌زن":numbertopersian(len(patroler_users_dict)),
    u"تعداد کل کاربر آسیب‌زننده":numbertopersian(len(reverted_users)),
    u"تعداد کاربر تایید نشده آسیب‌زننده":numbertopersian(num_actor_not_ok),
    u'فهرست مقاله گشت‌خورده ':arti.strip(),
    u"فهرست_گشت‌زن‌ها":savetext+u"}}"
    }
    for fapage_title in to_save:
        fapage = wikipedia.Page(wikipedia.getSite('fa'),u"الگو:نمایش وضعیت/آمار/"+fapage_title)
        fapage.put(to_save[fapage_title],u"ربات به‌روزرسانی آمار گشت‌زن‌ها ")#+days_ago.split(u'-')[1].split(u'<')[0].strip())