Skip to main content
ErisPulse QQBotAdapter

ErisPulse QQBotAdapter

QQ 官方机器人平台适配器 —— 群聊 / 私聊 / 频道一站接入。

基于 ErisPulse 架构的 QQ 官方机器人协议适配器,支持 WebSocket / Webhook 双接入模式与多账户并行,整合群聊、私聊、频道等场景,提供 OneBot12 标准事件、标准Api动作与请求操作接口。

PyPI Python License Stars Downloads ErisPulse


简介

QQBotAdapter 是基于 ErisPulse 架构的QQ官方机器人协议适配器,整合群聊、私聊、频道等多种场景的功能模块,提供统一的事件处理和消息操作接口。

v5.0 亮点:

  • 🌐 对齐官方最新 API:统一域名 api.bot.qq.com、新增 X-Union-Appid 头、sandbox 废弃
  • 🔌 双接入模式:WebSocket 长连接 / Webhook HTTP 回调(Ed25519 验签)
  • 👥 多账户并行:每账户独立连接与 token 管理,Using() 灵活切换
  • 📡 OneBot12 标准Api动作:Api.get_group_info() / Api.delete_message() 等跨平台统一调用
  • 🤝 请求操作:入群申请(GROUP_JOIN_REQUEST)标准化 accept()/reject() 审批
  • 🚀 流式消息:单聊流式输出(stream_messages)
  • 📦 全量平台API方法族:群管理、菜单面板、日程、帖子、表态、分片上传等

平台原生事件映射关系

官方事件命名 Adapter事件命名
C2C_MESSAGE_CREATE private_message
GROUP_AT_MESSAGE_CREATE group_message
GROUP_MESSAGE_CREATE group_message(非@群消息,需后台开通接收全部消息权限)
AT_MESSAGE_CREATE channel_message
MESSAGE_CREATE channel_message
DIRECT_MESSAGE_CREATE direct_message
FRIEND_ADD friend_add
FRIEND_DEL friend_del
GROUP_ADD_ROBOT group_add
GROUP_DEL_ROBOT group_del
GROUP_MSG_REJECT group_block
GROUP_MSG_RECEIVE group_allow
C2C_MSG_REJECT private_block
C2C_MSG_RECEIVE private_allow
GROUP_MEMBER_ADD group_member_add(v5新增)
GROUP_MEMBER_REMOVE group_member_remove(v5新增)
GROUP_JOIN_REQUEST group_join_request(v5新增,request事件)
GUILD_MEMBER_ADD guild_member_add
GUILD_MEMBER_UPDATE guild_member_update
GUILD_MEMBER_REMOVE guild_member_remove
INTERACTION_CREATE interaction
MESSAGE_AUDIT_PASS audit_pass
MESSAGE_AUDIT_REJECT audit_reject

这仅仅在 sdk.adapter.qqbot.on() 的时候生效,你完全可以使用标准OneBot12事件(sdk.adapter.on)来获取信息。

OneBot12标准事件类型

事件类型 detail_type 说明
消息事件(私聊) private 用户发送的私聊消息
消息事件(群聊) group 群内消息(@或非@)
消息事件(频道) channel 频道内消息
请求事件(入群申请) group type=request,含 request_id,支持审批
好友增加/删除 friend_add / friend_del 用户添加/删除机器人好友
群增加/减少 group_increase / group_decrease 群添加/移除机器人
群消息屏蔽/允许 group_block / group_allow 群拒绝/允许机器人消息
私聊屏蔽/允许 private_block / private_allow 用户拒绝/允许机器人私聊
群成员增加/减少 group_member_increase / group_member_decrease 群成员变更(v5新增)
频道成员增加/更新/减少 guild_member_increase / guild_member_update / guild_member_decrease 频道成员变更
频道服务器创建/更新/删除 guild_create / guild_update / guild_delete 频道服务器变更
子频道创建/更新/删除 channel_create / channel_update / channel_delete 子频道变更
音频子频道进出 qqbot_channel_enter / qqbot_channel_exit 用户进入/离开音频直播子频道(v5新增)
QQBot交互事件 qqbot_interaction 按钮点击等交互
QQBot审核通过/拒绝 qqbot_audit_pass / qqbot_audit_reject 消息审核结果
QQBot表情回应添加/移除 qqbot_reaction_add / qqbot_reaction_remove 消息表情回应
QQBot音频开始/结束 qqbot_audio_start / qqbot_audio_finish 音频播放
QQBot消息删除 qqbot_message_delete 消息被删除
QQBot论坛事件 qqbot_forum_* 论坛主帖/帖子/回复/审核(私域)

