CrowleyBot This user is a bot.
(讨论 · 贡献)
操作者:EdwardAlexanderCrowley
设计者:EdwardAlexanderCrowley
是否已批准
机器人权限
任务:处理rhymes模板过时的lang参数
编辑频率:每分钟10笔,视网络情况
自动/手动:全自動
编程语言python
可以緊急停止?直接封禁

受影響頁面

技术细节 编辑

  • wikitextparser可以获取结构化页面信息,然后捕捉所有名称符合r'\s*[Rr]hymes{0,1}\s*'的模板,然后有几种情况:
  1. {{rhymes|word}} -> 按章节标题(使用wikitextparser的ancestors)补足第二项,或不动
  2. {{rhymes|[[word]]|lang=en}}或{{rhymes|lang=en|''[[word]]''}}之类 -> {{rhymes|en|word}}
  3. {{rhymes|en|word}}不动

现暂不考虑用enwikt对应模板补足缺失的lang参数。

输出信息 编辑

  • /success
  • /fail:若为0,表示不含rhymes,否则表示无法处理

代码 编辑

zh = mwc.Site('zh.wiktionary.org', clients_useragent = UA)
en = mwc.Site('en.wiktionary.org', clients_useragent = UA)
zh.login(UN, PWD)
en.login(UN, PWD)
zpgl = list(map(lambda pn: zh.Pages[pn], pnl))
n = len(zpgl)
def getepg(pg):
    try:
        return en.Pages[dict(pg.langlinks())['en']]
    except:
        return None
epgl = list(map(getepg, zpgl))
fail = []
success = []
delinkfail = []  #没用到,届时手工检查
zhl2enl = {'英': 'en', '法': 'fa', '德': 'de', '徳': 'de', '意大利': 'it', '義大利': 'it', '荷兰': 'nl', '荷蘭': 'nl', '馬來西亞': 'ms', '马来西亚': 'ms'}
def purify(s):
    s = s.strip("'")
    if s.find('#') == -1 and s.find('|') == -1:
        s = s.strip('[]')
    return s
def process():
    def g(t): return re.fullmatch(r'\s*[Rr]hymes{0,1}\s*', t.name)
    zpg = zpgl[i]
    if zpg.namespace != 0:
        return
    zast = wtp.parse(zpg.text())
    zts = list(filter(g, zast.templates))
    if len(zts) == 0:
        fail.append((0, i))
        return
    for j, zt in enumerate(zts):
        zts0 = zt.string
        zt.name = 'rhymes'
        args = zt.arguments
        an = len(args)
        if an == 0:
            fail.append((1, i, j, zts0))
            return
        if an >= 3:
            if ag := zt.get_arg("lang"):
                agv = ag.value
                del ag[:]
                zt.arguments[0].insert(0, '|' + agv)
                # 经过测试,rhymes不需要purify,但plural of需要
                zpg.edit(zast.string, '见[[User:CrowleyBot/task/1]], 处理rhymes的lang参数')
                success.append((11, i, j, zts0, zt.string))
                return
            else:
                success.append((12, i, j, zts0))
                return
        if an == 1:
            if args[0].name == 'lang':
                fail.append((2, i, j, zts0))
                return
            else:
                # args[0].value = purify(args[0].value) 在后面一起执行
                al0 = zt.ancestors(type_ = "Section")
                def anf(s):
                    return re.match('[语語]', s.title)
                al1 = list(filter(anf, al0))
                if len(al1) == 0:
                    fail.append((3, i, j, zts0))
                    return
                if len(al1) == 2:
                    fail.append((4, i, j, zts0, list(map(lambda x: x.title.strip(), al0))))
                    return
                if True:
                    tt = al1[0].title.strip()[:-1]
                    try:
                        zt.set_arg('lang', zhl2enl[tt])
                        # 会append两次
                        success.append((8, i, j, zts0, zt.string))
                    except KeyError:
                        print('输入%s的语言代码:' % tt)
                        enl = input()
                        if enl:
                            zhl2enl[tt] = enl
                            zt.set_arg('lang', enl)
                            # 会append两次
                            success.append((9, i, j, zts0, zt.string))
                        else:
                            fail.append((5, i, j, zts0, list(map(lambda x: x.title.strip(), al0))))
                            return
        if True:
            if args[1].name == 'lang':
                a0, a1 = args[0], args[1]
                # 没办法,这个库不行
                a0.name, a0.value, a0.positional, a1.name, a1.value, a1.positional = a1.name, a1.value, a1.positional, a0.name, a0.value, a0.positional
            if args[0].name == 'lang':
                args[0].positional = True
            args[1].value = purify(args[1].value)
            success.append((10, i, j, zts0, zt.string))
    zpg.edit(zast.string, '见[[User:CrowleyBot/task/1]], 处理rhymes的lang参数')
    # time.sleep(1) 这个脚本很慢

for i in range(n):
    process()