如何保存发送至Bot的主动消息?BotConnector主动消息日志记录异常
问题的核心很明确:你的CustomLogger是绑定在Bot Framework的活动处理流程上的,只会记录Bot接收到的消息,或者通过Bot Framework内置方法发送的消息。但你现在用Axios直接调用Bot Connector API发送主动消息,完全绕开了框架的日志钩子,所以这些消息自然不会被logActivity捕获到。
下面给你两种可行的解决方案,从简单到规范:
方案一:手动调用日志类记录主动消息
这是最直接的临时解决方案——在发送主动消息的函数里,手动构造一个符合Activity格式的对象,然后调用CustomLogger的logActivity方法。
修改你的sendMessage函数:
// 先确保你有CustomLogger的实例 const customLogger = new CustomLogger(); /** * Send message to the user. */ function sendMessage(token, conversationId, name) { var config = { headers: { "Authorization": "Bearer " + token } }; var bodyParameters = { "type": "message", "text": name, "conversation": { id: conversationId }, "from": { role: "bot" }, // 标记消息来自Bot "id": Date.now().toString() // 生成一个临时消息ID,或者后续用API返回的真实ID更新 } // 先触发日志记录 customLogger.logActivity(bodyParameters); axios.post( `https://smba.trafficmanager.net/apis/v3/conversations/${conversationId}/activities`, bodyParameters, config ).then((response) => { console.log(response) // 如果需要用API返回的真实消息ID修正日志,可以在这里执行数据库更新操作 // 比如 Conv.update({ message_id: response.data.id }, { where: { message_id: bodyParameters.id } }) }).catch((error) => { console.log(error) }); }
这样发送主动消息时,就会手动触发日志记录,和普通消息的逻辑保持一致。
方案二:改用Bot Framework官方方法发送主动消息(推荐)
直接调用API虽然灵活,但会脱离Bot Framework的生态,日志、中间件等功能都会失效。更规范的做法是用Bot Framework的adapter.continueConversation方法来发送主动消息,这样框架会自动触发你的日志类。
假设你用的是Bot Framework v4,代码示例如下:
const { BotFrameworkAdapter } = require('botbuilder'); // 初始化适配器(填入你的Bot的appId和appPassword) const adapter = new BotFrameworkAdapter({ appId: process.env.MicrosoftAppId, appPassword: process.env.MicrosoftAppPassword }); /** * 用框架标准方法发送主动消息 */ async function sendProactiveMessage(conversationId, name) { try { // 构造会话引用信息 const conversationReference = { conversation: { id: conversationId }, channelId: 'msteams', // 根据你的实际渠道修改,比如'facebook'、'slack'等 serviceUrl: 'https://smba.trafficmanager.net/apis/' }; // 通过适配器发送消息,会自动触发日志中间件 await adapter.continueConversation(conversationReference, async (turnContext) => { await turnContext.sendActivity(name); }); console.log('主动消息发送成功'); } catch (error) { console.error('发送主动消息失败:', error); } } // 调用示例 let name = "Hey, How was your week?"; let conversationId = "29:XXXXXXXXXXXXXXX"; sendProactiveMessage(conversationId, name);
这样发送的消息会经过Bot Framework的完整生命周期,包括你的CustomLogger的logActivity方法,不需要手动调用日志,更符合框架的设计规范。
额外修正:你的日志类里的语法错误
注意到CustomLogger里有个逻辑错误:
if (id.indexOf("| !== -1")) {
这里的写法是错误的,你想判断id里是否包含|,但实际上是在判断字符串"| !== -1"是否存在于id中。正确的写法应该是:
if (id && id.indexOf('|') !== -1) {
这个错误会导致你处理会话ID时逻辑异常,建议先修正这个问题,避免后续日志出现错误的会话ID。
内容的提问来源于stack exchange,提问作者zkKirol

