【问题标题】:How to differentiate Bot to user AND user to Bot messages using middleware in bot builder sdk v4?如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息?
【发布时间】:2019-01-17 02:04:37
【问题描述】:

我在 sdk V4 Bot 中实现了一个中间件,以拦截 bot 和用户之间的每条消息并记录该自定义 mongo Db。我正在尝试为使用 SDK v4 构建的 Bot 实现类似的概念。看起来我可以使用以下代码添加中间件,但不知道如何区分机器人到用户和用户到机器人之间的消息。

V3 机器人代码

bot.use({
    botbuilder: function (session, next) {
        logUserConversation(session)
        next()
    },
    send: function (event, next) {
        logBotsConversation(event)
        next()
    }
})

中间件的 V4 机器人代码

botAdapter.use(async (turnContext, next) => {
    // How to find which messages/activity object is from user to bot

    await next();
    // How to find which messages/activity object is from bot to user.
});

【问题讨论】:

    标签: node.js botframework middleware microsoft-cognitive


    【解决方案1】:

    因此,您传递给.use 的函数代表了一个中间件,它可以对传入 活动进行预处理和后处理。您可以通过 turnContext.Activity 属性从转弯上下文访问“当前”活动。这些活动既可以从用户发送,也可以从通过 DirectLine API 将它们发送到机器人的其他系统发送(假设您使用的是机器人框架服务)。

    传出活动,即从机器人发送以响应传入活动的活动,也可以被中间件拦截,但中间件需要更多地参与这些活动的发送明确地。它通过使用onSendActivities API 向转弯上下文注册处理程序来实现这一点。

    这一切结合在一起看起来有点像这样:

    botAdapter.use(async (turnContext, next) => {
        // pre-processing of the current incoming activity
        console.log(`Processing activity ${turnContext.activity.id} starting... `);
    
        // hook up a handler to process any outgoing activities sent during this turn
        turnContext.onSendActivities(async (sendContext, activities, nextSend) => {
           // pre-processing of outgoing activities
    
           await nextSend();       
    
           // post-processing outgoing activities
        });
    
        await next();
    
        // post-processing of the current incoming activity 
        console.log(`Processing activity ${turnContext.activity.id} finishing. `);    
    
    });
    

    需要注意的一件事是传出活动处理程序可以被调用0..* 次,因为它们基本上是由下游逻辑调用turnContext.sendActivit[y|ies] 触发的。因此,如果在轮次中发送了多个活动,则将为每个批次调用您的处理程序。

    【讨论】:

    • 我无法使用上述逻辑捕获从 Bot 到 User 的活动。 turnContext.activity.text 。 - 给出用户输入的文本。
    • 在传递给 onSendActivities 的闭包中,您需要确保使用的是 sendContext 变量,not turnContext。
    • 我这样做了,但没有用。前我从上面的代码(turnContext.activity.text)中的第一个console.log发送文本'帮助'给机器人,这导致'帮助'。听起来不错。当机器人回复准备好时,'我可以提供帮助你完成了你的任务。为了在 turnContext.onSendActivities(.....) 中捕获这一点,我做了 sendContext.activity.text 再次导致用户输入的“帮助”。
    • 似乎活动对象包含从机器人到用户的数据。
    • 对不起,您正在查看turnContext.activity...这是总是传入的活动。在onSendActivities 的范围内,传出活动位于activities 参数中,该参数是Activity 的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2017-10-23
    相关资源
    最近更新 更多