机器人
概述
机器人是企业群的高级扩展功能,所有的Hi企业用户均可在企业群中添加使用机器人功能。
企业可以通过机器人推送消息到群聊,也可以通过机器人接收用户的消息,拥有用户和机器人对话的能力。
机器人类型
自定义机器人:由企业开发实现的机器人,一般用来发送企业通知,也可以利用ai会话技术实现有趣的功能。
企业机器人:目前开放的定时通知、投票、问卷机器人由如流开发,企业管理员在企业管理后台的「应用中心」-「应用市场」安装后,用户即可在客户端使用。
在客户端使用机器人
添加机器人
群主/管理员在企业群中,点击机器人图标打开机器人面板,进入添加机器人列表。1个群最多只能添加10个机器人。
Hi提供企业机器人和自定义机器人两类:
- 企业机器人:由企业开发者创建,直接添加即可使用
- 自定义机器人:点击“创建机器人”可创建专属于个人的机器人添加进群,获取webhook地址,实现自动推送消息。
使用机器人
自定义机器人 用户在群聊会话创建的自定义机器人可实现如下场景: ① 机器人可以往群内推送消息 ② 可以在群内@机器人,和机器人互动 开发机器人请参阅自定义机器人开发
企业机器人 Hi现提供群投票、群问卷、定时通知三个官方机器人开放使用,企业管理员登录企业管理后台,在应用市场中安装后,用户在客户端企业群中即可添加使用,具体使用请参阅下述案例介绍
移除机器人
群主/管理员在企业群中,点击右上角-机器人图标打开机器人面板,选择要移除的机器人,点击下拉按钮,选择【移除机器人】
案例介绍
定时通知机器人
1、在机器人添加列表页,添加定时通知,进入设置页。在页面中可设置想要通知的内容,支持输入文本及@群成员
2、添加成列功后,在机器人面板-选择定时通知,点击下拉按钮,点击【设置】,进入设置页可进行编辑修改
3、选择“值班通知”,可设置值班人,定时通知到群聊,值班通知设置示例:
群投票&群问卷机器人
1、在添加列表页,选择群投票/群问卷可直接添加进群
2、 添加进群后,在机器人侧边栏点击【打开】,进入发起投票/发起问卷页面,发起投票/问卷后,机器人会自动发送到群聊,提醒大家参与。
3、在群内可以@群投票/群问卷机器人,查询最近发起的投票/问卷,快速参与
4、如果忘记如何使用机器人的话,可以在群里@群投票/群问卷询问"如何使用?",它会响应你,你可以根据它的引导去使用它,或者查看机器人的资料页的使用预览图了解
自定义机器人开发
创建机器人,获取Webhook地址
在企业群右上角点击【机器人图标】-【添加机器人】-【创建机器人】,添加机器人进群后,可获取机器人的Webhook地址,向此地址发起HTTP POST 请求,即可实现向该群组发送消息。
发送消息
企业向Webhook地址发送请求,如流收到请求通过机器人向群聊发送聊天消息。 下面用curl工具举例测试发送消息,需要将其中 {Webhook} 替换为获取的真实Webhook地址。
curl -X POST '{Webhook}' \
-H "Content-Type:application/json" \
-d '{
"message": {
"header":{
"toid":[123456]
},
"body": [{"type": "TEXT", "content": "hi, robot!"}]
}
}'
参数说明
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
message | JsonObject | RequestBody | 是 | 消息对象 |
header | JsonObject | RequestBody | 否 | 消息头部 |
body | JsonArray | RequestBody | 是 | 消息体,可以多种类型消息组合发送,其中IMAGE 不支持与其他类型同时发送、Markdown类型不支持与其他类型同时发送,IMAGE单次仅支持发送一张 |
toid | JsonArray | RequestBody | 否 | 群id必须使用数字类型 例如 [12324343,23232] ,像 ["12324343","23232"] 会导致发消息失败 |
type | String | RequestBody | 是 | 消息类型,LINK-链接元素,TEXT-文本元素,AT-@元素,IMAGE-图片,MD-Markdown类型 |
其他参数 | JsonObject | RequestBody | 是 | 发送不同类型的消息使用不同的参数,详见下面 |
消息类型和数据格式
文本类型(TEXT)
代码示例:
{
"message":{
"header":{
"toid":[123456]
},
"body":[
{
"content":"hello,大家好\n我是来自机器人的消息",
"type":"TEXT"
}
]
}
}
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
type | String | RequestBody | 是 | TEXT 为文本消息 |
content | String | RequestBody | 是 | 文本类型文本总长度不得超过2k,使用“\n”换行 |
消息示例:
链接类型(LINK)
代码示例:
{
"message":{
"header":{
"toid":[123456]
},
"body":[
{
"href":"https://www.baidu.com/",
"type":"LINK"
}
]
}
}
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
type | String | RequestBody | 是 | LINK 为链接消息 |
href | String | RequestBody | 是 | 跳转的链接,单个链接长度不得超过1k,暂不支持自定义链接文字 |
消息示例:
@群成员
代码示例:
{
"message":{
"header":{
"toid":[123456]
},
"body":[
{
"content":"大家好,这是来自机器人的消息\n",
"type":"TEXT"
},
{
"atuserids":["xuebaochai"], // 成员ID账号
"atall":false, //true-at全体成员,此时atuserids无效
"type":"AT"
}
]
}
}
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
type | String | RequestBody | 是 | AT 为@群成员消息 |
atall | Boolean | RequestBody | \ | true 表示AT全体成员 type为AT时,atuserids与atall必须选填一个,若只选atall则对应值必须填true,否则会发送失败 |
atuserids | JsonArray | RequestBody | \ | userid为企业后台通讯录中成员录入的成员ID字段,String类型 type为AT时,atuserids与atall必须选填一个,若只选atall则对应值必须填true,否则会发送失败 |
消息示例:
图片类型(IMAGE)
代码示例:
{
"message":{
"header":{
"toid":[123456]
},
"body":[
{
"content": "A+QIGv8u3c6YCCiiggAIKK.........", // 图片byte数据base64编码后的值,byte小于1m
"type":"IMAGE"
}
]
}
}
参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
type | String | 是 | IMAGE 为图片消息 |
content | String | 是 | 单张图片byte数据base64编码后的值,不要携带“data:image/jpg;base64,” 描述信息,否则发送失败 图片消息不支持与其他类型消息同时发送 |
消息示例:
Markdown类型(MD) 代码示例:
{
"message":{
"header":{
"toid":[123456]
},
"body":[
{
"type": "MD",
"content": "##### 用户反馈监控 \n实时新增用户反馈<font color=\"red\">188例</font>,请相关同事注意。\n**渠道来源**\n> *Web站*:<font color=\"green\">98例</font>\n>*App store*:<font color=\"gray\">90例</font>"
}
]
}
}
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
type | String | RequestBody | 是 | MD 为Markdown消息 |
content | String | RequestBody | 是 | Markdown消息消息内容长度不得超过2048个字符,具体语法支持如下 |
消息示例:
Markdown支持如下语法子集:
1、标题:1-6级标题,# 号和文本之间要有一个空格
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
2、粗体:
**加粗文本**
3、斜体:
*斜体文本*
4、引用:
>引用文本
5、字体颜色:只支持三种内置颜色:green(绿色)、gray(灰色)、red(红色)
<font color="green">绿色</font>
<font color="gray">灰色</font>
<font color="red">红色</font>
6、链接
1. [百度一下](https://www.baidu.com/)
2. https://www.baidu.com/
7、有序列表:1. 和文本之间要加一个空格
1. 有序列表
2. 有序列表
3. 有序列表
8、无序列表:- 和文本之间要加一个空格
- 无序列表
- 无序列表
9、行内代码
`code`
消息发送频率限制
为了保障群成员使用体验,以防收到大量消息的打扰,机器人发消息限制每个机器人每群20条/分钟,超出后接口将返回警告错误码,将限流5分钟。限流期间的消息将会被丢弃。
返回错误码释义
errorcode | 释义 |
---|---|
-1 | 系统错误 |
0 | ok |
40000 | 参数错误 |
40035 | 群聊ID不合法 |
40036 | 群聊非企业群 |
40040 | 参数错误 |
40044 | 机器人未被添加到群中 |
40045 | agentId不合法 |
40046 | 发送消息频率超限 |
40047 | 文件上传失败 |
40060 | body超过9k |
40061 | text类型文本总长度超过2k |
40062 | link类型单个链接长度超过1k |
40063 | image类型图片数量超过1个 |
40064 | header中offlinenotify长度超过1k |
40065 | header中compatible长度超过1k |
40066 | image类型图片大小超过1m |
40067 | markdown类型数量超过1个 |
40068 | markdown内容长度超过2048个字符 |
40069 | message属性格式不正确 |
40071 | at超过50人 |
40200 | 机器人发送消息权限已被封禁 |
40201 | 机器人接受消息权限已被封禁 |
40300 | 机器人已被停用 |
接收消息
机器人设置页中开启【接收消息】,接收群里用户“@机器人”以及使用“/快捷命令”互动的消息。快捷命令设置请参阅/快捷命令
设置回调地址
打开【接收消息】后可设置回调地址,回调地址由开发人员搭建,用于接收机器人收到的消息。
参数 | 说明 |
---|---|
回调地址 | 接收消息和事件服务器URL,由开发者搭建,建议使用HTTPS |
Token | 用于生成签名,可由企业任意填写 |
EncodingAESKey | 用于消息体的加解密,详细使用参考附录中的消息体解密 |
验证URL有效性
当点击“保存”提交以上信息时,Hi平台会发送一条POST验证消息到填写的回调URL上,</br> 接收消息的服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。</br> 校验通过后你的服务才可以正常接收机器人收到的消息。</br> 假设回调URL为https://example.com
</br>企业平台会使用以下参数发送请求到回调地址。
回调地址:https://example.com
请求body:signature=5d03603ea6f77b5608d5735a914b3221×tamp=1543647265&rn=376117246&echostr=7cff9
参数说明:
参数 | 说明 |
---|---|
signature | 签名,用于验证调用者的合法性。具体算法见附录 |
timestamp | 时间戳 |
rn | 随机数 |
echostr | 随机字符串 |
接收消息服务器URL收到请求后,你的服务需要做如下操作:
通过参数signature对请求进行校验,确认调用者的合法性,详见附录;
在3秒内响应请求,响应内容为上一步得到的echostr值之后接入验证生效,接收消息开启成功。
接收用户消息
当用户在群聊与机器人对话时,Hi平台会发送一条POST消息到“回调地址”上,包含了加密之后的消息体(非application/x-www-form-urlencoded、application/json,请通过读取body 体获取),需要开发者使EncodingAESKey解密,才能得到用户给机器人发送的消息,详见附录中的消息体解密。
消息体数据格式
发送给“回调地址”解密后的消息体如下,从中可以解析出groupid,fromuserid从而得知来自某个群的某个成员发送消息,消息内容可以从messageBody中解析得出,包含了 图片、文本、链接、AT 、/快捷命令。以下内容由企业平台发送给“回调地址”,开发人员解密之后获取。
{
"eventtype": "MESSAGE_RECEIVE",
"agentid": 123,
"groupid": 123456,
"corpid": "hiXXXXXXXXXXXX",
"message": {
"header": {
"fromuserid": "zhoumengqi",
"toid": 123456,
"totype": "GROUP",
"msgtype": "MIXED",
"clientmsgid": 123456789,
"messageid": 123456789,
"msgseqid": "",
"at": {
"atrobotids": [],
"atuserids": [
"huangshuling"
]
},
"compatible": "",
"offlinenotify": "",
"extra": "",
"servertime": 1584631428233,
"clienttime": 1584631428200,
"updatetime": 0
},
"body": [
{
"type": "command",
"commandname": "Test"
},
{
"type": "TEXT",
"content": " "
},
{
"type": "AT",
"robotid": 4100015525,
"name": "自定义机器人"
},
{
"type": "TEXT",
"content": " 普通文本"
},
{
"type": "LINK",
"label": "http://www.baidu.com/"
},
{
"type": "IMAGE",
"downloadurl": "http://e.im.baidu.com/proxy/download?taskId=0edb334c-3670-4893-93e4-aa2d55c1096a"
},
{
"type": "TEXT",
"content": "红包"
},
{
"type": "AT",
"userid": "hanmeimei",
"name": "韩梅梅"
},
{
"type": "TEXT",
"content": " "
}
]
},
"time": 1584631428290
}
对应用户发送的消息截图:
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
eventtype | String | 是 | 事件类型,固定值:MESSAGE_RECEIVE |
groupid | Number | 是 | 群聊ID |
fromuserid | String | 是 | 消息发送者userid(员工的成员ID) |
toid | Number | 是 | 群聊ID |
totype | String | 是 | 消息接收方类型,固定值:GROUP |
msgtype | String | 是 | 消息类型,固定值:MIXED |
clientmsgid | Number | 是 | 客户端消息ID |
messageid | Number | 是 | HiServer生成的消息ID |
at | String | 是 | 消息内容at信息 |
type | String | 是 | LINK-链接元素,TEXT-文本元素,AT-@元素,IMAGE-图片,command-"/"快捷命令 |
content | String | \ | type 为TEXT时必填,文本内容 |
commandname | String | \ | type 为command时必填,在机器人设置面设置的命令名 |
robotid | Number | \ | type为AT且用户AT的为机器人时必填,机器人ID,暂时用不到 |
userid | String | \ | type为AT且用户AT的为普通成员时必填,企业后台通讯录中成员录入的成员ID字段 |
name | String | \ | type为AT时必填,机器人名称或者普通成员姓名 |
message.body解析建议
如上述示例,用户发送的一条消息往往会包含多种类型,因此message.body是一个数组,从前往后按消息类型做了拆分,所以建议遍历message.body “流式处理”,遇到不需要类型(比如图片等)或者无法处理的内容(比如空格等占位符)则跳过,遇到既定的关键字(比如关键字A、关键字B)触发对应的回复。
如果需要做整句语义分析或者为了简单,则可以循环遍历时将所有TEXT content字符串拼接起来,再调用NLP、UNIT等平台。
添加到多群
一个自定义机器人最多可添加到20个群。
完成创建完机器人后,创建者可通过以下两种方式将机器人添加到多群中,实现多群中接收、发送消息。
1、在机器人的资料页将机器人快速添加到自己所管理的其他群聊。
2、在群聊的机器人-添加机器人列表-我创建的机器人可以将创建的机器人添加到当前所在群。
企业机器人开发
企业机器人是如流为企业用户提供的一款用于连接企业内服务的机器人,用于企业服务数字化转型,让企业服务更好的服务于员工,提升员工办公效率。企业内部开发者可通过下述的接入流程快捷开发和发布机器人,企业员工在企业群聊内可一键添加机器人,使用机器人服务。
企业内协同应用、软件系统可以接入企业机器人,实现将消息自动发送到群聊,提醒大家协同完成;如群成员“@机器人”发送消息,如流将消息内容发送到机器人接收消息URL,开发者收到消息后,可以从消息中解析出消息内容、发送者、来自群聊,然后根据业务逻辑处理响应调用接口返回到相应群聊中,以对话式的方式为员工提供服务。
创建机器人
1、登录如流企业管理后台,进入应用中心,点击新建应用
2、填写应用头像、名称、介绍,产品功能勾选「机器人」形态,提交后,点击前往继续完善信息,进入主页。
3、在应用主页,选择机器人设置,进入设置页
4、在机器人设置页,支持的配置项有:机器人使用预览图、客户端主页、客户端设置页、可见范围
配置项 | 要求及说明 |
---|---|
使用预览图 | 展示于在如流客户端进入机器人资料页,用户可查看关于机器人的功能介绍;宽1242,高不超过2960 |
可见范围 | 基于企业群,控制机器人使用范围,可配置指定企业群、及开放全部企业群 |
手机端主页 | 从群聊资料页进入机器人列表,点击机器人进入此URL,开发者可接入应用业务服务,在移动端完成办公 |
手机端设置页 | 用户在手机端添加机器人时,会跳转到此URL,用于收集需要用户提供的信息,提交通过后,才添加进群成功。 如未设置,则直接添加进群成功 |
电脑端主页 | 机器人添加进群后,群成员在机器人列表点击「打开」按钮进入此URL,开发者可接入应用业务服务,方便员工在群聊内完成办公。 电脑端弹窗尺寸:520 520;弹窗内嵌网页可视尺寸:520 482 |
电脑端设置页 | 用户在电脑端添加机器人时,会跳转到此URL,用于收集需要用户提供的信息,提交通过后,才添加进群成功。 如未设置,则直接添加进群成功。 电脑端弹窗尺寸:520 520;弹窗内嵌网页可视尺寸:520 482 |
主页展示位置:
设置页展示位置:
发消息授权
管理员进入设置-权限设置-新建管理组,将机器人添加到管理组应用权限中,在「敏感接口权限」模块,勾选开启「发送群组消息」权限。
下拉获取开发者凭据CorpId和Secret ,用于置换Access_token,用于调用机器人发消息接口推送消息。
机器人开发
发送消息
请求方式:HTTP POST
请求地址:https://api.im.baidu.com/api/msg/groupmsgsend?access_token=${ACCESS_TOKEN} </br>获取 access_token
sessionid:通过调用如流客户端jssdk获取。sdk所需参数为 agentid、timestamp、nonce、sign。 sign 生成规则 md5(agentid + appsecret + timestamp + nonce)
timstamp: 当前时间的毫秒数
nonce:随机数字
appsecret:套件应用即token
agentid:agentid
支持发送的消息类型:文本(TEXT)、图片(IMAGE)、链接(LINK)、markdown(MD)、AT
messageHeader定义如下:
"header": {
"toid": 123456, // 可选,接收方id, totype=GROUP时 toid为groupid
"totype": "SESSION", // 必须,会话类型,GROUP、SESSION
"sessionid": "12121212121212121", //可选,会话ID,totype="SESSION"时必填,表示以用户身份发消息
"msgtype": "TEXT", // 必须,消息类型 TEXT, IMAGE, RICHMEDIA, RICHMEDIA2
"clientmsgid": 1212121, // 必须,发送时唯一id,由请求方保证唯一,建议使用系统当前时间毫秒值
"role": "robot", // 必须,以机器人身份发送消息
}
消息类型及数据格式
文本类型(TEXT)
代码示例:
curl -X POST \
'https://api.im.baidu.com/api/msg/groupmsgsend?access_token=b7c326ec12786b60709a44875c22ccaca' \
-H 'Content-Type: application/json' \
-H 'Host: https://api.im.baidu.com' \
-d '{
"agentid": 736,
"message": {
"header": {
"toid": 1608555,
"totype": "GROUP",
"msgtype": "TEXT",
"clientmsgid": 1569398477300,
"role": "robot"
},
"body": [
{
"type": "TEXT",
"content": "Hi~"
}
]
}
}'
消息示例:
图片类型(IMAGE)
代码示例:
curl -X POST \
'https://api.im.baidu.com/api/msg/groupmsgsend?access_token=b7c326ec12786b60709a44875c22ccaca' \
-H 'Content-Type: application/json' \
-d '{
"agentid": 736,
"message": {
"header": {
"toid": 1608555,
"totype": "GROUP",
"msgtype": "IMAGE",
"clientmsgid": 1569398477302,
"role": "robot"
},
"body": [
{
"content": "A+QIGv8u3c6YCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKFAjAv8L0+vxkA8rL2IAAAAASUVORK5CYII=" // 图片byte数据base64编码后的值,byte小于1m
"type":"IMAGE"
}
]
}
}'
消息示例:
链接类型(LINK)
代码示例:
curl -X POST \
'https://api.im.baidu.com/api/msg/groupmsgsend?access_token=b7c326ec12786b60709a44875c22ccaca' \
-H 'Content-Type: application/json' \
-d '{
"agentid": 736,
"message": {
"header": {
"toid": 1608555,
"totype": "GROUP",
"msgtype": "TEXT",
"clientmsgid": 1569398477303,
"role": "robot"
},
"body": [
{"type": "LINK", "href": "example.com"}
]
}
}'
消息示例:
@群成员
代码示例:
curl -X POST \
'https://api.im.baidu.com/api/msg/groupmsgsend?access_token=b7c326ec12786b60709a44875c22ccaca' \
-H 'Content-Type: application/json' \
-d '{
"agentid": 736,
"message": {
"header": {
"toid": 1608555,
"totype": "GROUP",
"msgtype": "TEXT",
"clientmsgid": 1569398477312,
"role": "robot"
},
"body": [
{
"type": "TEXT",
"content": " 以下人员注意啦~ "
},
{
"type": "AT",
"atall": false, // true-表示at全体成员,此时atuserids失效
"atuserids": [ // 成员ID
"linli",
"fanghan"
]
}
]
}
}'
消息示例:
Markdown类型(MD)
代码示例:
curl -X POST \
'https://api.im.baidu.com/api/msg/groupmsgsend?access_token=b7c326ec12786b60709a44875c22ccaca' \
-H 'Content-Type: application/json' \
-d '{
"agentid": 736,
"message": {
"header": {
"toid": 1608555,
"totype": "GROUP",
"msgtype": "MD",
"clientmsgid": 1569398477312,
"role": "robot"
},
"body": [
{
"type": "MD",
"content": "##### 用户反馈监控 \n实时新增用户反馈<font color=\"red\">188例</font>,请相关同事注意。\n**渠道来源**\n> *Web站*:<font color=\"green\">98例</font>\n>*App store*:<font color=\"gray\">90例</font>"
}
]
}
}'
消息示例:
Markdown支持如下语法子集:
1、标题:1-6级标题,# 号和文本之间要有一个空格
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
2、粗体:
**加粗文本**
3、斜体:
*斜体文本*
4、引用:
>引用文本
5、字体颜色:只支持三种内置颜色:green(绿色)、gray(灰色)、red(红色)
<font color="green">绿色</font>
<font color="gray">灰色</font>
<font color="red">红色</font>
6、链接:不支持自定义链接文字,会直接显示原链接
1. [百度一下](https://www.example.com/)
2. https://www.example.com/
7、有序列表:1. 和文本之间要加一个空格
1. 有序列表
2. 有序列表
3. 有序列表
8、无序列表:- 和文本之间要加一个空格
- 无序列表
- 无序列表
9、行内代码
`code`
消息发送频率限制
为了保障群成员使用体验,以防收到大量消息的打扰,机器人发消息限制每个机器人每群20条/分钟,超出后接口将返回警告错误码,将限流5分钟。限流期间的消息将会被丢弃。
返回错误码释义
errorcode | 释义 |
---|---|
-1 | 系统错误 |
0 | ok |
40000 | 参数错误 |
40035 | 群聊ID不合法 |
40036 | 群聊非企业群 |
40040 | 参数错误 |
40044 | 机器人未被添加到群中 |
40045 | agentId不合法 |
40046 | 发送消息频率超限 |
40047 | 文件上传失败 |
40060 | body超过9k |
40061 | text类型文本总长度超过2k |
40062 | link类型单个链接长度超过1k |
40063 | image类型图片数量超过1个 |
40064 | header中offlinenotify长度超过1k |
40065 | header中compatible长度超过1k |
40066 | image类型图片大小超过1m |
40067 | markdown类型数量超过1个 |
40068 | markdown内容长度超过2048个字符 |
40069 | message属性格式不正确 |
40071 | at超过50人 |
40200 | 机器人发送消息权限已被封禁 |
40201 | 机器人接受消息权限已被封禁 |
40300 | 机器人已被停用 |
接收消息
在应用主页,打开「接收消息服务器」,点击「设置」进入配置接受消息服务器URL。如群成员@机器人发送消息,如流平台将用户发送的消息发送给此URL,也可以选择订阅「群聊系统事件」,如流平台也会将各类操作事件发送给此URL,订阅的事件请参阅订阅消息与事件
设置接收服务器地址
管理员可以在应用中设置回调配置
参数 | 说明 |
---|---|
URL | 接收消息和事件服务器URL,由开发者搭建,建议使用HTTPS |
Token | 用于生成签名,可由企业任意填写 |
EncodingAESKey | 用于消息体的加密,是AES密钥的Base64编码,长度固定为22个字符,从a-z、A-Z、0-9共62个字符中选取,解码后即为16字节长的AESKey |
验证URL的有效性
当点击“保存”提交以上信息时,如流平台会发送一条POST验证消息到填写的URL,企业的接收消息服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。 假设企业回调URL为https://example.com/。
请求地址:https://example.com
请求body:signature=5d03603ea6f77b5608d5735a914b3221×tamp=1543647265&rn=376117246&echostr=7cff9
参数说明:
参数 | 类型 | 参数位置 | 是否必须 | 说明 |
---|---|---|---|---|
signature | String | Query参数 | 是 | 签名,用于验证调用者的合法性。具体算法见附录 |
timestamp | Integer | Query参数 | 是 | 时间戳 |
rn | Integer | Query参数 | 是 | 随机数 |
echostr | String | Query参数 | 是 | 随机字符串 |
接收消息服务器URL收到请求后,需要做如下操作:
通过参数signature对请求进行校验,确认调用者的合法性,详见附录; 在3秒内响应请求,响应内容为上一步得到的echostr值之后接入验证生效,接收消息开启成功。
接收消息和事件
订阅「用户在群聊中@机器人的消息」和「群聊系统事件」后,机器人将会收听群聊用户@机器人的消息以及群操作事件,有关的消息格式和事件,请参阅订阅消息与事件
设置页开发
1、如在企业后台进入机器人设置页,设置了电脑端/手机端设置URL地址,用户在设置页填写信息保存到你的机器人server端后,需要调用以下【机器人新增/创建】接口,实现将机器人添加进群。
接口说明:将机器人添加进群
请求方式:HTTP POST
请求参数:
参数 | 类型 | 参数位置 | 是否必须 | 说明 |
---|---|---|---|---|
access_token | String | Url参数 | 是 | 参考获取access_token |
sessionid | String | Url参数 | 是 | 调用如流 jssdk get_session_id 方法获取 |
groupid | Integer | Url参数 | 是 | 群聊id |
agentid | Integer | Url参数 | 是 | 应用id |
返回示例:
{
"code": 200, //
"msg": "ok",
"data": 4100001234 // robot_id
}
错误码释义:
300-该机器人不存在或者已被删除
302-非机器人应用
303-该机器人已添加到群中
304-机器人数量超过上限,msg中给出上限
305–同一个机器人添加群聊超过上限,msg中给出上限
306–名称重复
400-参数错误
401-非企业员工
402-非企业群
403-非群组成员
404-非群管理员
405-非创建者
410-应用不存在或者已被删除
411-群不在机器人的可见范围
412-回调配置校验失败
获取企业管理组access_token方式:参考 获取accessToken
因频繁请求该接口有性能开销,且有频次限制(目前相对宽松,后续会趋严)建议各应用方缓存access_token 2小时内定时刷新一次以提升性能)
身份验证
机器人中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息,通过此接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案:
1、访问地址直接填写企业自己的域名URL
2、用户访问URL时,应用方校验是否有代表成员身份的cookie(session),此cookie由应用方生成
3、如果没有获取到cookie,重定向到OAuth验证链接,通过code获取成员身份后,由企业应用方生成、设置代表成员身份的cookie(为了安全,建议对cookie的值加密)
4、后续请求应用方通过cookie校验用户身份 OAUTH2.0获取企业成员信息
—企业获取code
企业如果需要员工在跳转到访问页面URL时带上员工的身份信息,需构造如下的链接:
https://xpc.im.baidu.com/oauth2/authorize?appid=CORPID&groupid=123456&redirect_uri={REDIRECT_URI}
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
appid | String | Url参数 | 是 | 企业ID,在管理后台-设置-企业信息获取CorpID |
redirect_uri | String | Url参数 | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
groupid | Integer | Url参数 | 否 | 群聊ID,机器人必需传 |
员工点击后,页面将跳转至 redirect_uri?code=CODE,企业可根据code参数获得员工的userid。
注意事项:
避免循环重定向,oauth回调的redirect_uri需特殊处理(比如加个参数cb=1),当获取用户信息失败后,直接进入错误页面,不应再跳转到oauth接口 oauth 302回调回来的带有code的页面,可能会被用户分享出去,其它用户打开此页面,但此code可能已被使用过,再使用此code获取用户身份将会失败,因此使用之前需要判断页面的referer是否为 https://xpc.im.baidu.com
—快速获取code
使用上述方式获取302会有一次302跳转,耗时较长且容易失败,用户首次进入页面时体验较差。
为此如流客户端提供一种快速获取code的方式,即当用户在打开应用首页时,客户端会在请求header的hicode字段带上客户端生成的code(ios.xxx.xxx形式),应用方服务端使用此code请求后续接口即可
当然若从header中没有获取到hicode字段,或者使用此code获取用户信息失败(详见下面的接口返回值),还请降级到使用302 oauth的方式,不能只支持快速认证这一种方式
—根据code获取成员信息
请求说明:
Http请求方式:GET
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
access_token | String | Url参数 | 是 | 调用接口凭证 |
code | String | Url参数 | 是 | 通过成员授权获取到的code,每次成员授权带上的code不一样,code只能使用一次,5分钟后失效 |
agentid | Integer | Url参数 | 是 | 跳转链接时所在的企业应用ID |
权限说明:
管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同。
返回结果:
a)正确时返回示例如下:
{
"errcode": 0,
"errmsg":"ok",
"UserId":"USERID"
}
参数 | 说明 |
---|---|
UserId | 成员UserId(员工账号) |
b)出错时返回示例如下:
{
"errcode": 40029,
"errmsg": "invalid code"
}
具体说明:
errcode | errmsg |
---|---|
40029 | 不合法的oauth_code 常见原因: 1、code为空 2、快速认证的code格式不符合xxx.xxx.xxx的形式 3、快速认证的code解密失败,纯粹格式错误 4、快速认证的code解密失败,可能用户已离线 5、传入的agentid和生成code的应用不一致 6、其它解密错误 |
42003 | oauth_code超时或者失效 常见原因:code是一次一密,使用一次即失效 |
40056 | 不合法的agentid |
60011 | 管理员权限不足 |
60014 | 客户端hicode认证失败,需要降级到重定向方式发起OAUTH请求 |
—根据code获取群成员信息
请求说明:
请求方式:HTTP GET
参数说明:
参数 | 类型 | 参数位置 | 必须 | 说明 |
---|---|---|---|---|
access_token | String | Url参数 | 是 | 调用接口凭证 |
code | String | Url参数 | 是 | 通过成员授权获取到的code,每次成员授权带上的code不一样,code只能使用一次,5分钟后失效 |
agentid | Integer | Url参数 | 是 | 跳转链接时所在的企业应用ID |
权限说明: 管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同
返回结果: a)正确时返回示例如下:
{
"UserId": "USERID",
"GroupId": 1244656
}
参数 | 说明 |
---|---|
UserId | 成员UserId(员工账号) 细节同上 |
GroupId | 成员所在的群组Id |
出错时返回示例如下:
{
"errcode": "40029",
"errmsg": "invalid code"
}
机器人发布
机器人支持以群聊为基础开放使用范围,支持开发给指定的群聊和全部企业群,在机器人正式发布全部企业群之前,可以先添加进你已创建的测试群,在测试群完成@机器人应答、各页面打开调试后,再开放全部企业群。
开放后,用户在客户端相应的群聊中,进入添加机器人列表,在企业机器人模块下即可见。
电脑端进入路径:【企业群】-【右上角机器人图标】-【添加机器人】
手机端进入路径:【企业群资料页】-【机器人】-【添加】
/快捷命令
介绍
/命令提供了一种与机器人快捷进行通信的方式。
用户在群聊会话中,输入/可调起命令列表,选择命令发出,发到会话中“/命令”以及命令后带的消息都会发送给相应的机器人所设置的回调URL上。
为使你的命令生效,请务必处理所设置的命令并响应返回,返回的消息所支持类型请查看:消息类型和数据格式
建议将你的机器人所提供的主要业务,集成设置成/命令呈现给用户,方便用户了解使用。如果你的的命令比较复杂,建议增加“/帮助”命令,详细介绍机器人所提供的业务能力。
命令必须以“/”开头,不超过8个字符,命令可以支持中英文、数字、下划线"_"、连接线"-",参考如下定时通知的命令:
快捷命令设置
自定义机器人
如果你还未创建机器人,请根据添加机器人指引完成创建完机器人,在机器人设置页中打开【接收消息】→ "/"快捷命令;
在设置/命令之前,需完成回调地址的配置,请参阅设置回调地址
如果你已经创建好了机器人,直接前往机器人设置页在【接收消息】→ "/"快捷命令完成设置。
斜杠命令的组成有/命令命
和命令说明
两部分,命令说明
是作为对命令功能的解释,或者可以是引导用户使用命令需要提供的参数。
用户使用/命令发出后,/命令以及后面带消息内容均会发送到该机器人的回调URL上,这块不用担心会传错。
命令接收响应处理
用户在客户端使用“/快捷命令”时,Hi平台会发送一条POST消息到“回调地址”上,包含了加密之后的消息体,详细介绍请参阅接收消息
自定义机器人详细介绍请参阅接收消息
企业机器人详细介绍请参阅接收消息
订阅消息与事件
用户在如流上操作会产生事件,机器人可以订阅这些事件来与如流进行业务高度整合,你可以在企业管理后台来开启订阅消息和事件,仅企业机器人可以订阅。
如何订阅消息与事件
在开启订阅消息与事件功能之前,需要先创建一个企业机器人:
1、在企业管理后台创建企业机器人,请参阅创建企业机器人
2、在应用列表,选择你创建的企业机器人,点击进入机器人详情页,点击「接收消息服务器」进入设置,配置一个接收消息URL,并完成有效性验证后,即可接收到如流回调的消息和事件,请参阅接收消息
接收消息与事件列表
每个应用只能配置一个接收消息URL,开启接收消息和事件后,以下所有事件触发后,都会发送到该URL。
开放平台推送 application/json 格式的通知事件,不同类型的事件的消息体内容有所不同,你可以通过事件 event type 字段来区分不同的事件通知。
事件名称 | 事件类型 | 事件描述 | 权限 |
---|---|---|---|
接收消息 | MESSAGE_RECEIVE | 同服务号对话,群里@机器人消息、使用/快捷命令发送消息时推送消息内容 | 必须勾选订阅接收@机器人的消息 |
群基本信息变更 | GROUP_INFO_CHANGE | 群基础信息变更,比如群名称修改 | 必须勾选订阅群聊系统事件 |
新增群管理员 | GROUP_MANAGER_ADD | 新增管理员时推送事件 | 必须勾选订阅群聊系统事件 |
取消群管理员 | GROUP_MANAGER_DEL | 取消管理员时推送事件 | 必须勾选订阅群聊系统事件 |
群成员加入 | GROUP_MEMBER_ADD | 群里有新加入成员时推送事件 | 必须勾选订阅群聊系统事件 |
群成员退出 | GROUP_MEMBER_DEL | 群里有成员退出时推送事件 | 必须勾选订阅群聊系统事件 |
添加机器人 | GROUP_OPEN_APP | 机器人被添加进群时推送事件 | 必须勾选订阅群聊系统事件 |
移除机器人 | GROUP_CLOSE_APP | 机器人被移除群聊时推送事件 | 必须勾选订阅群聊系统事件 |
添加机器人
当群管理员在企业群添加机器人时,平台推送GROUP_OPEN_APP事件到接收消息URL。
回调示例:
{
"eventtype":"GROUP_OPEN_APP",
"groupid":1780915,
"corpid":"hiJdAbPeLKtETa",
"agentid":575,
"time":1586783116712 // 时间戳(ms)
}
移除机器人
当群管理员在企业群移除机器人时,平台推送GROUP_CLOSE_APP事件到接收消息URL。
回调示例:
{
"eventtype": "GROUP_CLOSE_APP",
"agentid": 1,
"groupid": 1235,
"corpid": "hiJdAbPeLKtETa",
"time": 1231212
}
接收消息
消息事件包括与服务号直接对话,以及用户在群聊中“@机器人”、使用“/快捷命令”与机器人进行的对话。 当前应用默认可以接收机器人私聊消息以及使用“/快捷命令”的消息,接收群里中@机器人的消息,需要在企业管理后台开启「用户在群聊中@机器人的消息」权限。 当消息事件发生时,开放平台推送 message 消息到接收消息URL,不同类型的消息通知内容略有差异。
文本消息
回调示例:
{
"eventtype":"MESSAGE_RECEIVE",
"agentid":871,
"groupid":1609028,
"corpid":"hi865cd7777dacfe67",
"message":{
"header":{
"fromuserid":"gaohe02",
"toid":1609028,
"totype":"GROUP",
"msgtype":"MIXED",
"clientmsgid":1584734519361,
"messageid":1661664132266662422,
"msgseqid":"",
"at":{
"atrobotids":[
]
},
"extra":"",
"servertime":1584686519902,
"clienttime":1584686519877,
"updatetime":0
},
"body":[
{
"type":"AT",
"robotid":4100350459,
"name":"test接收消息服务器"
},
{
"type":"TEXT",
"content":" 文本消息"
}
]
},
"time":1584686519955
}
链接消息
回调示例:
{
"eventtype":"MESSAGE_RECEIVE",
"agentid":371,
"groupid":1609028,
"corpid":"hi865cd7777edcfe67",
"message":{
"header":{
"fromuserid":"gaohe02",
"toid":1632128,
"totype":"GROUP",
"msgtype":"MIXED",
"clientmsgid":1584686562535,
"messageid":1661664297539979799,
"msgseqid":"",
"at":{
"atrobotids":[
]
},
"extra":"",
"servertime":1584686563078,
"clienttime":1584686563053,
"updatetime":0
},
"body":[
{
"type":"AT",
"robotid":4100034559,
"name":"test接收消息服务器"
},
{
"type":"TEXT",
"content":" "
},
{
"type":"LINK",
"label":"http://www.baidu.com/"
}
]
},
"time":1584686563176
}
图片消息
回调示例:
{
"eventtype":"MESSAGE_RECEIVE",
"agentid":572,
"groupid":1812300,
"corpid":"hi53Ldm7uvm7zopMha",
"message":{
"header":{
"fromuserid":"zhoumengqi01",
"toid":1834600,
"totype":"GROUP",
"msgtype":"MIXED",
"clientmsgid":1584686612372,
"messageid":1661664345345670862,
"msgseqid":"",
"at":{
"atrobotids":[
]
},
"extra":"",
"servertime":1584686609095,
"clienttime":1584686609057,
"updatetime":0
},
"body":[
{
"type":"AT",
"robotid":4100015525,
"name":"自定义机器人"
},
{
"type":"TEXT",
"content":" "
},
{
"type":"IMAGE",
"downloadurl":"https://e4hi.im.baidu.com/proxy/download?taskId=8bbd0d2f-dad4-4aa5-9f53-12365baad7ff"
}
]
},
"time":1584686609139
}
新增群管理员
回调示例:
{
"eventtype": "GROUP_MANAGER_ADD",
"agentid": 1,
"groupid": 23445,
"corpid": "hiJddbPeLKaEXa",
"userids": ["lisi", "wangwu"],
"time": 1231212121212 //ms
}
取消群管理员
回调示例:
{
"eventtype": "GROUP_MANAGER_DEL",
"agentid": 1,
"groupid": 23445,
"corpid": "hiJddbPeLKaEXa",
"agentid": 1,
"userids": ["lisi", "wangwu"],
"time": 1231212121212 //ms
}
群成员加入
回调示例:
{
"eventtype": "GROUP_MEMBER_ADD",
"agentid": 1,
"corpid": "hiJdAbPeLKtETa",
"groupid": 23445,
"grouptype": "NORMAL", // TOPIC话题群 NORMAL 普通群
"parentgroupid": 2323232, //
"app_extid ": 121212121,
"topic_type_extid": 121212121, // 话题扩展id
"userids": ["lisi", "wangwu"],
"time": 1231212121212121 //
}
群成员退出
回调示例:
{
"eventtype": "GROUP_MEMBER_DEL",
"agentid": 1,
"corpid": "hiJddbPeLKaEXa",
"groupid": 23445,
"grouptype": "NORMAL",
"parentgroupid": 2323232,
"userids": ["lisi", "wangwu"],
"time": 12312121212112 //ms
}
群基本信息变更
表示群的基本属性变更时回调,比如群名称的更改、群头像变更等
回调示例:
{
"eventtype": "GROUP_INFO_CHANGE",
"agentid": 1,
"corpid": "hiJdAbPeLKtETa",
"groupid": 23445,
"grouptype": "NORMAL",
"parentgroupid": 2323232,
"groupinfo": {
"headmd5": "",
"desc": "",
"bulletin": "",
"friendlylevel": "",
"name": "",
"digest": "",
"owneruserid": "zhangsan",
"createtime": 1212121211, //ms
"updatetime": 1500000000 //ms
},
"time": 12312121212121 //ms
}