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

如何捕获Microsoft BotBuilder中的对话结束事件?

嘿,看你用的是BotBuilder v3版本的代码对吧?要捕获用户关闭或者终止对话的事件,其实可以通过监听两个关键事件来实现,我给你一步步讲清楚:

捕获对话终止事件的两种方法

1. 监听endOfConversation事件

这个事件会在对话被明确终止时触发——比如用户在Teams、Direct Line这类支持的渠道里主动关闭对话,或者你的机器人调用session.endConversation()结束对话时。你可以直接在bot实例上监听这个事件,处理后续逻辑:

bot.on('endOfConversation', (event) => {
    // 这里可以添加你的自定义逻辑,比如记录日志、清理用户会话数据
    console.log(`对话已终止 | 对话ID: ${event.address.conversation.id} | 用户ID: ${event.address.user.id}`);
    
    // 如果需要清理该用户的会话数据,可以这么做
    bot.loadSession(event.address, (err, session) => {
        if (!err && session) {
            session.clearDialogStack(); // 清除对话栈
            session.save(); // 保存修改
        }
    });
});

2. 监听conversationUpdate事件

有些渠道可能不会主动发送endOfConversation事件,这时候你可以通过conversationUpdate事件里的成员变化来判断用户是否离开对话。当用户被移出对话成员列表时,就可以触发你的处理逻辑:

bot.on('conversationUpdate', (event) => {
    // 检查是否有成员被移除
    if (event.membersRemoved) {
        event.membersRemoved.forEach((removedMember) => {
            // 确认被移除的是用户,不是机器人自己
            if (removedMember.id !== event.address.bot.id) {
                console.log(`用户 ${removedMember.name || removedMember.id} 已离开对话`);
                // 这里添加你的后续处理逻辑
            }
        });
    }
});
适配你的完整代码示例

把上面的监听逻辑整合到你的initialize函数里,大概是这样:

const builder = require('botbuilder');
const connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});
const inMemoryStorage = new builder.MemoryBotStorage();
const bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage);

initialize(bot);

function initialize(bot) {
    // 监听对话终止事件
    bot.on('endOfConversation', (event) => {
        console.log(`对话已终止 | 对话ID: ${event.address.conversation.id} | 用户ID: ${event.address.user.id}`);
        
        bot.loadSession(event.address, (err, session) => {
            if (!err && session) {
                session.clearDialogStack();
                session.save();
            }
        });
    });

    // 监听对话更新事件,处理用户离开
    bot.on('conversationUpdate', (event) => {
        if (event.membersRemoved) {
            event.membersRemoved.forEach(member => {
                if (member.id !== event.address.bot.id) {
                    console.log(`用户 ${member.name || member.id} 已离开对话`);
                }
            });
        }
    });

    // 这里放你原本的对话逻辑,比如默认对话
    bot.dialog('/', [
        (session) => {
            session.send('你好!欢迎和我聊天~');
        }
    ]);
}

注意:不同渠道对这些事件的支持程度不一样,建议你在实际使用的渠道里测试一下,确保事件能正常触发。

内容的提问来源于stack exchange,提问作者user964409

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:51