Python 开发 QQ 机器人实战:基于 Mirai 框架
前言
本文旨在介绍如何使用 Python 结合 Mirai 框架开发 QQ 机器人。Mirai 是一个跨平台的 QQ 协议模拟框架,支持多种编程语言。虽然其核心基于 Java/Kotlin,但通过 HTTP API 和 Graia Application 库,我们可以使用 Python 进行高效开发。
使用 Python 结合 Mirai 框架开发 QQ 机器人的完整流程。涵盖环境配置、mcl 启动器使用、滑块验证处理、mirai-api-http 插件配置以及 Graia Application 库的代码实现。通过示例展示了如何发送消息、处理群消息及简单命令解析,最终构建一个功能完整的 QQ 机器人应用。

本文旨在介绍如何使用 Python 结合 Mirai 框架开发 QQ 机器人。Mirai 是一个跨平台的 QQ 协议模拟框架,支持多种编程语言。虽然其核心基于 Java/Kotlin,但通过 HTTP API 和 Graia Application 库,我们可以使用 Python 进行高效开发。
假设你已经安装好了 Java、Python 等运行环境。
要使用 Mirai 开发 QQ 机器人,首先需要了解其生态架构。Mirai 生态的核心是 Mirai 框架,其中包含 mirai-core 及 mirai-core-api 两部分。
直接使用 mirai-core-api 开发难度较大,官方提供了封装后的 mirai-console,它提供了更方便的开放接口。通常我们开发的是 mirai-console 的插件。
由于原生插件开发需要 Java 或 Kotlin,为了支持更多语言(如 Python),官方社区开发了 mirai-api-http 插件,允许通过 HTTP 请求与 Mirai 交互。

借助 mirai-api-http,开发模式变为:

此处选择 Python 作为开发语言。
为了简化启动流程,官方推出了 mirai-console-loader (简称 mcl),这是一键启动器。
mcl。如果启动成功,将看到 Mirai Console 界面。若遇到配置文件错误,需检查 config 目录下的文件并进行相应修改。
Mirai Console 在登录时无法自动处理滑块验证码。我们需要使用 mirai-login-solver-selenium 辅助登录。
mcl --update-package net.mamoe:mirai-login-solver-selenium --channel nightly --type plugin
如果遇到 Chromedriver 下载失败,需手动下载对应版本的 Chromedriver 并替换到 MCL 目录下的 chromedriver 文件夹中。确保文件名与日志提示的版本一致。
重启后输入命令 login 账号 密码,浏览器窗口会弹出完成滑块验证。
为了实现 Python 调用,需启用 HTTP API。
mirai-api-http 的 jar 包。plugin 文件夹下。注意:若遇到签名验证错误,可能是 JDK 版本问题。建议将 Oracle JDK 替换为 OpenJDK。
JAVA_HOME 指向 OpenJDK 路径。setting.yml 文件:
# file: mcl-1.0.3/config/net.mamoe.mirai.api.http/setting.yml
authKey: graia-mirai-api-http-authkey
cacheSize: 4096
enableWebsocket: true
host: '0.0.0.0'
port: 8080
使用 Graia Application 库来操作 Mirai API:
pip install graia-application-mirai
创建 bot.py 文件,填入以下代码:
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",
authKey="graia-mirai-api-http-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()
运行后向机器人发送消息,若收到 "Hello, World!" 则表示成功。
除了好友消息,机器人通常还需要处理群消息。可以通过监听 GroupMessage 事件实现。
from graia.application.group import Group
@bcc.receiver("GroupMessage")
async def group_message_listener(app: GraiaMiraiApplication, group: Group, sender):
if "指令" in str(sender.message):
await app.sendGroupMessage(group, MessageChain.create([Plain("收到群消息指令")]))
实现简单的命令解析功能,例如 /help 显示帮助信息。
@bcc.receiver("FriendMessage")
async def command_handler(app: GraiaMiraiApplication, friend: Friend, message: MessageChain):
text = str(message).strip()
if text == "/help":
help_msg = "可用命令:\n/help - 查看帮助\n/ping - 测试连接"
await app.sendFriendMessage(friend, MessageChain.create([Plain(help_msg)]))
elif text == "/ping":
await app.sendFriendMessage(friend, MessageChain.create([Plain("Pong!")]))
利用 GraiaMiraiApplication 提供的 API 可以轻松实现消息撤回和引用回复。
# 撤回指定消息
await app.recallMessage(friend, message_id)
# 引用回复
await app.sendFriendMessage(friend, MessageChain.create([
Plain("这是回复内容"),
At(friend.id) # 可选:@对方
]))
通过以上步骤,你可以快速搭建一个基于 Python 的 QQ 机器人。Mirai 框架提供了强大的扩展性,配合 Graia Application 库,能够轻松实现各种业务逻辑。在实际开发中,建议参考官方文档获取更多关于事件分发、中间件及高级特性的支持。
开发过程中遇到问题,可查阅 Mirai 官方文档或相关社区资源。祝开发顺利!

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online