帮助:使用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 的开发者应该用不到这篇教程。