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
相关产品推荐
相关产品推荐

