前言
机器人相关内容,我会以最简练高效的内容把我对机器人的探索分享给大家。本篇我们以Mirai为工具,介绍QQ平台的机器人智能回复。
何为智能回复?
根据我们实现设定好的规则,让机器人在指定对话回复指定内容
我们先从搭建开始,再到Mirai插件使用,再到简单的PING-PONG应答。
Mirai:GitHub - mamoe/mirai: 高效率 QQ 机器人支持库
如果你想仔细了解这个机器人的底层,入口:mirai/mirai-ecology.md at dev · mamoe/mirai · GitHub
Mirai安装
安装[Mirai Console Loader](GitHub - iTXTech/mirai-console-loader: 模块化、轻量级且支持完全自定义的 mirai 加载器。),一个模块化的mirai加载器。本文以Linux为例(X86_x64)
下载安装器
从Release页面下载:Releases · iTXTech/mcl-installer · GitHub
curl -LJO https://github.com/iTXTech/mcl-installer/releases/download/v1.0.2/mcl-installer-1.0.2-linux-amd64
没有直接看到X64架构的包,我选择amd64,也可以的,在安装命令里有架构选择。
执行安装
-
增加执行权限
chmod +x mcl-installer-1.0.2-linux-amd64 -
执行安装器
./mcl-installer-1.0.2-linux-amd64 -
选择是否安装java及Java版本、jdk/jre
-
选择架构
-
最后确认安装,安装结束后,如果成功会显示如下
MCL startup script has been updated. Use "./mcl" to start MCL. Press Enter to exit.步骤3 4的选择可以一路回车,都是最佳默认值
检查MCL
执行 ./mcl启动MCL,第一次启动会自动下载一些jar包
启动成功会有输出“I/main: mirai-console started successfully.”
MCL QQ登录与简单使用
前提条件
我们假设你的帐号是
qq:123456
密码:m123456789
这里建议选择一个小号开始,如果你的小号没有设备锁当然更好了.登录之前,请先在这个环境ip下登录一下qq123456电脑版和手机版.让腾讯熟悉一下这个环境,防止环境异常带来的苦难.
登录
使用以下指令登录
/login <qq号> <密码>
如
/login 123456 m123456789
如果一切顺利,会提示Login successful 的字样.
登陆失败?
- 设备锁问题
它会弹出一个对话框,你需要浏览器打开链接,使用手机qq扫码通过验证,这样这个设备就会加入到设备锁的信任列表中.完成后关闭对话框,即可继续登录成功.
-
滑块问题
参考官方解决方法 [链接](无法登录的临时处理方案 | MiraiForum)
登录检测
如果你登录成功了,控制台可以收到所有消息,你可以试着用其他qq给这个qq发消息,它会显示在控制台中.
使用其他指令
你可以使用/autoLogin add <qq号> <密码>来 增加一个自动登录qq配置
你可以使用 /logout <qq号> 来退出一个qq
你还可以使用/help来查看更多的指令说明
使用插件控制qq
我们不原生接口上开发插件,我们采用Python开发插件,Python是我很喜欢的语言,灵活自然,简单易学.
我们使用[mirai-api-http插件](GitHub - project-mirai/mirai-api-http: Mirai HTTP API (console) plugin),搭配[saaya](GitHub - jerrita/saaya: Saaya is a Python framework based on Mirai),的方案来
安装mirai-api-http
mirai-api-http是一款通过http调用api的插件,支持绝大部分Mirai提供的接口,可以通过http/ws/webhook/reverse-ws的方式调用.
-
退出登录的qq号和MCL控制台
/logout 123456 exit -
安装插件
./mcl --update-package net.mamoe:mirai-api-http --channel stable-v2 --type plugin -
启动MCL完成安装
./mcl控制台会自动安装更新和安装插件,安装完成后会提示
mirai-console started successfully. -
配置
mirai-api-http模板
adapters: - http - ws debug: false enableVerify: true verifyKey: 1234567890 singleMode: false cacheSize: 4096 adapterSettings: http: host: localhost port: 8080 cors: ["*"] ws: host: localhost port: 8080 reservedSyncId: -1
(1) 必要需要修改的地方是verifykey,这是和插件交互时的登录密钥,一定设置好.
(2)adapterSettings下的http和ws是对应通信方式的配置,
-
如果你与插件交互是在另一个服务器上,那请使用
0.0.0.0,如果你不知道我说的是什么,那你直接使用0.0.0.0即可 -
port是插件交互的端口号,ws和http协议不同,端口号即使相同也不会冲突.如果端口号和你服务器/电脑其他端口冲突,请改为其他值
重启MCL
exit
./MCL
重启后MCL控制台会有类似如下的输出,那么表明WS和HTTP开启正确
2022-03-21 00:04:00 I/http adapter: >>> [http adapter] is listening at http://localhost:8080
2022-03-21 00:04:00 I/ws adapter: >>> [ws adapter] is listening at ws://localhost:8080
2022-03-21 00:04:00 I/Mirai HTTP API: Http api server is running with verifyKey: 1234567890
2022-03-21 00:04:00 I/Mirai HTTP API: adaptors: [http,ws]
使用Saaya
我们为什么安装Saaya呢,是否有一个mirai-api-http就够了呢?答案是肯定的,但是我们想要更舒适的插件开发体验,就要使用别人基于mirai-api-http封装的api调用管理插件.
官方也是这么想的,原生的插件开发不易扩展,不易和之前已有插件兼容,就开发一个http插件,让大家基于此开发各种语言的SDK.即Saaya属于Python的SDK.
为什么使用[Saaya](GitHub - jerrita/saaya: Saaya is a Python framework based on Mirai)?因为它简单方便,能让我看懂.快速上手
新建一个项目
建议使用Pycharm获取更佳的体验.
使用Pycharm新建一个python项目,新建虚拟环境venv,使用虚拟环境venv
下载saaya
pip install saaya
初始化项目
- 在项目根目录下新建
main.py
from saaya.session import Bot
from private import address, verifyKey, botqq
if __name__ == '__main__':
bot = Bot(address, verifyKey) # 创建一个 Bot 实例
bot.bind(botqq) # 登陆 Bot (注意:需要主程序已登陆对应 qq)
bot.registerPlugins([
'plugins.base.hello'
])
bot.loop() # 开始监听事件循环
插件的明明规范是根目录下,目录名.目录名.文件名(不带.py)
这里注意,private会报错,接下来我们配置private文件.
-
在项目根目录下创建
private.pyaddress = "127.0.0.1:8080" verifyKey = "1234567890" botqq = "123456"第一行填写你在
mirai-api-http配置项中,配置的ws通信方式的host:port第二行是在同一个文件中,找到你刚配置的授权码
第三行是你的qq号,在本文中是123456
-
在项目根目录下新建
plugin/base/hello.py(即出创建plugin目录,再plugin创建base目录,再在base目录下创建hello.py)
from saaya.utils import PluginManager
from saaya.event import FriendMessage
@PluginManager.registerEvent("FriendMessage")
async def hello(event: FriendMessage):
if event.message.getContent() == 'ping':
event.sender.sendMessage("pong")
启动项目
使用Pycharm启动main.py,或者命令行启动.
以下输出说明正确
[2022-03-21 00:39:30.072 __init__.py] [INFO] : Welcome to use saaya(2.0.2 dev) based on mirai!
[2022-03-21 00:39:30.480 protocol.py] [INFO] : Connected to mirai-http backend. The version is 2.4.0.
[2022-03-21 00:39:30.500 protocol.py] [INFO] : Authed. Your session is aW9r5r70
[2022-03-21 00:39:30.501 session.py] [INFO] : Bot initialized.
[2022-03-21 00:39:30.513 protocol.py] [INFO] : Successfully bind on qq 123456.
[2022-03-21 00:39:30.514 session.py] [INFO] : Loading plugin: plugins.base.hello
启动错误
-
没有权限
因为它默认使用
/var/log/saaya.log作为日志路径.解决办法sudo cd /var/log sudo touch saaya.log sudo chmod 777 saaya.log之后再次启动即可.
查看结果
之后我们本来在MCL控制台的输出,都会展示在saaya控制台中,它们使用WS协议连接.
-
对botqq发送消息"ping"
-
bot会自动回复"pong"
如图成功!!!

