使用我玩“秘密圣诞老人”的机器人示例,您如何以及不需要为机器人编写聊天记录

图片

背景知识


一年前,我决定创建一个电报机器人来玩非常流行的新年游戏“ Secret Santa”。 几年前,我们在一家公司工作时决定玩这个游戏(这看起来很酷),这使我深受鼓舞。此外,我一直在哈布雷(Habré)的ADM俱乐部关注。 去年10月至11月,我意识到今年我需要在自己的公司之间再次竞争,但是这次没有从圣诞老人的帽子上拉出写在一张纸上的名字,而是从技术上讲,或者更多。 由于每个人都在电报中,在那写一个机器人对我来说很有趣,所以我决定在这个平台上做

顺便说一句,一年前,我已经在Habré上了一篇有关该项目的文章,但是我没有提及实现。 我之所以发言并非出于充分的理由,因为这太丢人了:)该项目只为公司工作(最大速度为15-20人)而准备,但是事实证明,该项目在资源上发表了几篇文章后,在其他领域“出手”。 此外,越来越多的流行资源本身开始给我做广告(在大量人潮涌入之前,我什至不知道它)。

有一个月的时间,我没有在广告上进行任何投入,就吸引了5000多名满意的玩家,并真的爱上了这个项目。 但是除了他的所有好处之外,他还有一个很大的缺点,那就是实施。

一年前怎么样


我在漫游器中有一个按钮“加入房间”真是有趣。 是的,这正是加入的对象。 他们写信给我修复了此语法错误,但我没有冒险,这就是原因:)接下来,我从去年的bot版本中放了一段代码。

elseif ($user['state'] == 7) { if (mb_stripos($textMessage, '') !== false) { if (!empty($user['santa_for_user_id'])) { $text = '   ,      '; } else { $text = "!       -     ,      "; $db->updateState($userId, 8); } } 

整个机器人-实际上,这是一个巨大的index.php文件,它完全依靠mb_stripos函数。 而且,有很多相同的“重要特征”。 即 mb_stripos($ textMessage,'join')!== false可能会发生多次。 如果将按钮中的“ join”一词更改为“ join”,而忘记更改某种ifchik(这又是很多事情),一切都会散落。 在这种情况下,它可能不会立即引起注意(只是在某些情况下,机器人不会按应有的方式做出响应)。 更改文字后,用户开始写信说,在某些情况下,机器人不会做出应有的响应。 我不想再承担任何风险,并且我认为错误不是那么严重:)原则上,您知道。 如果有一个按钮,例如“ Find random Santa”,我会通过mb_stripos迷上“随机”一词。 当出现一个类似的按钮,带有类似的文本,并且在不需要时,如果(例如,那里同时存在“ random”(随机)),那么一切都变得不必要了,这很有趣:)

顺便说一句,您是否注意到$用户['state']? 当时,我介绍了“状态”以了解用户当前所处的状态。 例如,他是否想加入房间或创建游戏,还是想玩一个游戏? 对于每个州来说,都有自己的一套ifchi,这对于打破这一点也很重要。

顺便说一下,Cron文件位于index.php旁边,可以直接在浏览器下运行(显然,它并没有真正打扰我)。 此外,当我突然想要添加某种“州”(我希望自己不想这么做)时,我不得不跳入这座城市……当然,第一次尝试没有任何结果。 所有这一切都还放在最便宜的主机上,每月1美元,当很多人在高峰时间开始写作时,这可能会让我下地狱。

对于程序员来说肯定是个地狱:)

我今年决定要做的


当然,今年,我决定改写该机器人程序(由于去年需求量很大),我想进入旧代码并弄清楚那一年的情况,以便转移业务逻辑。 不幸的是,即使后来我试图在代码中留下自己的注释以帮助自己:),我什至无法找出旧代码的70%。

我决定只回顾主要场景,然后在此过程中添加一些新内容。 他首先提出了一个问题:“用于编写体系结构以便以后不再哭泣的东西?” 经过大量研究,选择权落在了Botman身上 。 我们有关于哈布雷的小文章。 简而言之,博特曼是一件很酷的事情。 它既可以安装在“干净的”主机上,也可以立即使用Laravel安装其组件(是的,在Laravel的顶部立即安装了一个僵尸程序)。 我决定继续使用该版本,因为Laravel明显比一年前更好:)它具有从“盒子”缓存的功能,便捷的路由,技术人员,中间件,便利性,使用数据库的能力以及其他优点。 如果突然之间您不喜欢Laravel,则可以使用任何其他框架,然后在其之上安装Botman,或者根本不能使用该框架 。 顺便说一下,Botman是建立在ReactPHP之上的,这很酷:)

接下来,我将描述Botman的好处:

这里有一个botman.php文件,您可以在其中描述所有命令。 一个例子:

 $botman->hears('/start', function (BotMan $bot) { $bot->startConversation(new StartConversation()); })->stopsConversation(); 

编写/ start命令时,StartConversation将启动(应从抽象的Conversation类继承)并实现run()方法。