消息发送示例

from ErisPulse import sdk
qqbot = sdk.adapter.get("qqbot")

# 发送文本消息
await qqbot.Send.To("user", user_openid).Text("Hello World!")

# 发送带@的消息(群/私聊自动使用 qqbot-at-user 格式)
await qqbot.Send.To("group", group_openid).At("member_openid").Text("@你")
await qqbot.Send.To("group", group_openid).AtAll().Text("公告通知")

# 发送回复消息(被动回复)
await qqbot.Send.To("group", group_openid).Reply("msg_id").Text("回复内容")

# 发送图片(URL / 本地路径 / 二进制三态;超过5MB自动分片上传)
await qqbot.Send.To("group", group_openid).Image("https://example.com/image.png")

# 发送 Markdown(原生 / 模板)
await qqbot.Send.To("group", group_openid).Markdown("# 标题\n- 列表项")
await qqbot.Send.To("user", user_openid).Markdown(template_id=1, kv=[{"key": "title", "value": "通知"}])

# 发送 Ark 模板消息
await qqbot.Send.To("user", user_openid).Ark(template_id=1, kv=[{"key": "title", "value": "标题"}])

# 发送 Embed 消息(频道)
await qqbot.Send.To("channel", channel_id).Embed({"title": "标题", "content": "内容"})

# 发送带键盘的消息(自动置为 markdown 类型并附带 bot_appid)
keyboard = {"content": {"rows": [[{"label": "确认", "type": 2, "data": "confirm"}]]}}
await qqbot.Send.To("group", group_openid).Keyboard(keyboard).Text("请选择")

# 流式消息(单聊)
await qqbot.Send.To("user", user_openid).Stream("回答内容")

# 多账户
await qqbot.Send.Using("account2").To("group", group_openid).Text("来自第二个机器人")

# 使用 Raw_ob12 发送 OneBot12 格式消息
message = [
    {"type": "text", "data": {"text": "第一行"}},
    {"type": "image", "data": {"file": "https://example.com/img.jpg"}},
]
await qqbot.Send.To("group", group_openid).Raw_ob12(message)

标准Api动作与请求操作(v5 新增)

# OneBot12 标准Api动作(跨平台统一调用)
result = await qqbot.Api.get_self_info()                     # 机器人信息
result = await qqbot.Api.get_group_info(group_openid)        # 群信息
result = await qqbot.Api.get_group_member_list(group_openid) # 群成员列表(自动分页)
result = await qqbot.Api.get_guild_list()                    # 频道列表
result = await qqbot.Api.get_channel_list(guild_id)          # 子频道列表
await qqbot.Api.delete_message(message_id)                   # 撤回消息(自动路由端点)
result = await qqbot.Api.get_status()                        # 运行状态

# 请求操作:入群申请审批
from ErisPulse.Core.Event import request as request_event

@request_event.on_request()
async def handle_join(event):
    if event.get("platform") == "qqbot":
        await event.approve()                     # 同意
        # await event.reject(comment="理由")      # 拒绝

配置说明

首次运行会自动生成默认配置。

# config.toml
[QQBot_Adapter]
intents = "[0, 9, 12, 25, 26, 27]"    # 订阅的事件 intents(JSON数组,支持事件名)

[QQBot_Adapter.accounts.default]
appid = "YOUR_APPID"                  # QQ机器人应用ID(必填)
secret = "YOUR_CLIENT_SECRET"         # QQ机器人客户端密钥(必填)
mode = "websocket"                    # websocket / webhook
bot_id = ""                           # 留空自动获取(可手动填写用于 Using() 定位)
gateway_url = ""                      # WebSocket网关(留空动态获取)
api_base_url = "https://api.bot.qq.com"
webhook_path = "/webhook"             # mode=webhook 时生效
enabled = true

配置项说明:

  • appid / secret:从 QQ开放平台 获取(必填)
  • mode:事件接收方式,websocket(默认,长连接)或 webhook(HTTP 回调 + Ed25519 验签)
  • intents:事件订阅,支持位序号或事件名,常用:0 频道 / 9,30 频道消息 / 12 频道私信 / 24 群成员 / 25 群私聊 / 26 交互 / 27 审核
  • gateway_url:WebSocket 网关地址,留空时通过 /gateway/bot 动态获取(支持代理/私有部署)
  • api_base_url:OpenAPI 根地址,默认 https://api.bot.qq.com
  • 多账户:在 accounts 下添加多个账户即可并行接入(可混合 websocket/webhook 模式)

