這個指南會簡單介紹一下如何使用 Node.js 創建一個維護 wiki 的自動程序/機器人(bot),它可用於在 wiki 上面進行大量編輯或者刪除等維護操作。使用它的好處在於,只要您編寫過前端 JS 腳本,使用 Node.js 一定也不會感到陌生。(學習成本較低)
注意:閱讀以下內容,我們假定您擁有 JavaScript 和命令行的基本知識。欲學習 JavaScript,請前往 MDN Web Docs等其他站點。
和 Python 非常類似,JavaScript 也是一個腳本語言。您的程序是運行在 Node 容器中的基於 Google V8 引擎的 JavaScript 代碼,您需要安裝 Node.js 軟體來解釋並執行您的代碼。
Node.js 最引以為傲且最為方便的地方在於它擁有強大且完善的包管理程序——Node Package Manager(npm),使用 npm 您可以輕鬆地為項目添加依賴項和工具庫。
這裡我們推薦幾個比較好用的包,兩者對登錄和 API 操作的封裝大同小異,均兼容 萌娘百科 現有的 MediaWiki 版本,他們之間的區別無非在於回調風格之類。您可以根據自己的代碼偏好進行選擇。
error)Promise,可以使用.then().catch()或者async await方法Promise,值得一提的是它使用 TypeScript 編寫,這意味著基於它開發您的 bot 時,在現代 IDE 中可以獲得直觀的代碼提示Promise。由U:機智的小魚君開發,實現了與原版 new mw.Api() 非常相似的 api 請求封裝。同時適用於 Browser & Node.js 環境,在萌娘百科官方活動H5中有實際使用案例。另外也可以使用基礎的request庫進行編輯,可以見mediawiki上對應文檔。
注意:為了方便講解,以下內容將以wiki-saikou包為例。
簡單概括:在您喜歡的地方新建文件夾、初始化工程、安裝依賴、新建入口文件。
# 新建文件夾 mkdir my-bot cd my-bot # 初始化工程 npm init # 安裝依賴 npm install wiki-saikou # 新建入口文件 touch index.js
您的文件夾結構大概是這樣的:
my-bot ├── index.js ├── node_modules/* └── package.json
您的 bot 的入口文件就是 index.js。[1]
讓我們按照包的文檔來初始化 bot 實例,並登錄您的 bot,之後我們再用它編輯替換Help:沙盒頁面中的內容。
// 文件:index.js
// 導入依賴
const { MediaWikiApi } = require('wiki-saikou')
// 初始化實例
const bot = new MediaWikiApi('https://zh.moegirl.tw/api.php')
// 登錄賬號
bot
.login('bot賬號', 'bot密碼') // 在“創建您的 bot 賬號”步驟中最後一步您得到的賬號與密碼信息
// 我們用 then 方法等待登錄的成功回調
.then(() => {
// 編輯頁面,並返回操作結果
return bot.postWithToken('csrf', {
action: 'edit',
title: 'Help:沙盒',
text: '你好,世界',
summary: '使用我的第一個 Node.js bot 編輯',
bot: true, // 別忘了標記本次編輯為機器人編輯
tags: 'Bot' // 別忘了添加合適的標籤
})
})
// 打印編輯操作的結果
.then(console.log, console.error)
如果沒有任何報錯,並且控制檯列印了 edit API 的返回結果,那麼打開Help:沙盒頁面確認一下吧。
完成了,您編寫了您的第一個 Node.js 自動程序!
不過,在實際運行的自動程序進行編輯操作時,我們往往會考慮更多因素,例如傳入 basetimestamp 參數來避免編輯衝突等等。
在上一個章節,我們使用明文傳遞了 bot 的帳號和密碼,這顯然存在一定安全隱患。
使用環境變量傳遞帳號密碼是一種比較優雅的解決方案,例如:
# Linux
MW_BOT_USERNAME="用戶名" MW_BOT_PASSWORD="密碼" node .
# Powershell
$env:MW_BOT_USERNAME="用戶名"; $env:MW_BOT_PASSWORD="密碼"; node .
然後,在你的 index.js 中:
// 在頭部導入環境變量
const { env } = require('node:process')
// 中間省略...
// ↓ 使用環境變量
bot.login(env.MW_BOT_USERNAME, env.MW_BOT_PASSWORD)
如此一來,就不需要擔心帳號密碼會在原始碼中洩露了。
當然,如果你厭倦了每次運行都輸入帳號密碼,可以使用諸如 dotenv 等庫持久化保存環境變量,具體可以參考相關文檔,或閱讀下文提到的示例代碼倉庫,看看示例是如何進行相關配置的。
大多數包的作者都留下了詳細的接口文檔,它們中的大多數保持了與原生 MediaWiki API 相似的命名風格,只要您編寫過前端 JS 腳本,使用 Node.js 一定也不會感到陌生。
您還可以繼續瀏覽與本說明配套的其他示例代碼,來學習諸如批量替換、批量刪除一類的高級操作:https://github.com/Dragon-Fish/mw-bot-samples-node
仍有其他問題?歡迎加入我們的技術討論QQ群,在群組內進行討論!
接下來的精彩操作,就交給你來演繹吧!
| |||||||||||||||||||||||||||||||||||