前言 尽管本文的最终目标是使用Python开发MiRAI机器人,但在环境配置等基础教程方面,很多操作与其他编程语言有相似之处。假设你已经安装了Java、Python等必要的运行环境,接下来我们将介绍MiRAI生态。
要开发QQ机器人,需要先对MiRAI生态有一定了解,因为它相对复杂,常常会遇到各种问题。因此,了解更多信息将帮助你更迅速地解决问题。

简单来说,MiRAI生态的核心是MiRAI框架,主要包括MiRAI-coRe和MiRAI-coRe-API两部分。前者负责协议相关内容,而后者则提供对前者的操作接口。因此,程序员主要与MiRAI-coRe-API打交道,而MiRAI-coRe对我们来说是不可见的。虽然使用MiRAI-coRe-API就可以开发QQ机器人,但对初学者来说难度仍然较大,因此MiRAI官方开发组编写了一个QQ机器人程序,即MiRAI-console。它在MiRAI框架的基础上进行了封装,提供了更方便的开放接口。通过MiRAI-console,我们可以开发MiRAI-console的插件,而不必直接开发MiRAI的QQ机器人,正如下文所示:

然而,开发MiRAI-console的插件仍需要使用Java或Kotlin。如果你对这两者不熟悉,官方提供的另一个插件MiRAI-API-http可以帮助解决这个问题。因此,借助MiRAI-API-http开发QQ机器人的方式变成了如下模式:

如你所见,使用MiRAI-API-http后,我们有了更多语言选择。在这里,我选择Python。接下来,我们需要通过MiRAI-console-loadeR启动MiRAI-console。根据之前的介绍,要开发MiRAI的QQ机器人,我们首先需要运行MiRAI-console,但这一步并不简单。你需要准备MiRAI-coRe、MiRAI-console和MiRAI-console-teRMinal,并通过一系列指令启动它。不过,官方为了降低门槛,推出了MiRAI-console-loadeR(简称Mcl),这是一款官方的“一键启动器”,只需下载它即可(第一步的操作可忽略)。Github仓库地址为:MiRAI-console-loadeR。
下载完成Mcl后,解压并打开命令提示符,切换到Mcl所在目录,运行Mcl,如下图:

如果一切顺利,MiRAI-console就会成功启动,如下图所示:

但是,有时从官网下载的项目在运行时会出现错误(如果你没有遇到这个问题,请忽略此步骤)。通常原因是配置文件出错。修改方法如下图所示:

修改后重新运行Mcl,应该能成功启动。第一个大坎就此迈过。接下来是另一个挑战:使用MiRAI-login-solveR-seleniuM处理滑块验证以辅助登录。在成功启动的Mcl窗口,输入命令登录QQ:login 账号 密码,可能会出现错误,因为MiRAI-console无法处理滑块验证:

因此,我们需要MiRAI的另一个项目MiRAI-login-solveR-seleniuM来辅助登录。安装步骤如下(需要先安装Chrome浏览器):结束之前运行的MiRAI-console,然后在命令行输入以下命令来添加该包:Mcl –update-package net.MaMoe:MiRAI-login-solveR-seleniuM –channel nightly –type plugin。重新运行Mcl,这样它就会尝试下载MiRAI-login-solveR-seleniuM。然而,我在这一步也遇到了问题(如果没有问题可以跳过)。由于该项目使用了selenium,因此需要ChromeDriver,而ChromeDriver有时下载失败,所以需要手动下载并替换到相应目录,步骤如下:
1. 查看命令提示符窗口,找到Mcl正在下载的ChromeDriver版本。

2. 前往ChromeDriver的镜像源下载,推荐使用:ChromeDriver。
3. 找到与当前版本号相近的版本,例如我下载的是86.0.4240.22。

4. 解压后将文件重命名为chromeDriver-86.0.4240.198.exe,确保与命令行中查看的文件名一致。
5. 结束之前运行的Mcl命令行程序,将准备好的chromeDriver-86.0.4240.198.exe替换到以下目录:

6. 重新运行Mcl程序,如果一切顺利,可以继续之前的步骤,输入命令:login 账号 密码,尝试登录。接下来会弹出一个浏览器窗口,只需按照提示完成登录验证即可。如果登录成功,以后的每次登录将无需再次验证。
又跨过一个坎……接下来是另一个挑战:使用MiRAI-API-http扩展语言支持。前面的工作实际上完成了两个重要步骤:
1. 使用Mcl运行MiRAI-console。
2. 使用MiRAI-login-solveR-seleniuM辅助通过滑块验证码完成登录。
接下来就开始使用MiRAI-API-http。首先在MiRAI-API-http项目地址下载MiRAI-API-http,然后将下载到的jar包放在plugin文件夹下,如图所示:

重启Mcl并重新登录,准备工作就此完成。但我遇到了一些错误,似乎是签名验证的问题,错误如下:

经过咨询得知,这是Oracle JDK的问题,只需将Oracle JDK替换为Open JDK即可。步骤如下:
1. 下载Open JDK,例如我下载了如下版本:

2. 解压Open JDK,并放在合适的位置,例如如下图所示:

3. 添加JDK所在路径到环境变量:此电脑 -> 右键属性 -> 高级系统设置 -> 高级 -> 环境变量,按下图操作:


通过gRAIa-application-MiRAI使用Python开发MiRAI机器人。在前面的操作中,至此为止,基本上所有使用非Java/Kotlin语言的程序员都可以适用,而接下来的操作将专门针对使用Python的程序员。首先参考gRAIa-application-MiRAI官方文档配置MiRAI-API-http,如下图所示:

以下是参考配置,具体可自行调整:
#file: Mcl-1.0.3/config/net.MaMoe.MiRAI.API.http/setting.yMl
authKey: gRAIa-MiRAI-API-http-authkey #自定义设置,示范用
cacheSize: 4096 #可选,缓存大小,过小可能导致消息处理失败
enableWebsocket: true #启用websocket方式以提高性能
host: ‘0.0.0.0’ #httpAPI服务监听地址
port: 8080 #httpAPI服务监听端口
重启Mcl以更新配置。
接着,安装Python模块以操作MiRAI-API-http接口:gRAIa-application-MiRAI:
pip install gRAIa-application-MiRAI
将以下代码复制到bot.py,并根据注释提示与之前对MiRAI-API-http的配置稍作修改。然后运行:
from gRAIa.bRoadcast import Broadcast
from gRAIa.application import GRAIaMiRAIapplication, Session
from gRAIa.application.Message.chain import MessageChain
import asyncio
from gRAIa.application.Message.elements.internal import Plain
from gRAIa.application.friend import Friend
loop = asyncio.get_event_loop()
bcc = Broadcast(loop=loop)
app = GRAIaMiRAIapplication(
broadcast=bcc,
connect_info=Session(
host=”http://localhost:8080″, #填入httpAPI服务地址
authKey=”gRAIa-MiRAI-API-http-authkey”, #填入authKey
account=5234120587, #你的机器人的QQ号
websocket=True #确保消息接收正常
))
@bcc.ReceiveR(“FriendMessage”)
async def friend_message_listener(app: GRAIaMiRAIapplication, friend: Friend):
await app.sendFriendMessage(friend, MessageChain.create([Plain(“Hello, World!”)]))
app.launch_blocking()
然后向你的QQ机器人发送任意消息,如果它回复你“Hello, World!”,则表示运行成功。
成功示例如下:

结语
上述全部操作仅为使用MiRAI开发QQ机器人的入门教程。如需了解更多信息,请参考官方文档以获取更多API的使用方法。
