这个指南会简单介绍一下如何使用 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.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群,在群组内进行讨论!
接下来的精彩操作,就交给你来演绎吧!
|