Stream 模式响应卡片回传请求事件

以开发一个智能小助手为例演示如何通过 Stream 模式响应卡片回传请求事件,本教程主要演示如何发送、更新互动卡片,以及通过 Stream 方式接收和处理卡片可交互组件的回传请求事件。

前提条件

  1. 完成创建企业内部应用机器人的流程。

    机器人接收消息模式选择 Stream 模式
  2. 完成添加机器人入群的流程。

阶段一:明确开发需求

正式开发智能小助手前,你需要明确本教程实现的具体场景及需要使用哪些能力。

阶段二:搭建卡片模板

1. 登录卡片平台

你可以通过以下任一方式进入卡片平台:

2. 新建卡片模板

  1. 在卡片平台页面,单击侧边导航栏新建模板

  2. 配置卡片信息:

    配置项

    说明

    模板名称

    本示例填写:钉三多智能回复卡片模板。

    卡片类型

    选择消息卡片。

    卡片模板场景

    选择普通卡片。

    关联应用

    选择前提条件创建机器人的所属应用。

    配置完成后,单击创建,进入卡片模板搭建页面。

3. 配置模板内容

  1. 在卡片模板搭建页面,单击左侧导航栏变量 > 新增,选择新增普通变量

    变量名

    变量类型

    变量描述

    是否为私有数据

    markdown

    Markdown内容

    /

    likeStatus

    字符串

    点赞状态

    likes

    数字

    点赞数量

    feedbacks

    数字数组

    反馈多选列表索引

    feedbackinput

    字符串

    其他反馈

    image

    配置完成后,单击保存

  2. 设置 Mock 数据用于预览效果。

    image

    配置好自己想要预览的数据后,单击保存

  3. 单击左侧导航栏组件库,添加 Markdown 组件,并绑定 markdown 变量。

    image

  4. 添加基础文本组件,并在内容中引用 likes 变量。

    image

  5. 配置点赞点踩按钮组件。

    1. 添加 1:1 布局组件。

    2. 设置内容项下的是否显示为条件计算,单击创建新条件 > 变量:

      配置项

      说明

      变量

      选择 likeStatus 字段。

      条件

      选择为空。

      image

    3. 添加点赞点踩两个按钮组件。

      1. 分别拖拽两个单个按钮至布局组件中:

        image

      2. 配置点赞按钮和点踩按钮的内容:

        按钮

        说明

        点赞

        配置内容项:

        • 按钮文案:点赞

        • 图标类型:选择 IconFont 图标

        • 图标:选择点赞图标

        image

        点踩

        配置内容项:

        • 按钮文案:点踩

        • 按钮颜色:选择红色 red

        • 图标类型:选择 IconFont 图标

        • 图标:选择 X 图标

        image

      3. 配置点赞按钮和点踩按钮的事件:

        按钮

        说明

        点赞

        配置事件项:

        • 按钮点击事件类型:回传请求

        • 回传参数:设置参数名 action 为常量 like

        • 请求成功 Toast 文案:点赞成功

        • 请求失败 Toast 文案:点赞请求发送失败

        • 请求成功判定条件:设置条件当变量 likeStatus 等于常量 like

        image

        点踩

        配置事件项:

        • 按钮点击事件类型:回传请求

        • 回传参数:设置参数名 action 为常量 dislike

        • 请求成功 Toast 文案:点踩成功

        • 请求失败 Toast 文案:点踩请求发送失败

        • 请求成功判定条件:设置条件当变量 likeStatus 等于常量 dislike

        image

  6. 配置已点赞已点踩按钮组件。

    1. 分别拖拽两个单个按钮至布局组件中:

      image

    2. 配置已点赞按钮和已点踩按钮:

      按钮

      说明

      已点赞

      配置内容项:

      • 按钮文案:已点赞

      • 按钮状态:选择禁用 disabled

      • 按钮颜色:选择蓝色 blue

      • 是否显示:设置条件当变量 likeStatus 等于常量 like 时显示

      image

      已点踩

      配置内容项:

      • 按钮文案:已点踩

      • 按钮状态:选择禁用 disabled

      • 按钮颜色:选择红色 red

      • 是否显示:设置条件当变量 likeStatus 等于常量 dislike 时显示

      image

  7. 配置区块组件文本+下拉多

    1. 添加区块组件文本 + 下拉多

      image

    2. 配置区块组件文本+下拉多,并设置内容项:

      配置项

      说明

      组件唯一 ID

      填写:feedbacks

      选中项下标

      选择feedbacks

      选项列表

      配置列表:

      • 没有理解指令

      • 答非所问

      • 回答逻辑混乱

      • 答案格式错误

      • 敏感有害回复

      • 存在价值观问题

      文本列表

      内容

      填写:反馈

      图标

      选择灯泡图标

      image

      image

  8. 配置区块组件文本输入

    1. 添加区块组件文本输入

      image

    2. 配置区块组件文本输入,并设置内容项:

      配置项

      说明

      占位提示文案

      填写:输入其它反馈

      输入框标题

      填写:其它反馈

      输入框提示

      填写:输入其它反馈

      当前输入内容

      填写:${feedbackInput}

      image

