2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

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