如何在Python版Microsoft Bot Framework中捕获机器人响应内容
解决方案
方法1:使用自定义中间件全局捕获所有机器人响应
该方案适合需要全量采集机器人响应的场景,不管在哪个对话模块发送的内容都可以统一拦截获取:
- 首先自定义中间件类,重写
on_turn方法,等机器人完成业务逻辑生成响应后,从上下文的出站活动队列里获取响应内容
from botbuilder.core import Middleware, TurnContext class CaptureResponseMiddleware(Middleware): async def on_turn(self, turn_context: TurnContext, next): # 先执行后续业务逻辑,等待机器人生成所有响应内容 await next() # 遍历本次交互所有出站活动 for activity in turn_context.activities: # 过滤机器人发送的文本消息,可根据需求扩展支持卡片、附件等内容类型 if activity.type == "message" and activity.text: # 此处已获取机器人响应文本,可自行实现存储、日志、审核等逻辑 bot_response = activity.text print(f"机器人响应内容:{bot_response}")
- 在Bot初始化阶段将中间件注册到Adapter即可生效
from botbuilder.core import BotFrameworkAdapter adapter = BotFrameworkAdapter(...) # 注册自定义响应捕获中间件 adapter.use(CaptureResponseMiddleware())
方法2:发送响应时直接捕获(轻量场景)
如果仅需要在特定对话节点获取响应内容,无需全局采集,可以在调用发送接口时直接取返回结果:
# 发送响应时直接获取返回的活动对象 response_activity = await turn_context.send_activity("需要发送给用户的内容") # 直接提取响应文本 bot_response = response_activity.text # 自行处理业务逻辑 print(f"当前节点发送的响应:{bot_response}")
注意事项
- 如果机器人发送的是富文本卡片、附件等非纯文本内容,需要从
activity.attachments、activity.cards等属性提取对应内容,不要仅读取text字段 - 单次交互中如果机器人发送了多条消息,
turn_context.activities会包含所有出站活动,可根据业务需求做过滤处理
内容的提问来源于stack exchange,提问作者user9855045
相关产品推荐
相关产品推荐

