protect.py

from pywikibot import Site, User, Page
from datetime import timedelta

# Init variables
site = Site()
tags = ['mw-undo', 'mw-rollback', 'mw-manual-revert']

# Trả về danh sách các trang cần khóa: { title, revertEditNum, protection }
# Là các trang có ít nhất 2 sửa đổi lùi trong 10 ngày gần nhất
# Không tính các sửa đổi lùi lại chính mình
# Không tính sửa đổi mà ngay trước là 1 sửa đổi lùi khác?
def getPagesNeedToProtect():
    end_time = site.server_time() - timedelta(hours = 24, minutes = 0)
    feed = site.recentchanges(end = end_time, bot = False, namespaces = [0, 1])
    
    # 1. Lấy danh sách các tên trang của sửa đổi lùi
    titles = []
    for edit in feed:
        if any(x in tags for x in edit['tags']):
            titles.append(edit['title'])
    uniqueTitles = set(titles)
    
    # 2. Duyệt qua danh sách tên trang
    result = []
    for title in uniqueTitles:
        page = Page(site, title)
        revertEditNum = 0
        for rev in page.revisions(endtime = site.server_time() - timedelta(days = 10)):
            if any(x in tags for x in rev['tags']):
                # Không xét các sửa đổi lùi lại sửa đổi của mình ngay trước đó
                parentRev = page._revisions.get(rev['parentid'])
                if parentRev and rev['user'] != parentRev.user:
                    revertEditNum += 1
        if revertEditNum >= 2:
            result.append({ 'title': title, 'revertEditNum': revertEditNum, 'protection': page.protection() })
            
        print('.', end = '', flush = True)
            
    result.sort(key = lambda p: p['revertEditNum'], reverse = True)
    return result

def report():
    reportPage = Page(site, 'Thành viên:Plantaest/Nháp 25')
    pages = getPagesNeedToProtect()
    text = ''
    
    for page in pages:
        if 'edit' in page['protection']:
            text += '# {{Pagelinks|%s}} / Revert edits: %s / {{Tình trạng khóa|%s}}\n' % (page['title'], page['revertEditNum'], page['title'])
        else:
            text += '# \'\'\'{{Pagelinks|%s}}\'\'\' / Revert edits: %s\n' % (page['title'], page['revertEditNum'])
    
    reportPage.text = text
    reportPage.save(summary = 'Trang cần khóa.', minor = True)
    
report()