You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Chat Bot无法接收按钮触发的CARD_CLICKED事件求助

解决Google Chat机器人无法接收CARD_CLICKED事件的问题

核心问题:卡片格式错误

你当前的卡片被嵌套在hostAppDataAction.chatDataAction.createMessageAction结构中,这是用于触发创建新消息的动作,而非定义按钮点击时向机器人发送事件的交互逻辑。这种结构会导致Google Chat无法正确将按钮点击事件转发到你的机器人端点。

解决方案步骤

1. 修正卡片返回格式

移除外层的hostAppDataAction嵌套,直接返回包含cardsV2的消息对象。正确的响应格式应该是直接将卡片作为消息内容返回,而不是包裹在创建消息的动作里。

修正后的卡片结构示例:

{
  "cardsV2": [
    {
      "cardId": "example-card",
      "card": {
        "header": {
          "title": "Approve or Reject Request",
          "subtitle": "User: John Doe"
        },
        "sections": [
          {
            "widgets": [
              {
                "buttonList": {
                  "buttons": [
                    {
                      "text": "Approve",
                      "onClick": {
                        "action": {
                          "actionMethodName": "approve_action",
                          "parameters": [
                            {"key": "id", "value": "12345"}
                          ]
                        }
                      }
                    },
                    {
                      "text": "Reject",
                      "onClick": {
                        "action": {
                          "actionMethodName": "reject_action",
                          "parameters": [
                            {"key": "id", "value": "12345"}
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

2. 优化事件接收逻辑

在Ktor端点中增加事件类型的判断,方便调试和处理CARD_CLICKED事件:

routing {
    post("/chat/events") {
        val event = call.receive<Map<String, Any>>()
        val eventType = event["type"] as String
        logger.info("Received event type: $eventType, data: ${mapper.writeValueAsString(event)}")

        // 针对性处理卡片点击事件
        if (eventType == "CARD_CLICKED") {
            val actionData = event["action"] as Map<String, Any>
            val methodName = actionData["actionMethodName"] as String
            val parameters = actionData["parameters"] as List<Map<String, String>>
            logger.info("Triggered action: $methodName, parameters: $parameters")
        }

        call.respond(HttpStatusCode.OK)
    }
}

3. 额外检查项

  • 确认Google Cloud Console的Chat API配置中,事件订阅的端点URL与Ktor服务地址完全一致(必须是HTTPS协议,Google Chat仅支持HTTPS端点)。
  • 检查服务器访问日志,确认是否有Google Chat发送的CARD_CLICKED请求被防火墙或反向代理拦截。
  • 验证卡片中actionMethodName的拼写,以及参数的key和value格式是否符合要求。

原理说明

当用户点击卡片按钮时,Google Chat会直接向机器人的事件端点发送CARD_CLICKED类型的POST请求,请求体包含actionMethodName和参数信息。如果卡片被错误嵌套在创建消息的动作结构中,Google Chat会执行创建消息的操作,而非触发机器人的事件回调,导致你无法收到预期请求。

内容的提问来源于stack exchange,提问作者Anton Bobrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:34:56