一、安装框架

1. 安装iTXTech MCL Installer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 首先安装 cargo 用于构建 mcl-installer 
$ sudo yum install cargo
# 安装 upx 用于压缩
$ sudo yum install upx
# 克隆仓库
$ git clone https://github.com/iTXTech/mcl-installer.git
$ cd mcl-installer
# native-tls => 使用系统的 OpenSSL,rustls => 使用 rustls。
# --release 用于构建优化过的二进制文件,如需要进行调试请去除该参数。
# 在此之前要确保安装了Openssl,参考 https://cloudwafer.com/blog/installing-openssl-on-centos-7/
$ cargo build --features native-tls --release
$ cd target/release
$ strip mcl-installer # strip 可减小可执行文件大小
$ upx --best --lzma mcl-installer # 使用 upx 压缩可进一步缩小可执行文件大小

2. 安装iTXTech MCL

1
2
3
4
5
6
7
8
9
10
11
12
$ cd PATH_TO_INSTALL_MCL # 切换到要安装 mcl 的目录
$ PATH_TO_INSTALLER/mcl-installer # 运行mcl-installer
Would you like to install Java? (Y/N, default: Y)
# 是否安装Java,如果上面的检测结果输出的Java版本大于11即可,可输入N跳过安装,否则必须安装Java

Java version (8-15, default: 11): # 选择Java版本安装,默认为Java 11
JRE or JDK (1: JRE, 2: JDK, default: JRE): # 选择JRE还是JDK安装,默认为JRE
Binary Architecture (default: x64): # 选择架构安装,默认x64
# 如果操作系统为Windows并且需要使用 mirai-native,请选择 x32(而不是i386等其他名字)

The latest stable version of iTXTech MCL is x.x.x # 获取最新MCL并询问是否下载
Would you like to download it? (Y/N, default: Y) # Y:下载,N:取消

3. 安装 mirai-api-http 插件

1
2
$ cd PATH_TO_INSTALL_MCL # 切换到 mcl安装目录
$ ./mcl --update-package net.mamoe:mirai-api-http --channel stable --type plugin

4. 安装 mirai-login-solver-selenium 插件(用于登陆时完成验证码)

1
2
$ ./mcl --update-package net.mamoe:mirai-login-solver-selenium --channel nightly --type plugin
# 第一次运行会下载geckodriver,可能会下载失败,可以手动下载(下载过程会有地址)放入 ./MxLibData/selenium 文件夹下在重新启动

二、使用python-SDK(Graia Framework

参考文档 https://graia-document.vercel.app/

本篇仅作最直接的过程,更多细节和解释可以查看原文档。

1. 安装sdk插件

1
$ pip install graia-application-mirai

2. 添加配置

运行过一次mcl(通过命令 ./mcl )后,会生成 ./config/net.mnmoe.mirai-api-http/setting.yml 文件,修改其中的以下配置

1
2
3
4
5
6
7
8
9
# file: mirai-client/config/MiraiAPIHTTP/net.mamoe.mirai.api.http.config.Setting
authKey: graia-mirai-api-http-authkey # 你可以自己设定, 这里作为示范

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

enableWebsocket: true # 是否启用 websocket 方式, 若使用 websocket 方式交互会得到更好的性能
host: '0.0.0.0' # httpapi 服务监听的地址, 错误的设置会造成 Graia Application 无法与其交互
port: 8080 # httpapi 服务监听的端口, 错误的设置会造成 Graia Application 无法与其交互

3. 编写自己的插件

将以下代码保存到文件 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
account=1234567890, # 你的机器人的 qq 号
websocket=True # Graia 已经可以根据所配置的消息接收的方式来保证消息接收部分的正常运作.
)
)

@bcc.receiver("FriendMessage")
async def friend_message_listener(app: GraiaMiraiApplication, friend: Friend, message: MessageChain):
await app.sendFriendMessage(friend, MessageChain.create([
Plain(f"Hello { friend.nickname }, you said '{ message.asDisplay() }'!")
]))

app.launch_blocking()

4. 运行自己的插件

首先保存 mcl 处于正常运行状态,出现类似如下信息

1
2
3
4
5
$ ./mcl
......
2021-04-03 01:55:26 I/Bot.1234567890: Login successful
2021-04-03 01:55:26 I/main: mirai-console started successfully.
2021-04-03 01:55:28 I/Bot.1234567890: Server list: 36.155.229.203:8080, 111.30.178.34:8080, 120.232.18.180:8080, 111.30.169.27:80, 36.155.229.140:14000, 120.232.18.55:443, 111.30.181.202:80, 36.155.229.228:80, msfwifi.3g.qq.com:8080, 111.30.169.93:80.

运行插件:

1
$ python bot.py

接下来用另一个QQ向机器人发送消息即可(“Unknown Error”是我的QQ昵称)

first_dialogue

同时,Mirai Console 得到以下日志:

1
2
3
4
2021-04-03 02:24:49 V/Bot.2690919164: Unknown Error(1361050885) -> 123
2021-04-03 02:24:49 V/Bot.2690919164: Friend(1361050885) <- Hello Unknown Error, you said '123'!
2021-04-03 02:25:03 V/Bot.2690919164: Unknown Error(1361050885) -> 456
2021-04-03 02:25:03 V/Bot.2690919164: Friend(1361050885) <- Hello Unknown Error, you said '456'!

bot.py 得到以下日志:

1
2
3
4
[2021-04-03 02:24:49,152][INFO]: 2690919164: [Unknown Error(1361050885)] -> '[mirai:source:11960,1617387889]123'
[2021-04-03 02:24:49,366][INFO]: [BOT 2690919164] Friend(1361050885) <- "Hello Unknown Error, you said '123'!"
[2021-04-03 02:25:03,234][INFO]: 2690919164: [Unknown Error(1361050885)] -> '[mirai:source:11961,1617387903]456'
[2021-04-03 02:25:03,432][INFO]: [BOT 2690919164] Friend(1361050885) <- "Hello Unknown Error, you said '456'!"

至此,QQ机器人已经可以正常运行,至于机器人可以做哪些事情,就取决于你的插件有多么丰富了!

5. 更丰富的插件

https://graiaproject.github.io/Application/ 中发现更多有用的api来使你的插件更加丰富。

使用 saya 管理插件

1
2
3
pip install graia-saya
pip install image
git clone https://github.com/Roc136/saya_plugins_collection.git

涉及到的项目仓库地址:

Mirai:https://github.com/mamoe/mirai

Mirai Console: https://github.com/mamoe/mirai-console

mirai-api-http: https://github.com/project-mirai/mirai-api-http

Mirai Console Loader: https://github.com/iTXTech/mirai-console-loader

iTXTech MCL Installer: https://github.com/iTXTech/mcl-installer

mirai-login-solver-selenium: https://github.com/project-mirai/mirai-login-solver-selenium

Graia Framework: https://github.com/GraiaProject/Application