Azure Bot Framework无法拦截机器人响应问题咨询
Bot Framework 出站消息字段提取解决方案
你当前的代码已经成功实现了收发消息的拦截逻辑,无法提取机器人发送消息值的核心原因是:activities参数为数组类型,每个元素才对应单条机器人待发送的消息实体,需要遍历数组后提取对应字段。
具体实现步骤
- 遍历
activities数组,优先过滤type为message的活动,排除会话更新、事件通知等非用户可见的消息类活动 - 从单条活动对象中提取需要的字段,常用可提取字段如下:
text:机器人发送的纯文本内容id:消息的唯一标识IDrecipient.id:接收该消息的用户IDattachments:消息携带的附件列表(包含富文本卡片、文件等资源)locale:消息对应的语言标识
修正后的完整代码示例
adapter.use(async (turnContext, next) => { // 预处理用户发送的入站消息 console.log("adapture use::入站消息内容::" + turnContext.activity.text); // 注册出站消息拦截处理器 turnContext.onSendActivities(async (sendContext, activities, nextSend) => { // 出站消息预处理(发送前逻辑,如需修改消息内容需放在此处执行) activities.forEach(activity => { if (activity.type === 'message') { console.log("待发送的机器人消息文本:" + activity.text); console.log("消息接收用户ID:" + activity.recipient.id); // 此处可自定义业务逻辑,比如敏感词过滤、消息内容埋点等 } }); // 执行消息发送动作 const sendResponse = await nextSend(); // 出站消息后处理(发送后逻辑,如需记录发送结果可放在此处执行) console.log("adapture use::消息发送返回结果::" + JSON.stringify(sendResponse)); return sendResponse; }); await next(); // 当前轮次入站消息处理完成回调 console.log(`Processing activity ${turnContext.activity.id} finishing. `); });
补充说明
如果机器人在单轮交互中会发送多条消息(比如先发送加载提示,再返回业务结果),activities数组会包含所有待发送的消息,遍历即可全部捕获处理。
内容的提问来源于stack exchange,提问作者krati Agarwal
相关产品推荐
相关产品推荐

