VK机器人跪在地上,或如何在2月14日取悦人们

当然,我们每个人都喜欢礼物,但最重要的是,我们喜欢伴随礼物的愿望。 而且,直到最近,我们才有机会用温暖的言语使一个人惊喜,直到这个想法浮现在脑海:如果我们让人们有机会交换情人(2月14日在他们的鼻子上,都一样)而又没有离开通常方式的框架会怎样?通讯-社交网络聊天室?

一个字一个字,这就是-现成的商业计划,旨在营造情人节假期的氛围! 我们会让人们快乐吗?


对于月亮的想法!


当然,首先有必要制定一项行动计划并描述该想法。 由于人们变得越来越害羞,并且并不总是准备好信任任何人,因此选择权是为VK编写一款时尚便捷的bot,该机器人具有熟悉的界面,将始终在手,并且消息的匿名性将在程序代码中进行硬编码。
不幸的是,除了上述所有优点之外,社区还有两个缺点:带宽低(每秒消息数)和禁止与随机用户进行对话(用户必须首先 明确同意代表社区接收消息)。

因此,我们有一个用户准备以聊天机器人的形式向其知己,收件人和中介发送情人节卡片。 交互方案很简单,机器人应该:提供发送→识别收件人→保存到2月14日→发送→重复。

但是,这当然不足以使大脑产生虚幻的想象力,并且为了增加听众的活动和参与度,还考虑了另一种交互方式的方案,使人们可以结识系统内部,并向随机的人发送消息。 这些“随意的情人”可以被欣赏,如果两个人的情人彼此喜欢,我们将为他们提供聊天的机会。

免责声明


这个项目纯粹是由两个人的热情创建的,一个受过一半教育的程序员(我)和一个思想启发者(Stepan sadfun Popov),并没有教给您一些东西的目标(尽管它可以帮助您了解宇宙的本质),只是讲述一个有趣的创造故事并遵循从构想到幼稚实现的道路。



学习与VK交流


在应“ NodeJS VK API”的要求浏览了3-4个不同的库之后,我意识到没有简单的功能库允许我们使用promise以及通过execute进行工作。 还记得上面描述的问题之一吗? 是的,对VKontakte的请求不是直接执行,而是分25个批次进行,可以显着提高吞吐量。


对VKontakte的各种请求方法的比较能力

因此,决定基于node-fetch库编写自己的东西,这是一种可靠的但不太严格的解决方案。

为了不在此处给出所有代码,我将简单描述工作逻辑。

由于来自程序的请求必须打包成一个执行文件,因此将它们收集到LIFO队列中,然后在以下情况下发送:

  • 调用25个或更多(最大执行)
  • 自上次调度以来已过去了足够的时间,不少于50毫秒,但不超过150毫秒(尽管队列很小,所以队列可以移动)

来自队列的请求被编译成VK脚本代码,(在此实现中)如下所示:

var returnables = []; returnables[0] = API.messages.send({"message": ", !", "peer_id": 1, "random_id": 561427}); returnables[1] = API.users.get({"user_ids": 1, "fields": "sex"}); return returnables; 

通过对VK的请求执行代码后,每个请求的结果(通过索引returnables )返回到其回调,精美地包装在Promise中。 这种方法的效率是压倒性的-用户越多 (因此向VKontakte发送的请求越多),响应延迟就越小 。 为了控制该限制,发送系统有一个计数器,用于显示此秒内剩余请求的数量,这使您可以快速处理大量访客。

学习听VK


有两种方法可以从VKontakte接收有关事件的通知: Longpoll-requestsCallback-server 。 您的服务器很方便,因为它不需要使用特殊手势,并且还允许您接收错过的通知(例如,重新启动服务器时)。 可以使用本地http.Server类以多行形式编写这样的服务器。

所有这些都为程序逻辑创建了一个理想的生态系统,使用起来很方便。

一切都结束了


由于用户可以在聊天中自由进行任何操作,并且我们无法阻止他,因此我们需要将其限制在合理的范围内。 状态机在执行此操作方面做得很出色,可以设置系统内所有可能的转换,并使用按钮(messages.send中的键盘参数)将使机器人的使用像在屏幕上的一次触摸一样简单。

这是与机器人的用户交互:


所有这些都变成了一组状态(“主菜单”,“情人节输入”等),它们之间的转换是通过按钮设置和传输的,或者最初是已知的,并且不会改变。


顺便说一下,关于按钮。 它们的色域是不变的(在所有情况下均为4种颜色 ),但是通过按钮可以最大程度地减少用户错误的数量。 在它们的基础上,您可以构建任何非线性系统,这就是为什么它们在任何地方都可以使用的原因。 在这个项目中也是如此。

但您需要了解:如果您是针对大量受众的,则应考虑另一种交互方式,因为某人可能具有旧的应用程序(例如, 适用于iPad的VK尚未更新很长时间,我不会撒谎,但似乎已经超过一年了,和键盘支持不存在)。 碰巧的是(确实,我检查过),人们没有意识到可以单击按钮,只是重写了他们的内容(然后,有效载荷按钮参数当然没有被传输,一切都可能中断)。

应该注意的是,并不是所有的事情都像图中描述的那样顺利进行,有时会发生奇怪的情况。 例如,用于确定VKontakte链接的系统错误地处理了短链接以id开头并被切断的用户。 遇到这个错误的人的惊喜无法描述,因为他们写了Valentine Valentine,但事实证明是Olezhka。
什么olezhka ????

事故并非偶然


因此,如果普通情人的一切都清楚了,有一个接收者和一个发送者,那么如何减少两个陌生人? 您需要交换他们的情人,如果人们喜欢彼此的情人,那么就应该介绍他们! 这就是爱的配方!

尽管这听起来很可悲,但它的确有效,而且人们与该机器人一起工作变得更加有趣-如果至少有一个人(机器人会照料的话),他们会得到积极的回应。

随之而来的好处是-越多的人抓住这个机会,彼此认识的机会就越多,因此,就像游戏一样,这使一个人保持聊天。 值得承认的是,平均每个用户的会话时间约为7分钟,但是仅出于此功能,就有可能将一个人拉紧10-15

消息的分发非常分散,因此有一个单独的方案,因为使用此漫游器有多种选择,用户可能会看不见东西,因此漫游器会仔细提醒他这一点。


有趣的是,第二个问题是如何解决的,而社区却无法首先与用户进行对话:现在,这样的消息已解决了这个问题。
但是我有病! 为了使接收者收到您的情人,他还必须给我写信。 您现在的任务是说服他给我写东西。 这样做是为了让您不必担心与他交谈!
通常,传统的“不是错误,而是功能!”

烟花尽头


仅此而已! 如果您在理解VK API的逻辑时没有考虑到一些困难,并且在与提供者之一确认帐户时没有考虑到任何困难,那么一切都会变得非常顺利。


与机器人聊天的示例

该机器人可以正常工作,并且会用情人使人高兴,使他们开心。 这样做是为了帮助人们彼此友善。 如果愿意,您可以在Valentinych社区-vk.com/verylovebot中自己评估所有这一切。 感谢您的关注!

Source: https://habr.com/ru/post/zh-CN439218/


All Articles