如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息?

2023-12-12

我在 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.
});

所以你传递给的函数.use代表一个中间件,可以对某个对象进行预处理和后处理incoming活动。您可以通过以下方式从回合上下文访问“当前”活动turnContext.Activity财产。这些活动可以从用户发送,也可以从其他系统发送,这些系统通过 DirectLine API 将它们发送到机器人(假设您使用的是机器人框架服务)。

Outgoing活动(即机器人响应传入活动而发送的活动)也可以被中间件拦截,但中间件需要更明确地参与这些活动的发送。它通过使用以下方法向回合上下文注册处理程序来实现此目的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]。因此,如果在轮次期间发送了多个活动,则将为每个批次调用您的处理程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息? 的相关文章

随机推荐

  • MySQL:从表中选择日期位于当前周和当前月的数据

    我正在创建一个网络应用程序 如果用户单击名为 WEEK 的链接 该页面会显示该周提交的所有帖子 还有一个选项可以查看本月提交的所有帖子 posts 表中有一个名为 post date 的列 其中日期的存储格式为 YYYY MM DD 我的问
  • Nodejs HTTP 和 HTTPS 通过同一端口

    我一直在谷歌搜索并在 stackoverflow 上查看 但找不到我喜欢的答案 我有一个通过 HTTPS 和端口 3001 运行的 NodeJS 服务器 现在我想获取端口 3001 上的所有传入 HTTP 请求 并将它们重定向到相同的 UR
  • 为什么使用切片克隆列表会影响原始列表

    下面是我将数组内的对象更改为字符串的代码 无法弄清楚为什么它会影响原始数组 slice 应该克隆数组 如果我是对的 var cloned scope selected items slice 0 cloned forEach functio
  • Hibernate - 外键而不是实体

    目前 Hibernate 允许我直接加载由 一对一关系定义的对象 entity1 getEntity2 是否可以获取外键而不是对象 我看到的当前方法是添加到我的映射中 JoinColumn name message key ManyToOn
  • 使用 while 循环遍历数组? - MIPS [重复]

    这个问题在这里已经有答案了 我想循环遍历一个数字数组 例如 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2
  • Jenkins 使用 Groovy 读取 Jenkinsfile 中文件的特定行

    我正在尝试读取某行的特定行html詹金斯中的文件stage with Groovy并将其内容保存到环境变量中 问题是 File and readLines 不允许 我能够加载文件 env WORKSPACE pwd def file rea
  • PostgreSQL 交叉表查询

    如何在 PostgreSQL 中创建交叉表查询 例如我有下表 Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 我希望查询返回以下交叉表 Section
  • 短的、不区分大小写的字符串混淆策略

    我正在寻找一种识别方法 即编码and解码 一组带有一个标记的 Java 字符串 识别不应涉及数据库持久化 到目前为止 我已经研究了 Base64 编码和 DES 加密 但对于以下要求而言 两者都不是最佳的 Token应该尽可能短 令牌应该对
  • 如何释放通用 TList

    我怎样才能释放一个通用的TList
  • Android 2.2 Spinner 在 Actionbar 中看起来很旧

    在 Android 2 2 上 我的 ActionBar 中的 Spinner 看起来非常丑陋 并且下拉文本颜色与背景颜色相同 这使得文本不可读 这是相关代码 spinner new Spinner getSupportActionBar
  • 身份函数:模板和自动的区别

    我正在为我的一些类编写一个身份函数 用于记录其调用的计数 长话短说 指标 目前 我正在尝试计算使用模板与使用模板的性能差异 优点auto 这是从我正在做的代码中摘取的一个简短示例 namespace Metrics unsigned lon
  • QTKit - 合并两个具有不同宽度和高度的视频?

    我刚刚制作了一个简单的应用程序 它使用 QTKit 将两个视频合并在一起 这里是problem 我刚刚发现 如果我尝试合并两个宽度和高度不同的视频 输出的视频的高度和宽度与大视频相同 但包含带有黑色和宽边框的小视频 问题 如何将两个视频合并
  • JavaFX InputMap/ActionMap 等效吗?

    我终于完全切换到 JavaFX 我非常热衷于按键功能 是否有一种与您在 Swing 中找到的 非常好的 热键架构等效的热键架构 对于 JavaFX 文本控制对象 它是如何工作的 我想如果我看一下一切都会变得清楚javafx scene co
  • 函数下的线显示范围

    我不知道这个的确切名称 所以我不知道我在寻找什么 我在一些编程视频中看到 当光标位于函数内部时 它会显示一条位于函数下方的线 然后向下直到函数作用域的末尾 如下图所示 这是一个扩展还是一个设置 我怎样才能启用它 有人可以帮帮我吗 这显然是最
  • PowerShell AzureRM 命令——避免 Save-AzureRMProfile 过期

    我使用以下命令自动化了 Azure 部署AzureRM命令集 这些命令行开关需要登录 所以我尝试使用提供保存的配置文件Save AzureRMProfile Select AzureRMProfile 然而 一段时间后 配置文件似乎过期了
  • 解析javascript中制表符分隔的文件

    我无法更改服务器端 但我得到的文件如下所示 0 20 59339 138402 1 11 20062 75276 2 32 07597 215573 3 12 2029 82012 4 6 800035 45701 5 0 6548425
  • Selenium:在同一选项卡中打开链接

    我通过 Selenium webdriver 单击链接 该链接将打开一个新窗口 我想强制该链接在同一窗口 和同一选项卡 中打开 这可能吗 大多数时候 这种情况不仅仅发生在特定链接上 Thanks 在单击链接之前更新链接的target财产给s
  • 奇怪的 toCharArray() 行为

    我正在尝试toCharArray 并发现一些奇怪的行为 Suppose private static final char HEX CHARS 0123456789abcdef toCharArray System out println
  • Haskell 中快速随机生成器的好选择

    我有一个用例 我想测试一些赌博游戏的程序 我需要的随机数应该在一个非常小的区域 1到9 并且不需要真正的质量 我发现 Haskell 的标准生成器对我来说太慢了 所以有人有更好的想法吗 The 梅森随机纯64包裹非常快 原样MWC 随机
  • 如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息?

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