维基百科:机器人/申请/MilkyDeferBot

维基百科,自由的百科全书

MilkyDeferBot

  • 狀態 已批准
  • 操作者:Milky·Defer
  • 提請時間:2022年2月2日 (三) 12:55 (UTC)
  • 自動化程度:全自动
  • 程式語言Rust
  • 用途:根据分类、模版嵌入、页面链入链出、页面前缀等条件筛选并创建页面列表
  • 原始碼連結:GitHub
  • 編輯時段及頻率:可调节(见下方「工作机制」)
  • 受影響頁面:不定(见下方「工作机制」)
  • 遵守機器人規範无关
  • 已有機器人權限:

用户故事:长期以来,电子游戏维基专题使用一个「最近更改」页面来追踪电子游戏相关条目的最近更改,有助于巡查破坏等。这个页面的背后依赖于一个记录了所有电子游戏条目的专题页面:WikiProject:电子游戏/条目列表。这个列表的更新长期以来一直由User:Lopullinen负责,他的工作流程是前往Quarry进行查询,然后使用Excel筛选出位于条目名字空间的页面,再手动将内容粘贴上去[来源]。去年下半年,Lopullinen的大部分时间忙于现实生活,无力及时更新列表,大致一个月才有时间更新一次,导致一个月内创建的新条目(以及被移动的既有条目)无法得到及时跟踪。此外,专题的优良、典范、特表清单也是由他负责进行手动更新。最近他终于用上了PAWS进行半自动的更新,但是他仍然希望有机器人可以做到全自动更新。

因此我考虑写了这个功能比较简单的机器人,可以依照不同的条件按照不同的输出格式生成页面列表。页面列表对最近更改巡查、各个专题的更新、维基百科本身的维护有益。最近更改巡查的两个页面列表都有大半年没更新了,估计也没有几个人知道。

类似技术与分析:目前存在一些功能相近的解决方案。其中之一是DynamicPageList扩展,这个扩展只能以分类作为生成依据,但是它是置于MediaWiki内运行的扩展,而非外部工具。DPL的更新是即时的,也在俄语维基新闻大批量导入页面的时候,搞垮了整个服务器集群造成网站大面积下线。DPL不适合在中文维基百科使用,实际上中文维基百科没有安装这个扩展,phab也不允许安装这个扩展。另一个功能相近的方案是Quarry,也就是Lopullinen曾经在用的方案,这是一个外部工具,直接对数据库执行SQL查询,因此具有很强的灵活性(比我写的这个机器人要强),但是要求使用者有SQL基础,且非自动任务,生成的结果需要人工的后续处理才能放入站内页面中。PetScan也是一样,其功能也很强大(甚至包括了图片使用、维基数据),但同样也不是自动任务,也需要后续的人工处理。英文维基百科有JL-Bot为各个专题列出当专题的优秀条目列表,可以佐证类似需求和技术实现是现实的。

工作机制:机器人所执行的工作按照「任务」(Task)来组织。Task定义了一项查询的表达式、查询超时、查询限额、查询频率、输出页面与格式。因此机器人会影响到的页面仅仅由Task数量以及每个Task定义的输出页面数量决定。机器人工作并非即时也并非连续,工作频率由Task决定。每个Task处于JSON页面内受到MediaWiki界面保护,可防止破坏与滥用(我不登入机器人账号我自己都没法用我主号控制机器人运作)。此外,机器人仅根据页面的上述元数据属性进行查询,不过问页面内的实际内容,因此也不存在大量下载页面内容的疑虑。

安全性:考虑到DPL的前车之鉴,待申请的机器人的运作十分保守。所有的作业都规定了最大超时时间(默认120秒,可对单个Task覆盖默认值),以及最大查询限额(默认单次API查询限额50000条,可对单个任务以及单个查询覆盖默认值)。这也是PetScan存在的安全限制(PetScan网页默认限制一万条结果)。超出查询时间会导致查询即时终止,超出查询限额则会导致查询结果不全。为了防止滥用,机器人还有特殊的限制:如果被指定的输出页面位于机器人配置中的「禁止命名空间」中,则机器人不会向目标页面写入内容(当前包括条目空间,可配置加入使用者讨论空间)、如果被指定的页面不存在,则机器人不会创建目标页面、如果被指定的页面是重定向页面,则机器人不会写入内容。上述机制尽可能保障机器人不会让服务器过载,以及尽可能防止他人利用机器人进行骚扰和破坏。

小规模测试:机器人方针容许在使用者个人页面中进行测试,因此我提前利用它进行了三个不同的查询。User:MilkyDefer/plbot test/vglist执行了用户故事中Lopullinen想要做的事情;User:MilkyDefer/plbot test/vgexpand列出了电子游戏条目中挂有空章节或需要扩充模版的页面;User:MilkyDefer/plbot test/vgimportant则列出了当前优良条目、典范条目、特色列表中被挂上维护模版以至于被列入「拒绝当选新条目首页展示」分类的条目,这几个条目应该要被拉出来重审。其他的一次性工作例子则包括列出WP:GA、WP:FA、WP:FL页面中的重定向页面User:Ericliu1912修正等。

