好的。因此,让我们分解问题。
您想要做的是将您的机器人与它与 Microsoft Bot 连接器/框架的任何和所有通信隔离开来。
首先了解 Microsoft Bot Framework 生态系统中涉及哪些组件。
了解 Bot Framework 生态系统
一个普通的机器人通常会与 3 个 Microsoft 服务交互 -
现在要创建本地机器人,您需要替换/模拟上述所有组件。幸运的是,Bot Builder SDK 是开源的并且设计良好。与上述服务交互的实现是接口驱动的,易于更改。
了解和修改 Bot Builder SDK 以创建本地 Bot
由于我们的目标是不使用任何 Microsoft 服务,因此我们不需要 MSA 服务器来生成令牌。所以不需要机器人注册。
最容易替换的服务是Bot State Service。您需要做的就是实现IBotDataStore 或IBotState 接口。因此,例如,您可以将状态存储到您自己的 Redis 数据库中,而不是将状态存储在 Bot 状态服务中。我写了一个blog post 来说明如何做到这一点。
现在剩下的就是替换 Bot Connector。这很棘手,而且不是直截了当的。另外,它不是开源的,所以你自己在这里。如上所述,第一个重要的部分是频道适配。由于您提到您只需要网络聊天频道,因此没有太多可适应的(呃?!)。它所做的第二件事是会话跟踪,它依赖于专门生成的不同 ID 会话 ID 和活动 ID。你必须understand 他们代表什么。会话 ID 通常由频道创建和修改。
您必须在此处选择如何创建对话 ID。默认情况下,网络聊天具有临时对话 ID。您可以选择使其更永久(一种方法是要求用户登录并使用用户 ID)。
消息路由在网络聊天频道中的工作方式不同,因为 Bot 连接器没有一个特定的端点必须调用(如 Facebook Graph API)。因此网络聊天频道使用Direct Line APIs 发送消息并轮询(或使用套接字)特定端点来接收消息。网络聊天频道是open source,继续看看他们是如何做到的。
因此,要完全替换 Bot Connector API,您需要创建自己的 connector 服务
- 接受来自网络聊天频道的请求。
- 调整它并将请求转发给机器人
- 接受来自 bot 的响应(我们将了解如何执行此操作)
- 在某些持久存储中维护响应。需要,因为用户可能已经关闭了网页,所以您可能需要在他回来时交付它。
- 在下一次投票(或使用套接字)时将响应返回到网络聊天频道。
诚然,这并非微不足道,但您可以做出一些设计决策,让生活更轻松一些。例如取消 adapter 并保持单一模式用于从网络聊天控件到机器人并返回(但随后您将需要更改网络聊天频道代码)。对于初学者,您甚至可以查看BotFramework Emulator code,它模拟 Direct Line API。
现在如何让您的机器人向您自己的connector 服务发送回复?为此,您需要实现IBotToUser 接口。这很容易做到。看看我的repo,我将响应返回给 Skype For Business 客户端而不是 Bot 连接器。
这就是我相信的。如果你能完成上述工作,你就可以拥有一个完全隔离的机器人,而无需连接到云。为了安全起见,您可能有自己的 OAuth 提供者(我推荐 IdentityServer)或在使用机器人之前让用户登录。除非我对您的应用生态系统和用例有更多了解,否则我无法回答安全细节。
对话数据(和状态)可以很容易地存储在您的本地数据库中。在我看来,如果您可以继续使用 Bot Connector 并仅替换 Bot 状态服务,那将是最好的(您还可以继续从 Bot Framework 接收新功能,而无需更改任何代码)。
以上所有信息均来自我自己使用 Bot Framework 的经验。如果有人有更好的建议,请随时分享,我会进行修改。