CQ 码 / CQ Code
CQ 码是指 CQ 中特殊消息类型的文本格式, 这是它的基本语法:
[CQ:类型,参数=值,参数=值]
在 QQ 中, 一个消息由多个部分构成, 例如一段文本, 一个图片, at 某人的一个部分. CQ 中定义了与这些消息相符的 CQ 码, 以方便用户使用.
例如, 下面是由一个 at 部分和一个文本部分构成的合法 CQ 消息串
[CQ:at,qq=114514]早上好啊
例如qq号为114514的人昵称为"小明", 那么上述消息串在QQ中的渲染是这样的:
@小明 早上好啊
注意, CQ 码中不应该有多余的空格, 请不要在任何逗号后或前添加空格, 它会被识别为参数或参数值的一部分.
关于 CQ 码对应的 JSON 格式说明, 参考:go-cqhttp 帮助中心: 参考
转义
CQ 码由字符[
起始, 以]
结束, 并且以,
分割各个参数, 如果你的 CQ 码中, 参数值包括了这些字符, 那么它们应该被使用 HTML 特殊字符的编码方式进行转义.
字符 | 对应实体转义序列 |
---|---|
& | & |
[ | [ |
] | ] |
, | , |
消息类型
下面规定了 CQ 所支持的特殊消息类型
QQ 表情
Type:face
{"type":"face","data":{"id":"123"}}
2
3
4
5
6
[CQ:face,id=123]
参数 :
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
id | ✓ | ✓ | 见QQ 表情 ID 表open in new window | QQ 表情 ID |
语音
{"type":"record","data":{"file":"http://baidu.com/1.mp3"}}
2
3
4
5
6
[CQ:record,file=http://baidu.com/1.mp3]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
file | ✓ | ✓[1] | - | 语音文件名 |
magic | ✓ | ✓ | 0 1 | 发送时可选, 默认0 , 设置为1 表示变声 |
url | ✓ | - | 语音 URL | |
cache | ✓ | 0 1 | 只在通过网络 URL 发送时有效, 表示是否使用已缓存的文件, 默认1 | |
proxy | ✓ | 0 1 | 只在通过网络 URL 发送时有效, 表示是否通过代理下载文件 ( 需通过环境变量或配置文件配置代理 ) , 默认1 | |
timeout | ✓ | - | 只在通过网络 URL 发送时有效, 单位秒, 表示下载网络文件的超时时间 , 默认不超时 |
[1] 发送时,file
参数除了支持使用收到的语音文件名直接发送外, 还支持其它形式, 参考图片。
短视频
注意
go-cqhttp-v0.9.38 起开始支持发送,需要依赖ffmpeg
{"type":"video","data":{"file":"http://baidu.com/1.mp4"}}
2
3
4
5
6
[CQ:video,file=http://baidu.com/1.mp4]
参数名 | 类型 | 可能的值 | 说明 |
---|---|---|---|
file | string | - | 视频地址, 支持http和file发送 |
cover | string | - | 视频封面, 支持http, file和base64发送, 格式必须为jpg |
c | int | 2 3 | 通过网络下载视频时的线程数, 默认单线程. (在资源不支持并发时会自动处理) |
@某人
{"type":"at","data":{"qq":"10001000","name":"此栏无效,此人在群里"}}
2
3
4
5
6
7
[CQ:at,qq=10001000][CQ:at,qq=123,name=不在群的QQ][CQ:at,qq=all]
2
3
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
qq | ✓ | ✓ | QQ 号、all | @的 QQ 号,all 表示全体成员 |
name | ✓ | 字符串 | 当在群中找不到此QQ号的名称时才会生效 |
猜拳魔法表情
注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
{"type":"rps","data":{}}
2
3
4
[CQ:rps]
掷骰子魔法表情
注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
{"type":"dice","data":{}}
2
3
4
[CQ:dice]
发
窗口抖动(戳一戳)注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
提示
相当于戳一戳最基本类型的快捷方式
{"type":"shake","data":{}}
2
3
4
[CQ:shake]
发
匿名发消息注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
提示
当收到匿名消息时, 需要通过消息事件的群消息 的anonymous
字段判断
{"type":"anonymous","data":{}}
2
3
4
[CQ:anonymous]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
ignore | ✓ | 0 1 | 可选, 表示无法匿名时是否继续发送 |
链接分享
{"type":"share","data":{"url":"http://baidu.com","title":"百度"}}
2
3
4
5
6
7
[CQ:share,url=http://baidu.com,title=百度]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
url | ✓ | ✓ | - | URL |
title | ✓ | ✓ | - | 标题 |
content | ✓ | ✓ | - | 发送时可选, 内容描述 |
image | ✓ | ✓ | - | 发送时可选, 图片 URL |
推荐好友/群
注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
[CQ:contact,type=qq,id=10001000][CQ:contact,type=group,id=100100]
2
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
type | ✓ | ✓ | qq /group | 推荐好友/群 |
id | ✓ | ✓ | - | 被推荐的 QQ (群)号 |
位置
注意
该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持提交 propen in new window
{"type":"location","data":{"lat":"39.8969426","lon":"116.3109099"}}
2
3
4
5
6
7
[CQ:location,lat=39.8969426,lon=116.3109099]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
lat | ✓ | ✓ | - | 纬度 |
lon | ✓ | ✓ | - | 经度 |
title | ✓ | ✓ | - | 发送时可选, 标题 |
content | ✓ | ✓ | - | 发送时可选, 内容描述 |
发
音乐分享{"type":"music","data":{"type":"163","id":"28949129"}}
2
3
4
5
6
7
[CQ:music,type=163,id=28949129]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
type | ✓ | qq 163 xm | 分别表示使用 QQ 音乐、网易云音乐、虾米音乐 | |
id | ✓ | - | 歌曲 ID |
发
音乐自定义分享{"type":"music","data":{"type":"custom","url":"http://baidu.com","audio":"http://baidu.com/1.mp3","title":"音乐标题"}}
2
3
4
5
6
7
8
9
[CQ:music,type=custom,url=http://baidu.com,audio=http://baidu.com/1.mp3,title=音乐标题]
参数名 | 收 | 发 | 可能的值 | 说明 |
---|---|---|---|---|
type | ✓ | custom | 表示音乐自定义分享 | |
url | ✓ | - | 点击后跳转目标 URL | |
audio | ✓ | - | 音乐 URL | |
title | ✓ | - | 标题 | |
content | ✓ | - | 发送时可选, 内容描述 | |
image | ✓ | - | 发送时可选, 图片 URL |
图片
Type :image
范围:发送/接收
参数:
参数名 | 可能的值 | 说明 |
---|---|---|
file | - | 图片文件名 |
type | flash ,show | 图片类型,flash 表示闪照,show 表示秀图, 默认普通图片 |
subType | - | 图片子类型, 只出现在群聊. |
url | - | 图片 URL |
cache | 0 1 | 只在通过网络 URL 发送时有效, 表示是否使用已缓存的文件, 默认1 |
id | - | 发送秀图时的特效id, 默认为40000 |
c | 2 3 | 通过网络下载图片时的线程数, 默认单线程. (在资源不支持并发时会自动处理) |
可用的特效ID:
id | 类型 |
---|---|
40000 | 普通 |
40001 | 幻影 |
40002 | 抖动 |
40003 | 生日 |
40004 | 爱你 |
40005 | 征友 |
子类型列表:
value | 说明 |
---|---|
0 | 正常图片 |
1 | 表情包, 在客户端会被分类到表情包图片并缩放显示 |
2 | 热图 |
3 | 斗图 |
4 | 智图? |
7 | 贴图 |
8 | 自拍 |
9 | 贴图广告? |
10 | 有待测试 |
13 | 热搜图 |
发送时,file
参数支持:
- 绝对路径,例如
file:///C:\\Users\Alice\Pictures\1.png
,格式使用file
URIopen in new window - 网络 URL,例如
https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
- Base64 编码,例如
base64://iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAAKElEQVQ4EWPk5+RmIBcwkasRpG9UM4mhNxpgowFGMARGEwnBIEJVAAAdBgBNAZf+QAAAAABJRU5ErkJggg==
示例:[CQ:image,file=http://baidu.com/1.jpg,type=show,id=40004]
注意
图片最大不能超过30MB
PNG格式不会被压缩, JPG可能不会二次压缩, GIF非动图转成PNG
GIF动图原样发送(总帧数最大300张, 超过无法发出, 无论循不循环)
回复
Type :reply
提示
如果id
和text
同时存在, 将采用自定义reply并替换原有信息 如果id
获取失败, 将回退到自定义reply
范围:发送/接收
参数:
参数名 | 类型 | 说明 |
---|---|---|
id | int | 回复时所引用的消息id, 必须为本群消息. |
text | string | 自定义回复的信息 |
qq | int64 | 自定义回复时的自定义QQ, 如果使用自定义信息必须指定. |
time | int64 | 自定义回复时的时间, 格式为Unix时间 |
seq | int64 | 起始消息序号, 可通过get_msg 获得 |
示例:[CQ:reply,id=123456]
自定义回复示例:[CQ:reply,text=Hello World,qq=10086,time=3376656000,seq=5123]
收
红包Type:redbag
参数:
参数名 | 类型 | 说明 |
---|---|---|
title | string | 祝福语/口令 |
示例:[CQ:redbag,title=恭喜发财]
发
戳一戳注意
发送戳一戳消息无法撤回, 返回的message id
恒定为0
Type:poke
范围:仅群聊
参数:
参数名 | 类型 | 说明 |
---|---|---|
qq | int64 | 需要戳的成员 |
示例:[CQ:poke,qq=123456]
发
礼物注意
仅支持免费礼物, 发送群礼物消息 无法撤回, 返回的message id
恒定为0
Type:gift
范围:仅群聊,接收的时候不是 CQ 码
参数 :
参数名 | 类型 | 说明 |
---|---|---|
qq | int64 | 接收礼物的成员 |
id | int | 礼物的类型 |
目前支持的礼物 ID :
id | 类型 |
---|---|
0 | 甜 Wink |
1 | 快乐肥宅水 |
2 | 幸运手链 |
3 | 卡布奇诺 |
4 | 猫咪手表 |
5 | 绒绒手套 |
6 | 彩虹糖果 |
7 | 坚强 |
8 | 告白话筒 |
9 | 牵你的手 |
10 | 可爱猫咪 |
11 | 神秘面具 |
12 | 我超忙的 |
13 | 爱心口罩 |
示例:[CQ:gift,qq=123456,id=8]
收
合并转发Type:forward
参数:
参数名 | 类型 | 说明 |
---|---|---|
id | string | 合并转发ID, 需要通过/get_forward_msg API获取转发的具体内容 |
示例:[CQ:forward,id=xxxx]
发
合并转发消息节点Type:node
参数:
参数名 | 类型 | 说明 | 特殊说明 |
---|---|---|---|
id | int32 | 转发消息id | 直接引用他人的消息合并转发, 实际查看顺序为原消息发送顺序与下面的自定义消息二选一 |
name | string | 发送者显示名字 | 用于自定义消息 (自定义消息并合并转发, 实际查看顺序为自定义消息段顺序) |
uin | int64 | 发送者QQ号 | 用于自定义消息 |
content | message | 具体消息 | 用于自定义消息不支持转发套娃 |
seq | message | 具体消息 | 用于自定义消息 |
特殊说明:需要使用单独的API/send_group_forward_msg
发送, 并且由于消息段较为复杂, 仅支持Array形式入参。 如果引用消息和自定义消息同时出现, 实际查看顺序将取消息段顺序. 另外按Onebot v11open in new window 文档说明,data
应全为字符串, 但由于需要接收message
类型的消息, 所以仅限此Type的content字段 支持Array套娃
示例:
直接引用消息合并转发:
[{"type":"node","data":{"id":"123"}},{"type":"node","data":{"id":"456"}}]
2
3
4
5
6
7
8
9
10
11
12
13
14
自定义消息合并转发:
[{"type":"node","data":{"name":"消息发送者A","uin":"10086","content":[{"type":"text","data":{"text":"测试消息1"}}]}},{"type":"node","data":{"name":"消息发送者B","uin":"10087","content":"[CQ:image,file=xxxxx]测试消息2"}}]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
引用自定义混合合并转发:
[{"type":"node","data":{"name":"自定义发送者","uin":"10086","content":"我是自定义消息","seq":"5123","time":"3376656000"}},{"type":"node","data":{"id":"123"}}]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
XML 消息
Type:xml
范围:发送 / 接收
参数:
参数名 | 类型 | 说明 |
---|---|---|
data | string | xml内容, xml中的value部分, 记得实体化处理 |
resid | int32 | 可能为空, 或空字符串 |
示例:[CQ:xml,data=xxxx]
一些 xml 样例
ps:重要 : xml 中的 value 部分, 记得 html 实体化处理后, 再打加入到 CQ 码中
QQ 音乐
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msgserviceID="2"templateID="1"action="web"brief="[分享] 十年"sourceMsgId="0"url="https://i.y.qq.com/v8/playsong.html?_wv=1&songid=4830342&souce=qqshare&source=qqshare&ADTAG=qqshare"flag="0"adverSign="0"multiMsgFlag="0"><itemlayout="2"><audiocover="http://imgcache.qq.com/music/photo/album_500/26/500_albumpic_89526_0.jpg"src="http://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=1535153710&vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&uin=&fromtag=3"/><title>十年</title><summary>陈奕迅</summary></item><sourcename="QQ音乐"icon="https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png"url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856"action="app"a_actionData="com.tencent.qqmusic"i_actionData="tencent1101079856://"appid="1101079856"/></msg>
网易音乐
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msgserviceID="2"templateID="1"action="web"brief="[分享] 十年"sourceMsgId="0"url="http://music.163.com/m/song/409650368"flag="0"adverSign="0"multiMsgFlag="0"><itemlayout="2"><audiocover="http://p2.music.126.net/g-Qgb9ibk9Wp_0HWra0xQQ==/16636710440565853.jpg?param=90y90"src="https://music.163.com/song/media/outer/url?id=409650368.mp3"/><title>十年</title><summary>黄梦之</summary></item><sourcename="网易云音乐"icon="https://pic.rmb.bdstatic.com/911423bee2bef937975b29b265d737b3.png"url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856"action="app"a_actionData="com.netease.cloudmusic"i_actionData="tencent100495085://"appid="100495085"/></msg>
卡片消息 1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><msgserviceID="1"><item><title>生死8秒!女司机高速急刹, 他一个操作救下一车性命</title></item><sourcename="官方认证消息"icon="https://qzs.qq.com/ac/qzone_v5/client/auth_icon.png"action=""appid="-1"/></msg>
2
3
4
5
卡片消息 2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><msgserviceID="1"><itemlayout="4"><title>test title</title><picturecover="http://url.cn/5CEwIUy"/></item></msg>
2
3
4
5
6
7
JSON 消息
Type:json
范围:发送/接收
参数:
参数名 | 类型 | 说明 |
---|---|---|
data | string | json内容, json的所有字符串记得实体化处理 |
resid | int32 | 默认不填为0, 走小程序通道, 填了走富文本通道发送 |
json中的字符串需要进行转义 :
","=>
,
"&"=>
&
"["=>
[
"]"=>
]
否则无法正确得到解析
示例 json 的 CQ 码 :
[CQ:json,data={"app":"com.tencent.miniapp","desc":"","view":"notification","ver":"0.0.0.1","prompt":"[应用]","appID":"","sourceName":"","actionData":"","actionData_A":"","sourceUrl":"","meta":{"notification":{"appInfo":{"appName":"全国疫情数据统计","appType":4,"appid":1109659848,"iconUrl":"http:\/\/gchat.qpic.cn\/gchatpic_new\/719328335\/-2010394141-6383A777BEB79B70B31CE250142D740F\/0"},"data":[{"title":"确诊","value":"80932"},{"title":"今日确诊","value":"28"},{"title":"疑似","value":"72"},{"title":"今日疑似","value":"5"},{"title":"治愈","value":"60197"},{"title":"今日治愈","value":"1513"},{"title":"死亡","value":"3140"},{"title":"今**亡","value":"17"}],"title":"中国加油, 武汉加油","button":[{"name":"病毒 : SARS-CoV-2, 其导致疾病命名 COVID-19","action":""},{"name":"传染源 : 新冠肺炎的患者。无症状感染者也可能成为传染源。","action":""}],"emphasis_keyword":""}},"text":"","sourceAd":""}]
发
cardimage一种xml的图片消息(装逼大图)
PS
xml 接口的消息都存在风控风险, 请自行兼容发送失败后的处理 ( 可以失败后走普通图片模式 )
Type:cardimage
参数:
参数名 | 类型 | 说明 |
---|---|---|
file | string | 和image的file字段对齐, 支持也是一样的 |
minwidth | int64 | 默认不填为400, 最小width |
minheight | int64 | 默认不填为400, 最小height |
maxwidth | int64 | 默认不填为500, 最大width |
maxheight | int64 | 默认不填为1000, 最大height |
source | string | 分享来源的名称, 可以留空 |
icon | string | 分享来源的icon图标url, 可以留空 |
示例cardimage 的cq码 :
[CQ:cardimage,file=https://i.pixiv.cat/img-master/img/2020/03/25/00/00/08/80334602_p0_master1200.jpg]
发
文本转语音注意
通过TX的TTS接口, 采用的音源与登录账号的性别有关
Type:tts
范围:仅群聊
参数:
参数名 | 类型 | 说明 |
---|---|---|
text | string | 内容 |
示例:[CQ:tts,text=这是一条测试消息]