发送消息
用于应用通过WPS协作给用户发送消息,支持多种消息类型,使用时需注意以下几点:
- 接收者需要在应用可用范围内。应用可用范围可通过获取应用可用范围接口获取
- 往群聊会话发送消息时,需要该应用机器人在群聊内
- 应用机器人发送的消息最多不超过 5000 个字符
- 支持向 5 类对象发送消息:指定用户、指定会话、指定部门、指定企业、关联组织。但需注意的是,单次调用里面,不同类别的接收对象,其所属的企业必须为同一个,即授权企业(即不支持同时向不同企业的接收对象发送同一条消息)
请求说明
请求地址 | https://openapi.wps.cn/v7/messages/batch_create |
---|---|
请求方法 | POST |
签名方式 | KSO-1 |
权限要求 | 查询和管理会话消息(应用授权) kso.chat_message.readwrite |
请求头(Header)
Header 名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
Content-Type | string | 是 | 使用:application/json |
X-Kso-Date | string | 是 | RFC1123 格式的日期,例: Wed, 23 Jan 2013 06:43:08 GMT |
X-Kso-Authorization | string | 是 | KSO-1 签名值,详见《签名方法》 |
Authorization | string | 是 | 授权凭证,格式为:Bearer {access_token} |
请求体(Body)
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
type | string[enum] | 是 | 消息类型 text :文本;rich_text :富文本;image :图片;file :文件;audio :音频;video :视频;card :卡片消息 |
receivers | array[object] | 是 | 消息接收者 |
∟ partner_id | string | 否 | 关联组织 id,当接收者为关联组织时传 |
∟ receiver_ids | array[string] | 是 | 接收者 id 列表 |
∟ type | string[enum] | 是 | 接收者类型 chat :会话;company :企业;dept :部门;user :企业成员;enterprise_partner :关联组织;enterprise_partner_dept :关联组织部门;enterprise_partner_user :关联组织成员 |
mentions | array[object] | 否 | 被 at 的人员列表,具体用法见下文详细描述 |
∟ id | string | 是 | 指定聊天消息中 at 操作的实体索引 id。与消息正文中相应 <at id={index}> 标记中的 {index} 值匹配 |
∟ identity | object | 否 | 被 at 的用户信息,当 at 所有人时该值为空 |
∟ ∟ company_id | string | 是 | 用户所属企业id |
∟ ∟ id | string | 是 | 用户id |
∟ ∟ type | string[enum] | 是 | 身份类型 user :用户; |
∟ type | string[enum] | 是 | at 操作对象类型 all :所有人;user :用户 |
content | object | 是 | 消息内容,需要根据发送的消息类型 type ,传递不同的对象 |
∟ text | object | 否 | 文本消息,见下文详细描述 |
∟ rich_text | object | 否 | 富文本消息,见下文详细描述 |
∟ image | object | 否 | 图片消息,见下文详细描述 |
∟ file | object | 否 | 文件消息,见下文详细描述 |
∟ audio | object | 否 | 音频消息,见下文详细描述 |
∟ video | object | 否 | 视频消息,见下文详细描述 |
∟ card | object | 否 | 卡片消息,见下文详细描述 |
请求地址示例
[POST] https://openapi.wps.cn/v7/messages/batch_create
请求体示例
{
"type": "string[enum]",
"receivers": [
{
"partner_id": "string",
"receiver_ids": [
"string"
],
"type": "string[enum]"
}
],
"mentions": [
{
"id": "string",
"identity": {
"company_id": "string",
"id": "string",
"type": "user"
},
"type": "user"
}
],
"content": {
// 注意:根据不同 type,传递不同消息内容结构
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
消息内容(content)结构说明
发送消息时,需要根据发送消息的类型 消息类型
,传递不同的消息内容 content
,支持的消息类型如下:
文本(text)
消息类型为文本 type=text
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
text | object | 否 | 文本消息 支持通过在消息体插入标签的方式 at 人 例子: 你好 <at id="0"> 张三 </at> |
∟ content | string | 是 | 文本内容 |
∟ type | string[enum] | 否 | 文本类型 plain :纯文本;markdown |
{
// 文本
"type": "text",
"receivers": [],
"mentions": [],
"content": {
"text": {
"content": "string",
"type": "string[enum]"
}
}
}
2
3
4
5
6
7
8
9
10
11
12
富文本(rich_text)
消息类型为富文本 type=rich_text
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
rich_text | object | 否 | 富文本消息 |
∟ elements | array[object] | 是 | 富文本消息内容 |
∟ ∟ type | string[enum] | 是 | 富文本元素类型 ol :有序列表;ul :无序列表;nl :换行;text :普通文本;emoji :表情;custom_emoji :自定义表情;mention :at 人;image :图片 |
∟ ∟ alt_text | string | 是 | 代替文本摘要,当客户端无法解析则取该字段 |
∟ ∟ indent | integer | 是 | 缩进 |
∟ ∟ index | integer | 是 | 第几行 |
∟ ∟ elements | array[object] | 否 | 子元素列表,与父元素 element 结构相同(递归) |
∟ ∟ text_content | object | 否 | 【1】纯文本内容, 当富文本元素类型为表情 emoji 时使用 |
∟ ∟ ∟ content | string | 是 | 文本内容 |
∟ ∟ ∟ type | string[enum] | 否 | 文本类型 plain :纯文本;markdown |
∟ ∟ style_text_content | object | 否 | 【2】有样式的文本内容,当富文本元素类型为普通文本 text 时使用 |
∟ ∟ ∟ style | object | 是 | 元素样式 |
∟ ∟ ∟ ∟ bold | boolean | 是 | 加粗 |
∟ ∟ ∟ ∟ color | string | 是 | RGBA 16 进制描述,例如:#FF0000FF ,最后两位为透明度 |
∟ ∟ ∟ ∟ italic | boolean | 是 | 斜体 |
∟ ∟ mention_content | object | 否 | 【3】at 人的内容,当富文本元素类型为 at 人 mention 时使用 |
∟ ∟ ∟ identity | object | 否 | 被 at 用户的 id,当 at 所有人时该值为空 |
∟ ∟ ∟ ∟ avatar | string | 是 | 用户头像 |
∟ ∟ ∟ ∟ company_id | string | 是 | 企业 id |
∟ ∟ ∟ ∟ id | string | 是 | 用户信息 |
∟ ∟ ∟ ∟ name | string | 是 | 用户名称 |
∟ ∟ ∟ ∟ type | string[enum] | 是 | 身份类型 user :用户;sp :服务主体 |
∟ ∟ ∟ text | string | 是 | 被 at 的文本内容 |
∟ ∟ image_content | object | 否 | 【4】图片内容,当富文本元素类型为自定义表情 custom_emoji 或 图片 image 时使用 |
∟ ∟ ∟ size | integer | 否 | 图片大小(B) |
∟ ∟ ∟ height | integer | 否 | 高度(px) |
∟ ∟ ∟ width | integer | 否 | 宽度(px) |
∟ ∟ ∟ name | string | 否 | 图片名称 |
∟ ∟ ∟ type | string | 否 | 图片格式,可传值:image/png ;image/jpg ;image/gif ;image/webp |
∟ ∟ ∟ storage_key | string | 是 | 图片存储 key |
∟ ∟ ∟ thumbnail_type | string | 否 | 缩略图片格式,可传值:image/png ;image/jpg ;image/gif ;image/webp |
∟ ∟ ∟ thumbnail_storage_key | string | 否 | 缩略图片存储 key |
∟ ∟ link_content | object | 否 | 【5】链接的内容,当富文本元素类型为 link 时使用 |
∟ ∟ ∟ text | string | 是 | 文本内容 |
∟ ∟ ∟ url | string | 是 | url 链接 |
{
// 富文本
"type": "rich_text",
"receivers": [],
"mentions": [],
"content": {
"rich_text": {
"elements": [
{
"type": "string[enum]",
"alt_text": "string",
"indent": 0,
"index": 0,
"elements": [
{
// 与父元素 elements 结构相同(递归)
}
],
"text_content": {
"content": "string",
"type": "string[enum]"
},
"style_text_content": {
"style": {
"bold": false,
"color": "string",
"italic": false
},
"text": "string"
},
"mention_content": {
"identity": {
"avatar": "string",
"company_id": "string",
"id": "string",
"name": "string",
"type": "string[enum]"
},
"text": "string",
"type": "string[enum]"
},
"image_content": {
"height": 0,
"name": "string",
"size": 0,
"storage_key": "string",
"thumbnail_storage_key": "string",
"thumbnail_type": "string",
"type": "string",
"width": 0
},
"link_content": {
"text": "string",
"url": "string"
}
}
]
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
图片(image)
消息类型为图片 type=image
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
image | object | 否 | 图片消息 |
∟ type | string | 否 | 图片格式,可传值:image/png ;image/jpg ;image/gif ;image/webp |
∟ thumbnail_type | string | 否 | 缩略图片格式,可传值:image/png ;image/jpg ;image/gif ;image/webp |
∟ name | string | 否 | 图片名称 |
∟ size | integer | 否 | 图片大小(B),不传默认按原图比例和大小展示 |
∟ width | integer | 否 | 宽度(px),不传默认按原图比例和大小展示 |
∟ height | integer | 否 | 高度(px),不传默认按原图比例和大小展示 |
∟ storage_key | string | 是 | 图片存储 key |
∟ thumbnail_storage_key | string | 否 | 缩略图片存储 key |
{
// 图片
"type": "image/png",
"receivers": [],
"mentions": [],
"content": {
"image": {
"type": "string",
"thumbnail_type": "string",
"name": "string",
"size": 0,
"width": 0,
"height": 0,
"storage_key": "string",
"thumbnail_storage_key": "string"
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
文件(file)
消息类型为文件 type=file
时,传递的内容 content
对象
- 发送本地文件,即文件类型为
local
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
file | object | 否 | 文件消息 |
∟ type | string[enum] | 是 | 文件类型:固定为local :本地文件 |
∟ local | object | 否 | 本地文件 |
∟ ∟ name | string | 否 | 文件名称 |
∟ ∟ size | integer | 否 | 文件大小(B) |
∟ ∟ storage_key | string | 是 | 文件存储 key |
{
// 文件
"type": "file",
"receivers": [],
"mentions": [],
"content": {
"file": {
// 本地文件
"type": "local",
"local": {
"name": "string",
"size": 0,
"storage_key": "string"
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
音频(audio)
消息类型为音频 type=audio
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
audio | object | 否 | 音频消息 |
∟ media | object | 是 | 音频媒体信息 |
∟ ∟ channels | integer | 否 | 通道数 |
∟ ∟ codec | string[enum] | 否 | 编码格式 amr |
∟ ∟ duration | integer | 否 | 播放时长(s) |
∟ ∟ format | string[enum] | 否 | 文件格式 wav |
∟ ∟ sample_bits | integer | 否 | 比特率 |
∟ ∟ sample_rate | integer | 否 | 采用率 |
∟ ∟ size | integer | 否 | 文件大小(B) |
∟ storage_key | string | 是 | 音频文件存储 key |
{
// 音频
"type": "audio",
"receivers": [],
"mentions": [],
"content": {
"audio": {
"media": {
"channels": 0,
"codec": "string[enum]",
"duration": 0,
"format": "string[enum]",
"sample_bits": 0,
"sample_rate": 0,
"size": 0
},
"storage_key": "string"
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
视频(video)
消息类型为音频 type=video
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
video | object | 否 | 视频消息 |
∟ media | object | 是 | 视频媒体信息 |
∟ ∟ codec | string[enum] | 否 | 编码格式 h.264 |
∟ ∟ cover_storage_key | string | 否 | 视频文件封面图片存储 key |
∟ ∟ duration | integer | 否 | 播放时长(s) |
∟ ∟ format | string[enum] | 否 | 文件格式 mp4 |
∟ ∟ height | integer | 否 | 高度(px) |
∟ ∟ size | integer | 否 | 文件大小(B) |
∟ ∟ width | integer | 否 | 宽度(px) |
∟ storage_key | string | 是 | 视频文件存储 key |
{
// 视频
"type": "audio",
"receivers": [],
"mentions": [],
"content": {
"video": {
"media": {
"codec": "string[enum]",
"cover_storage_key": "string",
"duration": 0,
"format": "string[enum]",
"height": 0,
"size": 0,
"width": 0
},
"storage_key": "string"
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
卡片(card)
消息卡片是应用接入WPS协作机器人发送消息时的一种消息类型。消息卡片提供了丰富的组件,支持开发者按需组合配置消息卡片。详细说明可看WPS协作卡片介绍 和 WPS协作卡片结构说明
为了提升卡片的搭建效率,WPS开放平台也为开发者提供了可视化的消息卡片搭建工具,开发者可进入开发者后台-应用能力-WPS协作机器人-发送消息-API发送-消息卡片编辑器
处进行配置。
消息类型为卡片 type=card
时,传递的内容 content
对象
名称 | 参数类型 | 是否必填 | 说明 |
---|---|---|---|
card | object | 否 | 卡片消息 |
∟ config | 是 | object | |
∟ link | 否 | object | 卡片整体的跳转链接 |
∟ i18n_items | 是 | array | 卡片的内容,支持多语言 |
{
"type": "card",
"receivers": [],
"mentions": [],
"content": {
"card": {
"config": {
},
"i18n_items": [
{
}
],
"link": {
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
如何在消息内@人
消息接口支持在markdown格式的文本内,通过在消息体 content 中插入<at>
标签的方式@人。目前支持markdown文本的消息类型有:文本(text)、富文本(rich_text)、卡片(card)
使用步骤如下:
1.在对应消息类型的content内,使用<at>
标签的方式写入@内容,有2种使用格式:
- @单个用户:
<at id=\"2\">展示名称</at>
- @所有人:
<at id=\"1\">所有人</at>
,id固定为1
请注意,上述的id
仅用来代表索引,在下述第2步中会使用到,并不是用户user_id
2.在该接口的请求体mentions部分,传参上述的索引和具体的用户user_id
。具体写法和对应关系请看示例图:
响应体
名称 | 参数类型 | 说明 |
---|---|---|
code | integer | 响应代码。非 0 表示失败,参照《状态码说明》 |
msg | string | 响应信息 |
data | object | 响应数据 |
∟ id | string | 消息 id |
∟ chat_id | string | 会话 id |
∟ quote_msg_id | string | 被引用的消息 id |
∟ type | string[enum] | 消息类型 text :文本;rich_text :富文本;image :图片;file :文件;audio :音频;video :视频;card :卡片消息 |
∟ position | integer | 会话消息位置索引,严格连续递增 |
∟ ctime | integer | 消息创建时间 |
∟ mentions | array[object] | 被 at 的人员列表 |
∟ ∟ id | string | 指定聊天消息中 at 操作的实体索引 id。与消息正文中相应 <at id={index}> 标记中的 {index} 值匹配 |
∟ ∟ identity | object | 被 at 的用户信息,当 at 所有人时该值为空 |
∟ ∟ ∟ avatar | string | 用户头像 |
∟ ∟ ∟ company_id | string | 企业 id |
∟ ∟ ∟ id | string | 用户信息 |
∟ ∟ ∟ name | string | 用户名称 |
∟ ∟ ∟ type | string[enum] | 身份类型 user :用户;sp :服务主体 |
∟ ∟ type | string[enum] | at 操作对象类型 all :所有人;user :用户 |
∟ sender | object | 发送者,包括用户、应用和机器人 |
∟ ∟ avatar | string | 用户头像 |
∟ ∟ company_id | string | 企业 id |
∟ ∟ id | string | 用户信息 |
∟ ∟ name | string | 用户名称 |
∟ ∟ type | string[enum] | 身份类型 user :用户;sp :服务主体 |
∟ recall | object | 消息撤回信息 |
∟ ∟ operator_id | string | 撤回消息操作者 id |
∟ content | object | 消息内容 |
∟ ∟ text | object | 文本消息,见上文详细描述,相同的定义 |
∟ ∟ rich_text | object | 富文本消息,见上文详细描述,相同的定义 |
∟ ∟ image | object | 图片消息,见上文详细描述,相同的定义 |
∟ ∟ file | object | 文件消息,见上文详细描述,相同的定义 |
∟ ∟ audio | object | 音频消息,见上文详细描述,相同的定义 |
∟ ∟ video | object | 视频消息,见上文详细描述,相同的定义 |
∟ ∟ card | object | 卡片消息,见上文详细描述,相同的定义 |
响应体示例
{
"data": {
"id": "string",
"chat_id": "string",
"quote_msg_id": "string",
"type": "string[enum]",
"position": 0,
"ctime": 0,
"mentions": [
{
"id": "string",
"identity": {
"avatar": "string",
"company_id": "string",
"id": "string",
"name": "string",
"type": "string[enum]"
},
"type": "string[enum]"
}
],
"sender": {
"avatar": "string",
"company_id": "string",
"id": "string",
"name": "string",
"type": "string[enum]"
},
"recall": {
"operator_id": "string"
},
"ext_attrs": [
{
"name": "string",
"value": "string"
}
],
"content": {
// 根据不同的 type,返回不同内容
}
},
"code": 0,
"msg": "string"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44