Botpress对接MS Teams后,如何读取Adaptive Card用户输入?
解决Botpress对接Teams时无法解析自适应卡片用户输入的问题
1. 检查自适应卡片的提交结构配置
- 确保所有输入控件都设置了唯一的
id属性,比如<Input.Text id="username" placeholder="输入用户名" />,这是识别输入字段的基础 - 提交按钮必须使用
Action.Submit类型,并且在data字段里定义结构化的提交标识,示例:
这样能让Botpress区分常规消息和卡片提交消息。{ "type": "Action.Submit", "title": "提交", "data": { "action": "cardSubmit", "inputType": "userForm" } }
2. 在Botpress中添加自定义中间件解析提交数据
Teams发送的自适应卡片提交数据不会放在常规的text字段里,而是在event.raw.activity.value中。可以通过Botpress的incoming middleware手动解析:
bp.events.registerMiddleware({ name: 'parseTeamsCardSubmission', type: 'incoming', handler: async (event, next) => { // 仅处理Teams平台的卡片提交事件 if (event.platform === 'teams' && event.raw.activity?.value) { // 将提交的结构化数据转为Botpress可识别的payload // 可以直接转成文本,或者提取特定字段赋值给event.payload.text event.payload.text = JSON.stringify(event.raw.activity.value); // 示例:提取单个字段 // event.payload.text = event.raw.activity.value.username; } next(); } });
添加后,在Botpress的流程节点里就能获取到解析后的用户输入。
3. 验证Azure Bot Service的消息转发
- 登录Azure门户,进入你的Bot Service,在「测试在Web Chat」中发送自适应卡片并提交输入,查看「日志」里的消息详情,确认提交数据是否完整转发到Botpress的webhook地址
- 检查Teams通道的配置,确保没有开启不必要的消息过滤规则,比如拦截非文本消息
4. 调整Botpress流程的输入监听逻辑
- 在Botpress的可视化流程中,将「等待用户输入」节点的触发条件改为监听卡片提交事件,比如设置条件为:
event.raw.activity?.type === 'message' && event.raw.activity?.value - 后续节点可以直接使用
event.raw.activity.value来获取用户在卡片中填写的各个字段值,比如{{event.raw.activity.value.username}}
内容的提问来源于stack exchange,提问作者Eva Stohrer
相关产品推荐
相关产品推荐

