You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存发送至Bot的主动消息?BotConnector主动消息日志记录异常

解决Bot主动消息的日志记录问题

问题的核心很明确:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:33:07