幫助:使用Node.js編輯
這個指南會簡單介紹一下如何使用 Node.js 創建一個維護 wiki 的自動程序/機器人(bot),它可用於在 wiki 上面進行大量編輯或者刪除等維護操作。使用它的好處在於,只要您編寫過前端 JS 腳本,使用 Node.js 一定也不會感到陌生。(學習成本較低)
注意:閱讀以下內容,我們假定您擁有 JavaScript 和命令行的基本知識。欲學習 JavaScript,請前往 MDN Web Docs等其他站點。
配置 Node.js
和 Python 非常類似,JavaScript 也是一個腳本語言。您的程序是運行在 Node 容器中的基於 Google V8 引擎的 JavaScript 代碼,您需要安裝 Node.js 軟件來解釋並執行您的代碼。
- 您可以在這裡找到與您設備相匹配的安裝方法:https://nodejs.org/zh-cn/download/
- 更多詳細內容,可以參見文檔:https://nodejs.org/zh-cn/docs/
創建您的 bot 賬號
- 一般來說,我們不希望使用自己的主要賬號運行自動程序,這不僅不合理,而且難以維護和監管,因此我們建議您另外註冊一個賬號作為 bot 賬號。
- 然後,您還可以為您的 bot 賬號申請一個 bot 用戶組,明確表示這是一個由他人操作自動程序的子賬號,並且可以在最近更改中隱藏批量操作防止擾亂社區巡查工作。您可以在萌娘百科:機器人#申請與授權了解相關信息。
- 最後,這一點相當關鍵:前往您 wiki 的 Special:BotPasswords 頁面,為您的 bot 賬號創建一個機器人密碼,按提示操作,並保存最後得到的密鑰,您之後會用到它。
挑選您喜歡的包
Node.js 最引以為傲且最為方便的地方在於它擁有強大且完善的包管理程序——Node Package Manager(npm),使用 npm 您可以輕鬆地為項目添加依賴項和工具庫。
這裡我們推薦幾個比較好用的包,兩者對登錄和 API 操作的封裝大同小異,均兼容 萌娘百科 現有的 MediaWiki 版本,他們之間的區別無非在於回調風格之類。您可以根據自己的代碼偏好進行選擇。
- nodemw:使用 node 風格的回調函數(方法的最後一個參數傳入回調函數,其中返回值的第一個參數一定為
error
) - mwbot:返回異步
Promise
,可以使用.then().catch()
或者async await
方法 - @lavgup/mediawiki.js:返回異步
Promise
,值得一提的是它使用 TypeScript 編寫,這意味着基於它開發您的 bot 時,在現代 IDE 中可以獲得直觀的代碼提示 - wiki-saikou:使用TypeScript編寫,返回異步
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.org.cn/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群,在群組內進行討論!
接下來的精彩操作,就交給你來演繹吧!
參見
- MediaWiki 自動程序:zhwp:Wikipedia:機器人
- 使用包含用戶圖形界面的 bot 軟件:zhwp:Wikipedia:AutoWikiBrowser
|
- ↑ 我們暫不考慮使用 TypeScript 進行開發的情況,因為能熟練使用 TypeScript 的開發者應該用不到這篇教程。