置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

幫助:使用Node.js編輯

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋
Commons-emblem-notice.svg
這個頁面「Help:使用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 軟件來解釋並執行您的代碼。

創建您的 bot 賬號

  1. 一般來說,我們不希望使用自己的主要賬號運行自動程序,這不僅不合理,而且難以維護和監管,因此我們建議您另外註冊一個賬號作為 bot 賬號。
  2. 然後,您還可以為您的 bot 賬號申請一個 bot 用戶組,明確表示這是一個由他人操作自動程序的子賬號,並且可以在最近更改中隱藏批量操作防止擾亂社區巡查工作。您可以在萌娘百科:機器人#申請與授權了解相關信息。
  3. 最後,這一點相當關鍵:前往您 wiki 的 Special:BotPasswords 頁面,為您的 bot 賬號創建一個機器人密碼,按提示操作,並保存最後得到的密鑰,您之後會用到它。

挑選您喜歡的包

Node.js 最引以為傲且最為方便的地方在於它擁有強大且完善的包管理程序——Node Package Manager(npm),使用 npm 您可以輕鬆地為項目添加依賴項和工具庫。

這裡我們推薦幾個比較好用的包,兩者對登錄和 API 操作的封裝大同小異,均兼容 萌娘百科 現有的 MediaWiki 版本,他們之間的區別無非在於回調風格之類。您可以根據自己的代碼偏好進行選擇。

  1. nodemw:使用 node 風格的回調函數(方法的最後一個參數傳入回調函數,其中返回值的第一個參數一定為error
  2. mwbot:返回異步Promise,可以使用.then().catch()或者async await方法
  3. @lavgup/mediawiki.js:返回異步Promise,值得一提的是它使用 TypeScript 編寫,這意味着基於它開發您的 bot 時,在現代 IDE 中可以獲得直觀的代碼提示
  4. 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群,在群組內進行討論!

接下來的精彩操作,就交給你來演繹吧!

參見

  1. 我們暫不考慮使用 TypeScript 進行開發的情況,因為能熟練使用 TypeScript 的開發者應該用不到這篇教程。