基于Mirai的QQ机器人方案


前言

自从8月2日T*ncent对晨风机器人作者提出恶臭诉讼的事件闹大之后,各路第三方QQ机器人方案的作者纷纷跑路。Mirai可以说是尚且可用的一款全开源机器人方案了,虽然随时都有被封杀的风险,但在T*ncent彻底更新QQ协议之前,机器人还是可用的。(希望TX在更新协议之前能把自家机器人搞好且给一些免费配额,否则真要逼人去挂外链搞Rocket.chat聊天室了…)

下面介绍一下尚且可用的Mirai相关组件。

Mirai及相关项目

Mirai本体

Mirai-Console

  • 以Mirai机器人库为核心的机器人框架程序,分为后端和前端。
  • 后端负责机器人服务、加载插件等,前端负责与机器人管理员交互。
  • 无法直接执行,需要用启动器启动。
  • 启动器Mirai-console-wrapper停更,推荐使用MiraiOK。(但据MiraiOK作者自述,这东西相当于wrapper的wrapper无限套娃
  • https://github.com/mamoe/mirai-console

MiraiOK

  • 基于Mirai-ConsoleMirai的一键启动包(用起来像酷Q)。
  • 作者已删库,但可从其他人的Fork得到源代码和编译好的程序。
  • 启动后往plugin文件夹里塞插件即可执行。
  • 似乎是用Go语言开发的,全平台,详细看Github说明
  • https://github.com/2970884077/MiraiOK

Mirai-Plugin-Intellij

Mirai-API-HTTP

  • 一个集大成的Mirai-Console插件。
  • 为其他语言使用Mirai提供HTTP API。
  • 使用此API的话相当于你要编写并维护一个其他语言的服务器程序来处理机器人收到的消息并做出相应回应。(感觉是个大坑)好像有人在维护一个基于Python的聊天Bot框架Graia
  • https://github.com/project-mirai/mirai-api-http

搞Mirai方案需要的准备

Java JDK

1.8版本必装,若需要使用Mirai-Console图形化界面(前端),还需要安装1.11版本。同时部署的服务器也需要装Java。
注意配置系统环境变量JAVA_HOME

Gradle & Gradlew

Gradle是Java & Kotlin项目经常使用的构建工具,用于执行项目的编译、打包与测试等。而Gradlew则是Gradle的Wrapper,由于不同项目使用的Gradle版本可能不同,可以使用Gradlew简化不同版本的Gradle本身的安装、部署。关于Gradle & Gradlew的详细介绍可以参考网络资料。
推荐全局安装一个Gradle,并添加系统环境变量GRADLE_HOME,这样可以在命令行中直接使用gradle相关命令,在创建新项目及配合IDE时有用。
不过一般在Java & Kotlin项目根目录中,经常可以见到Gradlew的可执行文件或者bat脚本。对于已有项目而言,切到项目文件夹执行项目中的Gradlew是更明智的选择。项目有Gradlew就使用Gradlew,没有的话一般也会使用Gradle生成一个Wrapper。下面是一些Gradle & Gradlew的常用命令:

命令 说明
gradle wrapper 在当前目录生成一个Gradle Wrapper。
.\gradlew.bat xxx Windows中执行Gradle Wrapper的xxx命令。
.\gradlew xxx Linux中执行Gradle Wrapper的xxx命令。
.\gradlew tasks 查看当前项目可以执行的命令。
.\gradlew build 构建项目。
.\gradlew clean 清除./build文件夹中已经构建的文件。
.\gradlew jar 打包项目。

值得注意的是,如果你不想看到系统默认的用户文件夹被Gradlew下载的一堆东西(不同版本的Gradle,缓存的依赖包等等,GB级别的数据)塞满,请配置系统环境变量GRADLE_USER_HOME到一个空闲的文件夹,详细设置可以搜下已有的博文。

Jetbrain IntelliJ IDEA

建议有条件的童鞋申请教育版,社区版也可使用。注意,Mirai-Plugin-Intellij最新版1.1.4支持的最高版本为Idea 2020.1,若安装了最新的Idea 2020.2版本,是无法使用插件的。(装了2020.2版本的我摸索了一下,私改了1.1.5版本插件,好歹能用。)

学习一个

开发Mirai插件需要学习Java或者Kotlin。

关于未来机器人方案的一些想法与理解

聊天机器人本质上是一种Web服务,只不过与用户交互的前端变成了QQ聊天界面,后端服务则有各个机器人框架提供。
对于一些简单的业务,如复读机,成员管理,可以直接在机器人插件中编写服务。
但对于一些复杂的,涉及较多数据且时间跨度较大的业务,最好将业务部署在另外的前后端分离Web项目上, QQ机器人只负责请求与回应的转发。当然,很多机器人项目本身就是调用已有Web服务的API实现功能。炼铜bot,网抑云

以PCR群的Bot为例:

  • 简单业务交给插件实现,如定时提醒买药群主女装
  • 发现官方公告功能交给RSS订阅服务或者爬虫(大概是吧,没具体看过)。
  • 公会战统计,插件仅监听群员打出的命令,转发Http请求给自己搭建的Web服务器,并根据Resp来自服务器的回应给出相应回复。业务处理及数据管理交由Web服务器管理。可以使机器人和Web服务器共用同一组数据。

目前个人想到的一些可行的方案:

  • 机器人使用MiraiOK部署。
  • 网站及数据库使用Vue作为前端框架,Django + Django REST Framework作为后端框架,MySQL作为数据库。用户可在Vue前端编辑表格,也可使用机器人命令修改表格。
  • 有钱的话可以全塞在国内服务器或者亚洲VPS上,但国内服务器带宽属实蛋疼,还要备案。
  • 没钱的话可以考虑搭载在空闲机器上(树莓派似乎可以拉出来遛遛了)。接入宽带的机器可以使用DDNS服务,校园网只能使用Sakura FRP之类的进行内网穿透了。网站之类最好还是部署在境外VPS上,毕竟固定IP还是蛮重要的,使用FRP还要考虑端口问题。