[CQ:at]
🧪 测试插件:CQ-at(发送「at检测」)、CQ-normal_at(发送「普通at」)体验
用途
[CQ:at] 用于在群聊中 @ 提及某个用户或机器人。在 QQ Bot API 中,@ 行为通过 <@OpenID> 语法实现,Gensokyo 负责在虚拟 ID 和真实 OpenID 之间进行转换。
范围:q群 (Group Chat)
语法
text
[CQ:at,qq=虚拟ID或特殊值]参数
| 参数名 | 必填 | 说明 |
|---|---|---|
qq | ✅ | 要 @ 的用户虚拟 ID(int64),或特殊值 all(@全体成员) |
解析行为
出站(OneBot → QQ)
[CQ:at,qq=12345]中的12345是 Gensokyo 的虚拟 ID。- Gensokyo 通过 idmap 系统将虚拟 ID 反查为真实 OpenID。
- 转换为 QQ Bot API 的
<@OpenID>语法嵌入消息正文。 - 如果反查失败,@ 标签会被忽略或保留原文。
入站(QQ → OneBot)
- QQ 消息中的
<@OpenID>由 Gensokyo 自动识别。 - 通过 idmap 系统将 OpenID 映射为虚拟 ID。
- 根据配置决定是否剥离 @Bot 自身:
remove_at=true:剥离入站消息中的 @Botremove_bot_at_group=true:出站时隐藏 Bot 发出的 @
数组模式
入站数组模式下,@ 会被上报为独立的 at 段:
json
[
{"type": "at", "data": {"qq": "12345"}},
{"type": "text", "data": {"text": "你好"}}
]发送行为
群聊(普通文本路径,msg_type=0)
[CQ:at,qq=虚拟ID] → 反查 OpenID → 转为 <@OpenID> 嵌入消息正文。
群聊(Markdown 路径,msg_type=2)
[CQ:at,qq=虚拟ID] → 反查 OpenID → 转为 Markdown @ 标签 <qqbot-at-user id=OpenID>。
图文混合(msg_type=7)
同普通文本路径,@ 转为 <@OpenID> 嵌入正文。
add_at_group 配置
当 add_at_group=true 时,出站群消息会自动在开头添加 [CQ:at,qq=AppID](@Bot 自身),仅在全量群消息(GROUP_MESSAGE_CREATE)中生效。
使用示例
NoneBot 插件
python
from nonebot.adapters.onebot.v11 import Message, MessageSegment
await bot.send_group_msg(
group_id=123456,
message=Message([
MessageSegment.at(12345), # @ 虚拟 ID 为 12345 的用户
MessageSegment.text(" 你好!"),
]),
)CQ 码字符串格式
text
[CQ:at,qq=12345]
[CQ:at,qq=all] // @全体成员(QQ Bot API 可能不支持)注意
[CQ:at]仅在群聊场景有效,私聊(C2C)不支持 @ 功能。- @ 的目标必须是已建立 idmap 映射的用户,否则反查失败。
- 全量群消息和被动群消息的 @Bot 剥离行为不同,详见
remove_at和remove_bot_at_group配置。 - QQ Bot API 的 @ 语法与 go-cqhttp 等第三方实现不同,Gensokyo 已自动处理差异。
