
聊天机器人紧密地进入了我们的信息生活,所有自重的社交网络和即时通讯程序都支持机器人,它们为开发和使用提供了方便的API,所有这些都为用户和程序员带来了便利。 现在,要用Telegram创建一个机器人,甚至不需要了解任何编程语言。 有一些服务可让您使用Web界面设计机器人。 这确实很好,但是最近我遇到了一个问题,并且感到惊讶的是,在聊天机器人的这一波热潮中,聊天机器人现在不仅是一个很酷的功能,而且还是一个创收工具-几乎没有答案。
问题是:如果我想为一项服务创建多个机器人,该怎么办? 例如,我知道CA坐落在Vkontakte和Telegram中,我该如何用最少的精力编写与那里和那里的人一起工作的机器人? 如果突然之间(例如,作为一家在线商店的所有者),我也想使用机器人与Facebook上的受众合作,我真的需要从头开发一个新的机器人并重写其所有逻辑还是尝试钻研新的API或库。 我试着在桌子底下找到答案。
实际上,有很多解决方案,但是有很多,但是它们全都归结为您必须通过提供平台的服务来托管您的机器人。 也就是说,您无法获得盒装解决方案。 也许我错了,并且没有完全研究实际存在的内容,但是Google中的第一个链接并没有提供解决方案这一事实已经令人震惊。 还有
博特曼 。 这是一个功能非常强大的成熟的开放源代码库,其中包含许多芯片和全面的文档。 它是用
PHP编写的。 我不反对
PHP ,无论如何我都不公开承认它,以免繁殖不必要的holivar,但我不想开发它。 我决定寻找与Python类似的东西,除了Python,还有许多库可让您使用Telegram Bot API。 而且我什么也没找到,所以我很快得出结论,值得写我自己。
(也许有人知道开放系统的多平台机器人的合适解决方案,我将很高兴收到任何信息)顺便说一句,这里是另一个问题。 我完全不知道除Habré以外,您还能在其他地方以文章的形式与观众分享作品。 我将很乐意为您提供帮助。
Botovod这个名字
本身就来了。
通常,我将使用Botovod给出一小段代码,并对其进行简要说明。
扰流板方向from botovod import Botovod, Message, utils @utils.convert_to_text def handler_message(agent, chat, text): message = Message() message.text = " " agent.send_message(chat, message) @utils.convert_to_images def handler_images(agent, chat, images): message = Message() message.text = " " agent.send_message(chat, message) def handler_echo(agent, chat, message): agent.send_message(chat, message) settings = [ { "name": "telegram", "agent": "botovod.agents.telegram", "settings": {"token": "462755273:AzBZBQ7AAnqFEXqZ_P8Z-qvCddmjqTVAYPI", "method": "polling"} }, ] botovod = Botovod(settings) botovod.add_handler(handler_message) botovod.add_handler(handler_images) botovod.add_handler(handler_echo) botovod.start()
在这里,我们为传入的消息定义3个处理程序,每个处理程序都发送一些响应。 第一个:“我收到了一条消息”,第二个:“我看到了照片”,第三个将简单地发回我收到的内容。 然后,我们创建一个漫游器管理器(Botovod),并将其设置传递给漫游器,在本例中,这是Telegram中的漫游器。 接下来,我们依次添加消息处理程序。 如果一条消息到达机器人,它将发送给同意接受该消息的第一个处理程序。 例如,如果向我们发送了音频,则第一个处理程序将尝试首先接受它,但会拒绝,因为这不是文本。 然后,他将接受第二个,但也拒绝,因为这不是一张图片,然后他将接受没有限制的第三个-这样,它将正交转发音频。 约束是来自utils模块的装饰器。
现在,我将尝试详细说明什么是什么:
有一个机器人管理器-Botovod类的一个对象-机器人的名称(每个机器人都有自己的唯一名称),将对其进行处理的代理类以及该机器人的设置在构造函数中传递给它。 同样,处理程序又被添加到机器人管理器中。 如果有消息到达漫游器,则管理器将依次检查它们,直到找到引发NotPassed异常的处理程序为止。 首先检查添加的第一个处理程序,最后检查最后一个处理程序。 如果您打算使用Webhook,则可以将bot管理器连接到Web服务器。 为此,机器人管理器具有一个侦听方法,该方法接受机器人名称,标头和请求正文。 然后,它将此数据传递到代理解析器,该解析器在通过处理程序推送此消息后返回生成的消息。 作为响应,listen方法返回字典{“ status”:any_code,“ headers”:dict(),“ body”:“ any_text”},其中标头中为响应标头,正文中为响应正文。 有时Messenger /社交网络需要服务器返回对象,所以我认为这种行为很方便。
我将举一个名为“ vk-bot”的Vkontakte机器人示例,并且Botovod将连接到Django服务器
def view(request): response = manager.listen("vk-bot", request.headers, request.text) return HttpResponse(status = response["status"], headers = response["headers"], response["body"])
形成的消息是Message类的对象。 它包括以下字段:文本-消息文本; 图片-图片列表; 音频-带有声音文件的列表; 视频-视频列表; 文件-文件清单; 位置-在地图上包含位置的列表; raw-原始消息正文或对其的附加信息(词典)。
此外,Message对象的每个列表(图像,音频,视频,文档)都包含特殊对象,这些对象的类从Attachment继承。 默认情况下,附件类具有url和file_path方法,代理解析器通常在其中放置有关接收到的文件的信息。 位置列表包含位置对象,您需要向其构造函数传递经度和纬度(经度和纬度)。
下面是在处理程序中构造消息的示例
def handler(agent, chat, message): out = botovod.Message() image = botovod.Image() image.file_path = "/tmp/1.png" location = botovod.Location() out.images.append(image) out.text = " , " agent.send_message(chat, out)
这就是目前的全部内容,但是我希望有人会对这种解决方案感兴趣,有人希望对建议,评论,想法以及他们自己的参与开发提供帮助。 谢谢大家的阅读!
Github链接