Skip to content

QQ 官方机器人 ​

QQ 开放平台官方机器人。支持 websockets(官方加密网关)/ ws / webhook 三种接收方式,发送统一走 OpenAPI REST。接收最全(文本 / @ / 图片 / 视频 / 语音+ASR / 文件 / 引用 / ARK 卡片 / 表情),发送支持富媒体与 markdown + 按钮(keyboard)。

适配器类型:"qq" 源码:src/adapter/qq/ 协议:QQ 开放平台官方机器人(api-v2,网关 + REST 发送),与 onebot11 无关。

说明 ​

特点 ​

  • 支持三种接收方式:websockets(官方加密网关 wss://)、ws(明文网关)、webhook(HTTP 回调)
  • 发送统一走 OpenAPI REST,支持文本、图片、视频、语音、文件、Markdown、按钮
  • 接收事件最全:群@、单聊、群消息、频道消息、好友/群关系事件、按钮交互、消息审核
  • 两种凭据模式:AppSecret(自动换取 access_token)或 BotToken(直接使用)

原理 ​

  • 接收:WebSocket 网关订阅事件(intents 按位或),或 HTTP 回调接收推送
  • 发送:POST https://api.bot.qq.com/v2/...,请求头 Authorization: QQBot {access_token}
  • 富媒体:先调 /files 上传获取 file_info,再以 msg_type:7 + media.file_info 发送

前提 ​

  • QQ 开放平台注册并创建机器人,获取 AppID 与 AppSecret(或 BotToken)
  • 机器人已加入目标群(群设置 → 群机器人 → 添加)
  • websockets/ws 模式国内可直连,无需公网回调;webhook 模式需要公网可访问的回调 URL

安装 ​

适配器安装 ​

bash
van adapter install qq

依赖库 ​

bash
npm install ws

配置 ​

方式一:websockets(官方加密网关)——默认 ​

jsonc
{
  "botId": "QQ-Official",
  "type": "qq",
  "mode": "websockets",
  "appId": "你的Appid",
  "appSecret": "你的AppSecret",
  "intents": 33554432,
  "gateway": "",
  "reconnectDelay": 5000
}

方式二:ws(明文 WebSocket 网关) ​

jsonc
{
  "botId": "QQ-Official",
  "type": "qq",
  "mode": "ws",
  "appId": "你的Appid",
  "appSecret": "你的AppSecret",
  "gateway": "ws://127.0.0.1:8080",
  "intents": 33554432
}

方式三:webhook(HTTP 回调) ​

jsonc
{
  "botId": "QQ-Official",
  "type": "qq",
  "mode": "webhook",
  "appId": "你的Appid",
  "appSecret": "你的AppSecret",
  "port": 8080,
  "path": "/",
  "intents": 33554432
}

配置说明 ​

配置项必填说明
mode可选接收方式:websockets(默认)/ ws / webhook
appId✅QQ 开放平台 AppID
appSecret二选一AppSecret,自动换取 7200 秒有效的 access_token
botToken二选一群机器人令牌,access_token = AppID.BotToken,无需换取
intents可选事件订阅位掩码,默认 33554432(群聊+单聊)
gateway可选网关地址,默认自动获取;ws 模式必填明文网关地址
portwebhook 模式HTTP 回调监听端口,默认 8080
pathwebhook 模式回调路径,默认 "/"
reconnectDelay可选断线重连延迟毫秒,默认 5000

intents 订阅 ​

默认订阅 GROUP_AND_C2C_EVENT | GUILD_MESSAGES | PUBLIC_GUILD_MESSAGES。如需更多事件,按位或后填入:

Intent值覆盖事件
GUILDS1频道相关
GUILD_MEMBERS2频道成员变动
GUILD_MESSAGES512频道消息
GUILD_MESSAGE_REACTIONS1024频道消息表态
DIRECT_MESSAGE4096频道私信
GROUP_AND_C2C_EVENT33554432群@+单聊+好友/群关系事件(默认)
INTERACTION67108864交互事件(按钮)
MESSAGE_AUDIT134217728消息审核
FORUMS_EVENT268435456论坛事件(仅私域)
AUDIO_ACTION536870912音频动作
PUBLIC_GUILD_MESSAGES1073741824公域频道消息

接收事件 ​

QQ 事件 t框架事件说明
GROUP_AT_MESSAGE_CREATEgroup_message群里 @ 机器人
C2C_MESSAGE_CREATEprivate_message用户单聊机器人
GROUP_MESSAGE_CREATEgroup_message群消息(需订阅)
MESSAGE_CREATE / AT_MESSAGE_CREATEgroup_message频道消息
GROUP_ADD_ROBOT / GROUP_DEL_ROBOT / FRIEND_ADD 等notice好友/群/单聊关系事件
INTERACTION_CREATEnotice按钮点击回调

事件对象字段:

ts
{
  botId: "QQ-Official",
  selfId: "102123456",
  userId: "USER_OPEN_xxx",      // 用户 openid
  groupId: "GROUP_OPEN_xxx",    // 群 openid
  message: [{ type: "text", data: { text: "你好" } }],
  postType: "group_message" | "private_message" | "notice",
  raw: { ...原始事件, sender: {user_id, member_openid, user_openid}, message_id, time, platform: "qq-official" }
}

消息段 ​

类型消息段数据来源
文本textcontent(已去 @机器人 前缀)
图片imageattachments[](content_type=image/*)
视频videoattachments[](content_type=video/*)
语音recordattachments[](含 asr 语音转文字)
文件fileattachments[](content_type=file)
引用消息replymessage_type=103
@某人atmentions[]
表情facecontent 内 <emoji:id/>
ARK 卡片jsonmessage_type=3 + ark_data

QQ 使用 openid(不是 QQ 号),userId/groupId 都存 openid。

API 调用 ​

插件统一通过 bot.callApi(action, params) 调用。

发送消息 ​

action说明关键参数
send_group_msg发送群消息group_id, message
send_private_msg发送单聊user_id, message
send_msg自动判断群/私聊group_id 或 user_id, message
ts
await bot.callApi("send_msg", { group_id: "GROUP_OPEN_xxx", message: "大家好" })

消息段 ​

message 支持字符串或段数组:

ts
// 纯文本
{ type: "text", data: { text: "文本" } }

// Markdown(需开通权限)
{ type: "markdown", data: { content: "# 标题\n**加粗**" } }

// Markdown + 按钮
[
  { type: "markdown", data: { content: "# 标题" } },
  { type: "button", data: { text: "点赞", callback: "like" } },
  { type: "button", data: { text: "官网", url: "https://qq.com", row: 1 } }
]

// 富媒体(图片/视频/语音/文件)
{ type: "image",  data: { url: "https://example.com/a.jpg" } }
{ type: "video",  data: { url: "https://example.com/v.mp4" } }
{ type: "record", data: { url: "https://example.com/v.silk" } }
{ type: "file",   data: { url: "https://example.com/a.pdf" } }
{ type: "image",  data: { file: "base64://iVBORw0KGgo..." } }

撤回消息 ​

action说明关键参数
delete_msg / recall_msg自动判断群/私聊撤回message_id, group_id 或 user_id

只能撤回机器人自己发的、且发送未超过 2 分钟的消息。

查询消息 ​

action说明关键参数
get_msg获取单条消息message_id, group_id 或 user_id
get_group_msg_list群消息列表group_id

富媒体文件 ​

action说明关键参数
upload_group_file上传群文件group_id, file_type(1图/3视频/4语音/5文件), url 或 file_data
upload_private_file上传单聊文件user_id, file_type, url 或 file_data

表情表态 ​

action说明关键参数
set_msg_emoji_like消息表情表态message_id, group_id 或 user_id, emoji_type
delete_msg_emoji_like取消表态message_id, group_id 或 user_id

群管理 ​

action说明关键参数
get_group_member_list群成员列表group_id
get_group_member_info群成员信息group_id, member_openid / user_id
set_group_ban禁言成员group_id, member_openid, duration(秒)
unset_group_ban解除禁言group_id, member_openid
set_group_kick移出群group_id, member_openid
set_group_nickname设置群昵称group_id, member_openid, nickname

群管理接口认 member_openid(事件 raw.sender.member_openid),不是 user_openid。

C2C / 好友 ​

action说明关键参数
set_friend_add加好友user_id
delete_friend删好友user_id
set_user_block拉黑用户user_id
unset_user_block解除拉黑user_id

按钮回调回应 ​

用户点击按钮后推送 INTERACTION_CREATE 事件,需调用本接口回应:

ts
if (event.raw.notice_type === "INTERACTION_CREATE") {
  await bot.callApi("reply_interaction", {
    interaction_id: event.raw.interaction_id,
    code: 0
  })
}

其他 ​

action说明
get_self_info / get_me获取机器人自身信息
get_audit_result消息审核结果(需订阅 MESSAGE_AUDIT)

常见问题 ​

  • appId/botToken 从哪来:QQ 开放平台 → 创建机器人 → 开发设置 → 查看 AppID 与 BotToken。
  • 机器人怎么进群:群设置 → 群机器人 → 添加你的机器人(需群主/管理员)。个人开发者可加进 ≤20 人的测试群。
  • 群 openid 哪来:机器人收到群消息后,事件里的 groupId 就是群 openid。
  • 机器人主动私聊用户有限制:QQ 限制机器人主动发消息次数(每月 3 条),被 @ 或用户先私聊后被动回复无限。
  • 收不到群里所有消息:只订阅 GROUP_AND_C2C_EVENT 时,群消息默认只在 @ 机器人时推送。需在开放平台控制台开启"接收所有消息"。
  • 机器人自己发的消息收不到:QQ 官方平台本身不推送机器人自己发出的消息。

相关项目 ​

Just run の Bot · 一套插件,全平台机器人