利用 Mirai 及 Graia 搭建自己的 QQ 机器人

本文最后更新于:2021-02-06 20:40

最近无聊逛 GitHub 发现一个有意思的项目 Mirai,可以搭建 QQ 机器人,在这里记录一下自己踩过的坑

因为 Mirai 登录 QQ 时需要滑块验证登录,而我用 Ubuntu Server 没有 GUI,导致无法验证登录 QQ

所以,我用曲线救国的方法,在 WindowsMirai 登录 QQ 后,再把整个文件夹打包放到 Ubuntu Server 上即可

在 Windows 上运行 Mirai

  1. 下载并安装 OpenJDK,我用的是 AdoptOpenJDK,注意 JDK 的版本至少要 11

  2. Mirai Console Loader,从 Releases 下载最新版本的 MCL

  3. 新建文件夹 mcl,解压到该文件夹里,并将命令行路径切换到该文件夹

  4. 在命令行中执行 .\mcl --update-package net.mamoe:mirai-api-http --channel stable --type plugin 安装 mirai-api-http

  5. 编辑文件 mcl\config\net.mamoe.mirai-api-http\setting.yml,删除原本的内容,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
## 该配置为全局配置,对所有Session有效

# 可选,默认值为0.0.0.0
host: '0.0.0.0'

# 可选,默认值为8080
port: 8080

# 可选,默认由插件第一次启动时随机生成,建议手动指定
authKey: 1234567890

# 可选,缓存大小,默认4096.缓存过小会导致引用回复与撤回消息失败
cacheSize: 4096

# 可选,是否开启websocket,默认关闭,建议通过Session范围的配置设置
enableWebsocket: true

# 可选,配置CORS跨域,默认为*,即允许所有域名
cors:
- '*'

## 消息上报
report:
# 功能总开关
enable: false
# 群消息上报
groupMessage:
report: false
# 好友消息上报
friendMessage:
report: false
# 临时消息上报
tempMessage:
report: false
# 事件上报
eventMessage:
report: false
# 上报URL
destinations: []
# 上报时的额外Header
extraHeaders: {}

## 心跳
heartbeat:
# 功能总开关
enable: false
# 启动延迟
delay: 1000
# 心跳间隔
period: 15000
# 心跳上报URL
destinations: []
# 上报时的额外信息
extraBody: {}
# 上报时的额外头
extraHeaders: {}
  1. 在命令行中执行 ./mcl --update-package net.mamoe:mirai-login-solver-selenium --channel nightly --type plugin 安装 mirai-login-solver-selenium

  2. 确认电脑已安装最新版 Chrome,没有的话请执行安装

  3. 在命令行中执行 .\mcl 以启动 MCL

  4. 在启动的 MCL 中输入 /autoLogin add QQ号 QQ密码,然后会有弹窗滑块等一系列操作,根据提醒操作即可

  5. 成功登录后,按 Ctrl + C 退出 MCL

  6. zip 打包 mcl 文件夹

至此 Windows 上的操作完毕,接下来我们切换到 Ubuntu Server

在 Ubuntu Server 上运行 Mirai

  1. 安装 OpenJDK

我用的是 Ubuntu Server 20.04apt 库里的 OpenJDK 版本是 11 的,直接 apt 安装:

1
2
sudo apt update
sudo apt install default-jdk

安装完成后运行 java -version 确认版本是否是 11

  1. 运行 MCL

将之前打包的压缩包复制到 Ubuntu 中,解压并运行 MCL,请提前装好 screen

1
2
3
cd mcl
chmod +x mcl
screen -dmS mcl ./mcl

编写 Bot 脚本

  1. Python 版本

Graia 要求 Python 版本至少为 3.7,请确认自己的 Python 版本:python3 -V,如果版本低于 3.7,请自行升级

Ubuntu Server 20.04 自带的 Python 版本是 3.8.5

  1. 安装 Graia
1
sudo pip3 install graia-application-mirai
  1. 编写脚本

mcl 目录新建 bot.py 输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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,在 mcl\config\net.mamoe.mirai-api-http\setting.yml 里的 authKey
account=1209626343, # 你的机器人的 qq 号
websocket=True # Graia 已经可以根据所配置的消息接收的方式来保证消息接收部分的正常运作.
)
)

@bcc.receiver("FriendMessage")
async def friend_message_listener(app: GraiaMiraiApplication, friend: Friend):
await app.sendFriendMessage(friend, MessageChain.create([
Plain("Hello, World!")
]))

app.launch_blocking()
  1. 运行脚本

运行后当终端输出

1
2
3
[2020-07-25 21:42:11,929][INFO]: launching app...
[2020-07-25 21:42:11,960][INFO]: using websocket to receive event
[2020-07-25 21:42:11,964][INFO]: event reveiver running...

表示启动成功,然后和机器人账号发起好友对话, 当你的机器人向你发出 Hello, World! 时, 你就已经部署好了一个最小的 Graia Framework

后续更强大的功能,请参照 Graia API 执行编写吧

参考文献

Mirai Console Loader
Graia Application for mirai-api-http
Graia Document
Graia API