CQ 码 / CQ Code

CQ 码是指 CQ 中特殊消息类型的文本格式, 这是它的基本语法:

[CQ:类型,参数=值,参数=值]
1

在 QQ 中, 一个消息由多个部分构成, 例如一段文本, 一个图片, at 某人的一个部分. CQ 中定义了与这些消息相符的 CQ 码, 以方便用户使用.

例如, 下面是由一个 at 部分和一个文本部分构成的合法 CQ 消息串

[CQ:at,qq=114514]早上好啊
1

例如qq号为114514的人昵称为"小明", 那么上述消息串在QQ中的渲染是这样的:

@小明 早上好啊
1

注意, CQ 码中不应该有多余的空格, 请不要在任何逗号后或前添加空格, 它会被识别为参数或参数值的一部分.

关于 CQ 码对应的 JSON 格式说明, 参考: go-cqhttp 帮助中心: 参考

转义

CQ 码由字符 [ 起始, 以 ] 结束, 并且以 , 分割各个参数, 如果你的 CQ 码中, 参数值包括了这些字符, 那么它们应该被使用 HTML 特殊字符的编码方式进行转义.

字符对应实体转义序列
&&
[[
]]
,,

消息类型

下面规定了 CQ 所支持的特殊消息类型

QQ 表情

Type: face

{
    "type": "face",
    "data": {
        "id": "123"
    }
}
1
2
3
4
5
6
[CQ:face,id=123]
1

参数 :

参数名可能的值说明
idQQ 表情 ID 表open in new windowQQ 表情 ID

语音

