維基百科:機械人/申請/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)[回覆]