阶段三:开发代码

代码说明

在上面的代码中,依次注册了机器人接收消息的回调函数 ReplyCardBotHandler 和卡片回传事件的回调函数 CardCallbackHandler

卡片回传请求参数说明

点击点赞按钮的卡片回传请求参数示例:

{
  "specVersion": "1.0",
  "type": "CALLBACK",
  "headers": {
    "appId": "xxxx",
    "connectionId": "xxxx",
    "contentType": "application/json",
    "messageId": "xxxx",
    "time": "1713253544951",
    "topic": "/v1.0/card/instances/callback"
  },
  "data": "{\"extension\":\"{}\",\"corpId\":\"dingxxxx\",\"spaceType\":\"im\",\"userIdType\":1,\"type\":\"actionCallback\",\"userId\":\"xxxx\",\"content\":\"{\\\"cardPrivateData\\\":{\\\"actionIds\\\":[\\\"single_button_node_ocltl6e6foq\\\"],\\\"params\\\":{\\\"action\\\":\\\"like\\\"}}}\",\"spaceId\":\"cidxxxx\",\"outTrackId\":\"xxxx\",\"value\":\"{\\\"cardPrivateData\\\":{\\\"actionIds\\\":[\\\"single_button_node_ocltl6e6foq\\\"],\\\"params\\\":{\\\"action\\\":\\\"like\\\"}}}\"}"
}

解析 data 属性:

{
  "extension": "{}",
  "corpId": "dingxxxx",
  "spaceType": "im",
  "userIdType": 1,
  "type": "actionCallback",
  "userId": "xxxx",
  "content": "{\"cardPrivateData\":{\"actionIds\":[\"single_button_node_ocltl6e6foq\"],\"params\":{\"action\":\"like\"}}}",
  "spaceId": "cidxxxx",
  "outTrackId": "xxxx",
  "value": "{\"cardPrivateData\":{\"actionIds\":[\"single_button_node_ocltl6e6foq\"],\"params\":{\"action\":\"like\"}}}"
}

解析 content 属性:

{
  "cardPrivateData": {
    "actionIds": ["single_button_node_ocltl6e6foq"],
    "params": { "action": "like" }
  }
}

卡片可交互组件的回传请求事件设置的组件唯一 ID 和回传参数都可以从这里的 cardPrivateData 拿到,例如点赞按钮的回传请求事件绑定的回传参数 "params": { "action": "like" }。开发者可以根据回传的 cardPrivateData 识别触发的是什么回传请求事件并处理业务逻辑。更多事件回调相关参考文档:事件回调

启动示例 demo

python card_callback.py --client_id="your-client-id" --client_secret="your-client-secret"

参数

说明

your-client-id

应用Client ID

your-client-secret

应用Client Secret

至此,你已成功完成智能小助手服务的开发和部署。接下来可以体验自己开发的智能小助手服务了。

重要

如果启动 Stream 服务后没有收到卡片回传请求事件,可以从以下四个方面进行检查。

  1. 检查一下是否注册 topic 为 /v1.0/card/instances/callback 的卡片回调。

  2. 检查一下创建卡片时是否传入 callbackType="STREAM" 参数。

  3. 检查一下创建卡片时用于生成 access_token 的 client-id 和注册回调服务使用的 client-id 是不是同一个。

  4. 检查一下同一个 client-id 和 client-secret 是否启动了不止一个 Stream 服务。

    请务必保证一个 client-id 同一时间只启动一个 Stream 服务。如果有线上 Stream 服务在运行,希望在线下启动 Stream 服务开发调试,可以额外创建一个开发调试用的 client-id,线上线下分别使用不同的 client-id 进行隔离,避免相互干扰。

效果演示

相关内容

如果你需要了解更多互动卡片示例,请参考互动卡片示例中心