⚠️ v5 破坏性变更:官方已统一使用 api.bot.qq.com,sandbox 配置废弃(自动迁移忽略);旧版扁平配置自动迁移到 accounts.default。


QQBot平台特有功能

请参考 QQBot平台特性文档 了解QQBot平台的特有功能,包括openid体系、频道系统、群管理API、菜单面板、流式消息、消息审核、交互事件、Webhook接入等内容。

详细的事件转换对照请参考 转换对照文档。

事件监听示例

使用 Event 模块(推荐)

from ErisPulse.Core.Event import message, notice, request

# @消息(群内@机器人触发,适配器自动注入机器人 mention 段)
@message.on_at_message()
async def handle_at(event):
    if event["platform"] == "qqbot":
        text = event.get_text()
        if text == "签到":
            await event.reply("已签到")

@message.on_message()
async def handle_message(event):
    if event["platform"] == "qqbot":
        detail_type = event["detail_type"]
        if detail_type == "private":
            pass  # 处理私聊消息
        elif detail_type == "group":
            pass  # 处理群消息
        elif detail_type == "channel":
            pass  # 处理频道消息

@notice.on_notice()
async def handle_notice(event):
    if event["platform"] == "qqbot":
        detail_type = event["detail_type"]
        if detail_type == "qqbot_interaction":
            button_id = event.get("qqbot_button_id", "")

@request.on_request()
async def handle_request(event):
    if event["platform"] == "qqbot":
        await event.approve()  # 自动审批入群申请

使用平台原生事件

qqbot = sdk.adapter.get("qqbot")

@qqbot.on("C2C_MESSAGE_CREATE")
async def handle_private_message(data):
    pass

@qqbot.on("GROUP_JOIN_REQUEST")
async def handle_join_request(data):
    pass

使用 OneBot12 标准事件

@sdk.adapter.on("message")
async def handle_message(event):
    if event["platform"] == "qqbot":
        bot_id = event["self"]["user_id"]
        print(f"消息来自Bot: {bot_id}")

注意事项:

  1. 确保在调用 startup() 前完成所有处理器的注册
  2. QQBot使用 openid 体系而非QQ号,用户和群的标识均为 openid 字符串
  3. 群消息默认仅在用户@机器人时才会收到(GROUP_AT_MESSAGE_CREATE);如需接收全部群消息,请在 QQ开放平台 机器人管理后台开启权限(无API),非@消息将以 GROUP_MESSAGE_CREATE 推送
  4. @检测已支持:适配器自动解析 <@openid>/<qqbot-at-user> 两种标记并注入/归一化机器人 mention 段,on_at_message()/event.is_at_message() 可直接使用;同时自动学习机器人在各群的 openid,"接收全部群消息"模式下 GROUP_MESSAGE_CREATE 中的@消息也能识别
  5. 发送的消息可能需要经过审核,通过 qqbot_audit_pass/qqbot_audit_reject 事件通知结果
  6. 媒体文件(图片、视频等)会上传后通过 file_info 发送,支持URL、本地路径和二进制数据;超过5MB自动分片上传
  7. 程序退出时请调用 shutdown() 确保资源释放
  8. access_token 有效期为7200秒,适配器提前45秒自动刷新
  9. 群管理部分API(成员列表、入群审批等)仅对白名单机器人开放

参考链接

Metadata

Release files for ErisPulse-QQBotAdapter 5.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ErisPulse-QQBotAdapter 5.0.1
File Size Uploaded
erispulse_qqbotadapter-5.0.1.tar.gz 41.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ErisPulse-QQBotAdapter 5.0.1
File Interpreter ABI Platform
erispulse_qqbotadapter-5.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 80.2 kB

Release files / erispulse_qqbotadapter-5.0.1.tar.gz

Download URL erispulse_qqbotadapter-5.0.1.tar.gz
Size 41.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6214a968fc9556322b30641cb9a63a743f4a35aaae8e0555f0a07eaad27465d5
BLAKE2b-256 checksum
How to use checksums
6c5db29cffad15ccc754bdc3126c98bc2407f7954862bbf3d31cb7f47aede11d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release files / erispulse_qqbotadapter-5.0.1-py3-none-any.whl

Download URL erispulse_qqbotadapter-5.0.1-py3-none-any.whl
Size 38.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
41b713ea897f9d934b5c3aabfa345f2a8ad81b56cd99222c40c5a1df10a40f62
BLAKE2b-256 checksum
How to use checksums
7374e826011b724f479123af52a421b2204e602831698410a26ba6d8e4fdb56d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

5.0.1 This release

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page