{
    "type": "record",
    "data": {
        "file": "http://baidu.com/1.mp3"
    }
}
1
2
3
4
5
6
[CQ:record,file=http://baidu.com/1.mp3]
1
参数名可能的值说明
file[1]-语音文件名
magic0 1发送时可选, 默认 0, 设置为 1 表示变声
url-语音 URL
cache0 1只在通过网络 URL 发送时有效, 表示是否使用已缓存的文件, 默认 1
proxy0 1只在通过网络 URL 发送时有效, 表示是否通过代理下载文件 ( 需通过环境变量或配置文件配置代理 ) , 默认 1
timeout-只在通过网络 URL 发送时有效, 单位秒, 表示下载网络文件的超时时间 , 默认不超时

[1] 发送时, file 参数除了支持使用收到的语音文件名直接发送外, 还支持其它形式, 参考 图片

短视频

注意

go-cqhttp-v0.9.38 起开始支持发送,需要依赖ffmpeg

{
    "type": "video",
    "data": {
        "file": "http://baidu.com/1.mp4"
    }
}
1
2
3
4
5
6
[CQ:video,file=http://baidu.com/1.mp4]
1
参数名类型可能的值说明
filestring-视频地址, 支持http和file发送
coverstring-视频封面, 支持http, file和base64发送, 格式必须为jpg
cint2 3通过网络下载视频时的线程数, 默认单线程. (在资源不支持并发时会自动处理)

@某人

{
    "type": "at",
    "data": {
        "qq": "10001000",
        "name": "此栏无效,此人在群里"
    }
}
1
2
3
4
5
6
7
[CQ:at,qq=10001000]
[CQ:at,qq=123,name=不在群的QQ]
[CQ:at,qq=all]
1
2
3
参数名可能的值说明
qqQQ 号、all@的 QQ 号, all 表示全体成员
name字符串当在群中找不到此QQ号的名称时才会生效

猜拳魔法表情

注意

该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持 提交 propen in new window

{
    "type": "rps",
    "data": {}
}
1
2
3
4
[CQ:rps]
1

掷骰子魔法表情

注意

该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持 提交 propen in new window

{
    "type": "dice",
    "data": {}
}
1
2
3
4
[CQ:dice]
1

窗口抖动(戳一戳)

注意

该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持 提交 propen in new window

提示

相当于戳一戳最基本类型的快捷方式

{
    "type": "shake",
    "data": {}
}
1
2
3
4
[CQ:shake]
1

匿名发消息

注意

该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持 提交 propen in new window

提示

当收到匿名消息时, 需要通过 消息事件的群消息anonymous 字段判断

{
    "type": "anonymous",
    "data": {}
}
1
2
3
4
[CQ:anonymous]
1
参数名可能的值说明
ignore0 1可选, 表示无法匿名时是否继续发送

链接分享

{
    "type": "share",
    "data": {
        "url": "http://baidu.com",
        "title": "百度"
    }
}
1
2
3
4
5
6
7
[CQ:share,url=http://baidu.com,title=百度]
1
参数名可能的值说明
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]
1
2
参数名可能的值说明
typeqq/group推荐好友/群
id-被推荐的 QQ (群)号

位置

注意

该 CQcode 暂未被 go-cqhttp 支持, 您可以提交 pr 以使该 CQcode 被支持 提交 propen in new window

{
    "type": "location",
    "data": {
        "lat": "39.8969426",
        "lon": "116.3109099"
    }
}
1
2
3
4
5
6
7
[CQ:location,lat=39.8969426,lon=116.3109099]
1
参数名可能的值说明
lat-纬度
lon-经度
title-发送时可选, 标题
content-发送时可选, 内容描述

音乐分享

{
    "type": "music",
    "data": {
        "type": "163",
        "id": "28949129"
    }
}
1
2
3
4
5
6
7
[CQ:music,type=163,id=28949129]
1
参数名可能的值说明
typeqq 163 xm分别表示使用 QQ 音乐、网易云音乐、虾米音乐
id-歌曲 ID

音乐自定义分享

{
    "type": "music",
    "data": {
        "type": "custom",
        "url": "http://baidu.com",
        "audio": "http://baidu.com/1.mp3",
        "title": "音乐标题"
    }
}
1
2
3
4
5
6
7
8
9
[CQ:music,type=custom,url=http://baidu.com,audio=http://baidu.com/1.mp3,title=音乐标题]
1
参数名可能的值说明
typecustom表示音乐自定义分享
url-点击后跳转目标 URL
audio-音乐 URL
title-标题
content-发送时可选, 内容描述
image-发送时可选, 图片 URL

图片

Type : image

范围: 发送/接收

参数:

参数名可能的值说明
file-图片文件名
typeflash, show图片类型, flash 表示闪照, show 表示秀图, 默认普通图片
subType-图片子类型, 只出现在群聊.
url-图片 URL
cache0 1只在通过网络 URL 发送时有效, 表示是否使用已缓存的文件, 默认 1
id-发送秀图时的特效id, 默认为40000
c2 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

提示

如果 idtext 同时存在, 将采用自定义reply并替换原有信息 如果 id 获取失败, 将回退到自定义reply

范围: 发送/接收

参数:

参数名类型说明
idint回复时所引用的消息id, 必须为本群消息.
textstring自定义回复的信息
qqint64自定义回复时的自定义QQ, 如果使用自定义信息必须指定.
timeint64自定义回复时的时间, 格式为Unix时间
seqint64起始消息序号, 可通过 get_msg 获得

示例: [CQ:reply,id=123456]
自定义回复示例: [CQ:reply,text=Hello World,qq=10086,time=3376656000,seq=5123]

红包

Type: redbag

参数:

参数名类型说明
titlestring祝福语/口令

示例: [CQ:redbag,title=恭喜发财]

戳一戳

注意

发送戳一戳消息无法撤回, 返回的 message id 恒定为 0

Type: poke

范围: 仅群聊

参数:

参数名类型说明
qqint64需要戳的成员

示例: [CQ:poke,qq=123456]

礼物

注意

仅支持免费礼物, 发送群礼物消息 无法撤回, 返回的 message id 恒定为 0

Type: gift

范围: 仅群聊,接收的时候不是 CQ 码

参数 :

参数名类型说明
qqint64接收礼物的成员
idint礼物的类型

目前支持的礼物 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

参数:

参数名类型说明
idstring合并转发ID, 需要通过 /get_forward_msg API获取转发的具体内容

示例: [CQ:forward,id=xxxx]

合并转发消息节点

Type: node

参数:

参数名类型说明特殊说明
idint32转发消息id直接引用他人的消息合并转发, 实际查看顺序为原消息发送顺序 与下面的自定义消息二选一
namestring发送者显示名字用于自定义消息 (自定义消息并合并转发, 实际查看顺序为自定义消息段顺序)
uinint64发送者QQ号用于自定义消息
contentmessage具体消息用于自定义消息 不支持转发套娃
seqmessage具体消息用于自定义消息

特殊说明: 需要使用单独的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"
		}
	}
]
1
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"
		}
	}
]
1
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"
        }
    }
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

XML 消息

Type: xml

范围: 发送 / 接收

参数:

参数名类型说明
datastringxml内容, xml中的value部分, 记得实体化处理
residint32可能为空, 或空字符串