saaya分析
saaya逻辑很简单,源代码也不多,我非常喜欢,目前功能也够我使用
from saaya.session import Bot
from private import address, verifyKey, botqq
if __name__ == '__main__':
bot = Bot(address, verifyKey) # 创建一个 Bot 实例
bot.bind(botqq) # 登陆 Bot (注意:需要主程序已登陆对应 qq)
bot.registerPlugins([
'plugins.base.hello'
])
bot.loop() # 开始监听事件循环
我们查看main.py,它其实就是从private读取我们的mirai-api-http连接配置,启动一个Bot,加载我们的插件,启动循环监听事件.
至于hello.py
from saaya.utils import PluginManager
from saaya.event import FriendMessage
@PluginManager.registerEvent("FriendMessage")
async def hello(event: FriendMessage):
if event.message.getContent() == 'ping':
event.sender.sendMessage("pong")
使用注解(我很喜欢)注册qq私人消息事件,通过event得到message信息,简单判断后进行回复.
总结
-
我们介绍了Mirai,使用MCL安装了Mirai,登录QQ
-
我们使用第三SDKSaaya为我们编写简单的对话逻辑.
-
其实我们已经达到了"智能回复"了,即使现在只有"ping"和"pong"回复,但是我们已经可以控制机器人根据不同的语言逻辑来回复我们想回复的内容.
下期预告:定制更丰富的qq机器人插件--qq智能闲聊机器人