问问题很方便,例如:

 $question = Question::create("   ,    ?")->addButtons([Button::create('')->value('create'), Button::create('')->value('join')]); $this->ask($question, function (Answer $answer) { if ($answer->isInteractiveMessageReply()) { if ($answer->getValue() == 'join') { 

请注意,在Button可以设置一个值,以后再使用它吗? 也就是说,由于我坚持使用value():),因此在您眼前,带有“ join”的错误已修复。
顺便说一句,您仍然可以使用isInteractiveMessageReply方法,该方法将在回答用户提出的问题时回答您是写文本还是单击交互式按钮的问题。

博特曼(Botman)帮助摆脱了状态,我可以在Ask方法中创建另一个Ask方法,例如,如果某人单击了“ join”(加入),则在其中是否进行另一个Ask。

这是Botman提供的其他一些方法(数量众多),可以从名称中轻松理解:
$ this->重复($问题);

$ this-> bot-> typesAndWaits($ secondsToWait);

$ this-> bot-> reply($ reply);
僵尸程序功能的杀手is是一个代码可以在许多平台上运行。 也就是说,您可以编写代码,而最初只为Telegram运行它。 然后,确定您仍然想要使用Facebook Manager,并且根本不需要开始使用Facebook SDK,Botman开发人员已经为您完成了此操作。 您只需要安装驱动程序并在.env中设置您的Facebook Messenger机器人的令牌API。 所有功能将自动在Facebook Messenger中运行。
Botman不仅支持Facebook Messenger和Telegram,该列表还包括Slack,Skype,微信(完整列表可在其网站上找到)。

另外,“场合的英雄”以他已经拥有爸爸测试/ Botman(您可以编写单元测试,上限)和良好的文档而闻名。 很难一一列举所有的好处,因为我显然没有和所有人一起工作,我不记得所有的事情,但是我认为我所描述的内容应该至少足以引起人们的兴趣:)

好吧,好的,但是我们将再次以$ 1的价格托管吗?


不,今年一切都非常严重。 每月收费10美元,并提供带有参考的免费域名。 开个玩笑:)

我决定增加对Docker的了解,在DigitalOcean上购买了VPS,并在Docker中启动了该项目。 尽管我几乎是第一次这样做,但结果还是不错的。 令人惊讶的是,码头工人从未倒下

使用VPS,当然更酷:)

当使用docker时,进行开发要方便得多(保留了少女和产品的版本)。

有趣的是,当我在漫游器中引入付费功能时,我需要从支付系统中进行升级。 付款系统不断向我退回我的升级申请,并说“该站点已关闭”。 为我工作,为朋友工作(我们来自乌克兰),但没有为俄罗斯联邦的男人工作。 我毫不犹豫地看到,一年前,Roskomnadzor仍然禁止了我的Droplet的IP地址(当时,许多DigitalOcean服务器都被ILV损坏了)。 然后他们也决定了这一点。

您的机器人写的是什么?


  • PHP 7.3
  • 拉拉韦尔
  • 博特曼

而且我建议大家在用PHP编写自己的bot时都使用这个特定的堆栈(以免以后像我一样朝自己开枪)。

该机器人有什么新功能?


圣诞老人学会了打电话


您可以从圣诞老人订购电话! 他甚至会理解并听你的话:)

圣诞老人打来电话(从美国号码中拨出),问一些问题,例如,“您今年的表现如何?”,“新年您想要什么?”,“您知道这首诗吗?”等。 如果用户说自己不知道韵,那么圣诞老人将遵循不同的问题,如果他说自己知道,那么圣诞老人会请您告诉韵:)更多:当某人向圣诞老人说出他的新年愿望清单时,圣诞老人会聆听,然后发送这是订购电话的用户的愿望清单(突然,孩子在房间里被父母关闭了,但是不知何故他们需要找出他问圣诞老人的内容)。 圣诞老人还会发送电话录音,并以圣诞老人为伴:)

现在,您可以找出谁是您的圣诞老人。


兹拉达? 这与游戏“ Secret Santa”的名称相反,不是吗? 原则上可以。 但是,去年,从想知道自己的圣诞老人的人中,我的毒品被撕毁了。 “老板会给我礼物吗?”,“有人没有给我们礼物给某人,你能告诉谁应该给她吗?”等等。 现在有这样一个机会,但是无论它是什么-这样的乐趣都会以$ 5.99的价格出现:)

结论


您不希望您的项目总是很小。 即使项目仅以三个ifs开头(我对这些项目都足够了解),也无需使用一堆ifs创建一个index.php。 最好立即进行。 即使您花费更多的时间,它也将为您带来好处,当您紧急需要更改/向项目中添加逻辑时,您不必考虑如何更改ifas以便机器人不会崩溃,因为事实证明对我来说:)。 同样,这种方法(使用ifas)可以教您做出所有其他决定(不是最好的技能,请同意)。 好吧,当然,想想你自己,你将不得不稍后再看这段代码,并且必须处理它,然后它就不会很甜蜜了:(

所有好的代码,编写您的聊天机器人,并编写您的项目。 太棒了!

最后,我想回想一下我读过的内容:
如果您知道自己使用的最喜欢的项目(Facebook,VK等)是为了在跌倒的边缘而构建的,那么您会感到惊讶。 是的,确实,那一年每个人都玩得很开心,甚至没有想到这个机器人内部发生了什么(我自己为他在12月那年幸存下来感到震惊)。

如果你想玩- 惠康 :)

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


All Articles