示例: [CQ:xml,data=xxxx]

一些 xml 样例
ps:重要 : xml 中的 value 部分, 记得 html 实体化处理后, 再打加入到 CQ 码中
QQ 音乐
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="&#91;分享&#93; 十年" sourceMsgId="0" url="https://i.y.qq.com/v8/playsong.html?_wv=1&amp;songid=4830342&amp;souce=qqshare&amp;source=qqshare&amp;ADTAG=qqshare" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="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&amp;vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&amp;uin=&amp;fromtag=3" /><title>十年</title><summary>陈奕迅</summary></item><source name="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>
1
网易音乐
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="&#91;分享&#93; 十年" sourceMsgId="0" url="http://music.163.com/m/song/409650368" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="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><source name="网易云音乐" 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
卡片消息 1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<msg serviceID="1">
<item><title>生死8秒!女司机高速急刹, 他一个操作救下一车性命</title></item>
<source name="官方认证消息" icon="https://qzs.qq.com/ac/qzone_v5/client/auth_icon.png" action="" appid="-1" />
</msg>
1
2
3
4
5
卡片消息 2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<msg serviceID="1">
<item layout="4">
<title>test title</title>
<picture cover="http://url.cn/5CEwIUy"/>
</item>
</msg>
1
2
3
4
5
6
7

JSON 消息

Type: json

范围: 发送/接收

参数:

参数名类型说明
datastringjson内容, json的所有字符串记得实体化处理
residint32默认不填为0, 走小程序通道, 填了走富文本通道发送

json中的字符串需要进行转义 :

","=> &#44;

"&"=> &amp;

"["=> &#91;

"]"=> &#93;

否则无法正确得到解析

示例 json 的 CQ 码 :

[CQ:json,data={"app":"com.tencent.miniapp"&#44;"desc":""&#44;"view":"notification"&#44;"ver":"0.0.0.1"&#44;"prompt":"&#91;应用&#93;"&#44;"appID":""&#44;"sourceName":""&#44;"actionData":""&#44;"actionData_A":""&#44;"sourceUrl":""&#44;"meta":{"notification":{"appInfo":{"appName":"全国疫情数据统计"&#44;"appType":4&#44;"appid":1109659848&#44;"iconUrl":"http:\/\/gchat.qpic.cn\/gchatpic_new\/719328335\/-2010394141-6383A777BEB79B70B31CE250142D740F\/0"}&#44;"data":&#91;{"title":"确诊"&#44;"value":"80932"}&#44;{"title":"今日确诊"&#44;"value":"28"}&#44;{"title":"疑似"&#44;"value":"72"}&#44;{"title":"今日疑似"&#44;"value":"5"}&#44;{"title":"治愈"&#44;"value":"60197"}&#44;{"title":"今日治愈"&#44;"value":"1513"}&#44;{"title":"死亡"&#44;"value":"3140"}&#44;{"title":"今**亡"&#44;"value":"17"}&#93;&#44;"title":"中国加油, 武汉加油"&#44;"button":&#91;{"name":"病毒 : SARS-CoV-2, 其导致疾病命名 COVID-19"&#44;"action":""}&#44;{"name":"传染源 : 新冠肺炎的患者。无症状感染者也可能成为传染源。"&#44;"action":""}&#93;&#44;"emphasis_keyword":""}}&#44;"text":""&#44;"sourceAd":""}]
1

cardimage

一种xml的图片消息(装逼大图)

PS

xml 接口的消息都存在风控风险, 请自行兼容发送失败后的处理 ( 可以失败后走普通图片模式 )

Type: cardimage

参数:

参数名类型说明
filestring和image的file字段对齐, 支持也是一样的
minwidthint64默认不填为400, 最小width
minheightint64默认不填为400, 最小height
maxwidthint64默认不填为500, 最大width
maxheightint64默认不填为1000, 最大height
sourcestring分享来源的名称, 可以留空
iconstring分享来源的icon图标url, 可以留空

示例cardimage 的cq码 :

[CQ:cardimage,file=https://i.pixiv.cat/img-master/img/2020/03/25/00/00/08/80334602_p0_master1200.jpg]
1

文本转语音

注意

通过TX的TTS接口, 采用的音源与登录账号的性别有关

Type: tts

范围: 仅群聊

参数:

参数名类型说明
textstring内容

示例: [CQ:tts,text=这是一条测试消息]