为事件注册用户,自动在数据库中搜索答案,与技术支持进行交流,交换联系人-这些都是我们Leader-ID机器人功能的一部分。 他“生活”在三个平台上:VK,Facebook Messenger和Telegram,而他的工作逻辑是使用与平台无关的抽象为所有人编写的。 这种方法使您可以快速添加新功能并研磨旧功能。

系统的结构使针对不同平台的功能的开发变得统一,并且与在每个平台相关的API中手动重写它们的选项相比,简化了一个数量级的过程。 同时,要在新平台上启动漫游器,只需编写适当的适配器(
connector )。
我想简单地谈谈这种结构。 对于那些想编写自己的跨平台机器人但还没有深入研究该主题并研究他人经验的人来说,这可能会很有用。
让我们熟悉我们的机器人。 他可以在
Telegram ,
VK ,
FB中找到,他可以同时为多达数千人服务(就像大型活动中发生的那样)。 顺便说一下,我们可以从
第一篇文章中了解我们是谁,我们做什么。 简而言之,我们在整个俄罗斯运营着一个庞大的免费合作办公和演示空间网络,同时支持
Leader-ID通信平台,该平台是整个系统的核心。 机器人在整个故事中扮演着重要的角色。
双枪-双重乐趣
实际上,我们有两个机器人。 第一个是主要的,负责与用户进行交互。 它是用户进行活动注册,与支持进行交互以及从讲座和研讨会获得更多信息以及在同一生态系统内交换联系的便捷方式。

第二个bot本质上是支持操作员的界面。 Bot可以协同工作,但是它们的基础和接口是分开的。
使用他们的示例,我们将展示这种系统的结构。 但是,在简单的情况下,我们将开始逐渐解开此球。
最简单的机器人的结构
在基本版本中,该漫游器仅包含一项服务,该服务通过我们需要的Messenger(平台)的API发送和接收消息,例如Telegram。

如果我们想通过多个Messenger与用户进行通信,则以平台无关的方式编写逻辑,并在结构中添加连接器以将命令和数据从内部格式转换为相应平台的格式(信使)是合理的。

这样就可以在一个地方添加新功能,而不必在每个平台上分别复制它们。
连接器是从平台接收消息以转发到内核的服务,反之亦然。 通常,这些是系统的相对独立的组件,如有必要,可以将它们放在单独的服务器上,并具有多个副本,依此类推。
我们组织连接器和内核的通信(轮询数据库,或者如何做)
因此,我们面临着组织连接器和核心之间的数据交换的任务。 第一种选择是通过数据库发送新消息。 我们从这里开始。 因此,数据库本身出现在我们的方案中,结构如下:用Python编写的内核,以及基于MongoDB的基础(此选择的原因完全是历史性的),以及连接器。

这个方案对我们来说作用不长。 当消息数量超过70万,并且峰值频率达到每秒120次命中时,索引变得更重,数据库的轮询变得更加昂贵。 我必须在这里连接RabbitMQ经纪人。 它的主要作用是生成有关组件(核心/连接器)应处理具有特定标识符的消息的通知。 这些ID通过它传输。 RabbitMQ已经卸载了我们的基础和组件,它们现在不需要经常检查数据库以获取新信息进行处理。
结果,我们的基本结构开始看起来像这样:

连接器通过数据库的工作有一个缺点-这会降低其独立性并增加系统的连接性。 但是,如果直接使用队列管理器传输数据,则负责其安全性和可用性的所有责任均由该代理承担。 如何满足可靠性和透明度的要求是一个悬而未决的问题。 对于我们自己,我们决定在系统的进一步开发过程中进行试验。
添加管理员
要管理整个厨房,您需要管理员界面。 在它的帮助下,我们可以找到对应的必要信息,编辑数据,进行调查和新闻通讯。 因此,Web组件出现在我们的图表中。 除上述内容外,它还提供了用于验证用户和机器人API的Web界面。

Web通过特殊的系统消息与数据库和内核进行通信。 它们以文本的形式发送,它们只包含有关来自用户的新消息的信息,而不包含有关内核应响应的整个系统中其他事件的信息。 例如,获取授权码。
管理员界面本身如下所示:

我们通过第二个机器人连接运营商
为了实现全面的用户支持,我们将运营商连接到了系统。 为了保持与他们的通讯速度,在没有合适的选择的情况下,Telegram被选为主要的对话界面。 操作员通过它接收用户问题并立即发送答案。
发送支持问题时,与主机器人的用户对话框如下所示:
屏幕快照中的“测试问题”是技术支持问题的文本结果,第二个机器人(支持机器人)以其核心和Telegram连接器出现在我们的电路上。 他与主要核心进行沟通,并组织与用户的聊天和支持代理所在的聊天之间的问题和答案的转移。

它还具有自己的数据库。 但是,与最终用户的通信是通过主要漫游器的核心进行的,它控制了消息的总体流向。
这是带有重定向用户消息的支持机器人的操作员对话的样子:

在我们的案例中,运营商分为两类:从事一般用户支持的运营商和负责支持个别沸点或事件的运营商。 但是,这对结构没有影响。
我们的机器人还能做什么?
这些信息仅涉及我们的实践,但是作为一些您可以注意的简单想法,它可能会很有趣。
联系人交流它是通过扫描和识别来自机器人的个人QR码来执行的。 为此,将默认图像处理器添加到内核。 图像由连接器发送,并与消息一起保存到数据库。

QR码识别还用于向用户提供研讨会的其他信息或文件。 看起来像这样:
通知邮件
通过Web模块中的控制面板,我们可以向各种事件的参与者发送通知。
进行调查同样,在讲座期间进行调查。 但是对于他们来说,我们仍然手动生成带有逻辑的JSON文件,然后将其上传到网络。


问题既可以是答案,也可以是开放的。 调查的结构可能会因答案而异。

自动回覆机器人可以独立选择常见问题的答案。

为此,我们有一个特殊的基础,需要手动补充。 如果在该处找不到合适的答案,或者用户对所选答案不满意,则将他通过支持bot的呼吁重定向到操作员。
总的来说,这是我们的全部麻烦。 目前,我们正在努力扩展网络功能,并希望在不久的将来,我们的机器人将获得更多的“成功”,而其结构将保持不变。