请求机器人运作许可:限于机器人方针限制,没有获批的机器人只能在测试页面和自己的用户页内进行测试,因此无法在其他页面内运作。此外,申请机器人权限可以获得API高请求限额,因此一次查询可以返回更多结果,减少API访问次数降低服务器负载,也可以减少由于等待数据传输而导致的可能超时问题。我已经熟读API使用礼仪,尊重Maxlag参数,页面写入由互斥锁控制,不存在同时写入大量页面问题。此外,申请机器人运作可以让我有机会在Toolforge上运作该机器人,届时会考虑接入SQL查询以获得更好的体验,不过我看不懂Toolforge的申请流程

以上,希望各位不吝赐教。 --Milky·Defer 2022年2月2日 (三) 12:55 (UTC)[回复]

根據專題品質評級標準,本機器人申請已評為典範級。--Xiplus#Talk 2022年2月2日 (三) 13:33 (UTC)[回复]
所以想要建立新的列表,是直接向您申請嗎?管理員也有權力直接建立新的列表?--Xiplus#Talk 2022年2月2日 (三) 13:35 (UTC)[回复]
是这样的,管理员是受信任的使用者,而普通用户提出申请也能有一层人工审核,感觉比较安全。 --Milky·Defer 2022年2月2日 (三) 14:43 (UTC)[回复]
(+)支持。—— Eric Liu 創造は生命(留言留名學生會 2022年2月20日 (日) 09:03 (UTC)[回复]
批准測試運作(30日)。--Xiplus#Talk 2022年2月26日 (六) 15:00 (UTC)[回复]
了解,稍后我去申请Wikitech和ToolForge,等申请通过后开始测试。--Milky·Defer 2022年2月27日 (日) 05:40 (UTC)[回复]

现在30日测试已经接近结束,这里报告一下情况。机器人所进行的所有工作都列在了User:MilkyDeferBot/pagelistbot/tasks当中。其中大部分都跟分类集合的交并补相关,但是也有利用其它机器人所列出的列表进行进一步处理的例子,这个例子展示了该机器人潜在的与其他机器人配合工作的能力。

在机器人运作的期间它没有发癫,也没有因编码不良而发生运行时错误的情况。接下来的重点改进放在完成将机器人定时运作机制从指定间隔时间改为指定cron上,以及完成多使用一些惰性加载的模式来稍微改善点性能。我希望能够趁着清明假期完成。 --MilkyDefer 2022年4月1日 (五) 13:11 (UTC)[回复]

Special:Diff/71396510,失敗的話不更新頁面會比較好?--Xiplus#Talk 2022年5月2日 (一) 14:08 (UTC)[回复]
@Xiplus我设计这个机制的本意是如果有人不小心写错了表达式的话能得到反馈知道自己做错了。不然的话迟迟不更新页面也不知道发生什么事了,就真的除了我跑去toolforge后台查看日志之外别无他法了。--MilkyDefer 2022年5月2日 (一) 14:11 (UTC)[回复]
可以顯示錯誤訊息,但不移除下面的列表?--Xiplus#Talk 2022年5月2日 (一) 14:16 (UTC)[回复]
听上去可行,这几天实现试试。P.S. 我发现因为密钥的问题我上不去Toolforge了(囧)--MilkyDefer 2022年5月2日 (一) 14:23 (UTC)[回复]
从后台导出检阅了一下日志,是网络连接突然中断的事故(Broken pipe os error 32)。--MilkyDefer 2022年5月2日 (一) 14:50 (UTC)[回复]
@Xiplus:给机器人添加了一个“eager mode”机制——只有当任务被指定为“eager mode: true”时,不论结果如何都会更新全部内容(与之前行为一致);默认为false,此时若查询不成功则只会更新状态模板,不会碰页面的其他部分。这里展示一次运作实例:我在做出这笔更新后,机器人仅更新了模板部分(该任务每个整点启动,下次更新会在东八区晚上九点,此时应会恢复正常运作)。另外,我终于搞清楚为什么我用tmux在Toolforge那边挂着机器人每三四天就会自动被杀死了,原来是我搞错了用法——已经改为提交至Grid Engine运作。 --MilkyDefer 2022年5月4日 (三) 12:08 (UTC)[回复]
 正式批准運作。--Xiplus#Talk 2022年5月8日 (日) 14:25 (UTC)[回复]
@Xiplus:请问接下来,机器人的botflag是……会怎么样呢?--MilkyDefer 2022年5月8日 (日) 14:56 (UTC)[回复]
找個行政員來授權吧。--Xiplus#Talk 2022年5月8日 (日) 15:26 (UTC)[回复]
完成。—AT 2022年5月8日 (日) 16:12 (UTC)[回复]