聊天机器人开发(laravel + botman)

欢迎光临! 作为初级全栈开发人员,我在尝试使用laravel和botman编写机器人时遇到许多问题。 首先,我的英语不太了解,但是俄文中关于该主题的文章很少,而那些文章并没有帮助我解决我的问题。 本文将讲述并展示如何在laravel + botman上开发用于电报的聊天机器人。 我本人为语音和电报开发了机器人(商业)。 作为电报开发人员,我最喜欢。


图片


我不会显示如何安装laravel并配置服务器以使其正常工作。 如果您以前从未做过,安装openserver会更容易,它内置了composer(php的软件包管理器)并且已经配置了laravel的本地服务器。 您只需要在.htaccess中编写一些代码。 那正是我在家工作的。 在本文中,我将展示一种开发聊天机器人,将其配置为以电报方式工作的方法,并且最后,我将留下指向有关laravel'e和botman'e的有用文章的链接。


设计/准备


我建议像所有普通开发人员一样,开发一种自动程序,进行设计,设置任务和解释laravel的工作方式。 在此之前,我会说我正在用phpStrom编写代码。 您可以在任何其他IDE中编写,但是我使用它。


Laravel实现了MVC(模型视图控制器)模式。 这并不意味着您只需要在mvc下编写代码,就可以编写shit,但是最好使用框架提供的优点。 如果您熟悉mvc,但没有像我一样使用过,那么使用laravel开发是巩固知识的最佳方法。


我们的机器人应该做什么:


  • 向用户询问用户名
  • 询问用户是否喜欢天气。
  • 还要在数据库中写答案
  • 说再见并发送图片

关于MVC的一些知识。 在通过命令(URL url)访问我们的软件时,我们必须接受这些命令并进行处理,了解用户的需求。 为此有一些路线,即所谓的路线。 路由确定应使用哪个控制器,如果需要,控制器又通过模型访问数据库。 模型联系数据库并返回我们需要的结果。 在漫游器中,不需要视图,因为 所有工作都通过Messenger界面进行。 因此,从模型接收数据后,控制器会提供此视图数据,在我们的情况下,该数据是刀片模板(laravel使用)。 数据可以发送到常规php页面,但是最好通过刀片模板来完成。 我们使用Messenger界面,然后我们将立即向其发送数据。


发展历程


要创建项目,只需在控制台中输入以下命令


composer create-project --prefer-dist botman/studio botelegram


入口点将是溃败“ /开始”。 botman中有几种路由实现。 因为 我们将通过电报中的漫游器访问路由,然后我们需要“ botman.php”。


图片


在其中我们需要写下一行


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

电报本身可以通过“开始”命令开始与该机器人一起工作,如果是这样,我们可以通过将初始入口点设置为“ / start”并立即开始使用它来促进与该机器人的交互。


使用$ bot-> startConversation(new mainConversation); 我们指出哪个控制器将负责这项工作。 另外,我们将注册控制器的使用,为此,我们需要在路径文件中添加以下代码:


 use App\Conversations\mainConversation; 

让我们继续。 我们需要创建一个数据库和控制器本身。 我的意思是您正在使用openserver。 可以通过控制台或使用内置在openserver中的phpMyAdmin创建数据库。


现在进行一些配置。 我们需要将数据库数据输入到laravel配置文件中。 它位于项目的根目录中,称为.env


图片


查找与数据库关联的行


 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=botelegram DB_USERNAME=root DB_PASSWORD= 

在这里,我们只对数据库的名称,用户名和密码感兴趣。 如果使用openserver,则可以输入root-name并将密码保留为空,数据库名称取决于您。


现在我们的应用程序可以访问数据库了。 我们需要做的下一件事是创建模型并进行迁移。 我们在控制台中编写:


php artisan make:model messengerUser -m


-m标志将为数据库创建迁移并将其与我们的模型关联。 让我们立即进行迁移,以免再次返回。


最好不要这样做,但是为了不创建一堆文件,我们将所有数据写入一个表中。
我们需要:


  • 聊天ID
  • 用户名
  • 天气好还是不好

这足以证明botman的基本功能。 打开新创建的迁移,该迁移位于数据库/ migrations / creation_create_messanger_users_table.php中


图片


完成此迁移中的up方法,它应如下所示:


 public function up() { Schema::create('messenger_users', function (Blueprint $table) { $table->increments('id'); $table->string("id_chat"); $table->string("name"); $table->string('response'); $table->timestamps(); }); } 

现在我们需要开始迁移,以便我们的表存在于数据库中。 在控制台中,您需要注册:


php artisan migrate


提示:如果在开发过程中需要更改表中的字段,但是表中有数据,并且如果不需要它们,则可以使用php artisan migrate:refresh命令更新表。


结果:


图片


laravel执行了3次迁移,但我们仅对第3次迁移感兴趣,因为 这是我们将记录数据的地方。


是时候创建一个控制器,将我们的模型连接到它并编写逻辑了。


通常,最好通过控制台创建所有文件,但是由于我们使用的是botman,而且我已经习惯了,所以我们将手动创建一个控制器。 在botman中,控制器称为对话,也许它们之间存在显着差异,但是我不明白这一点-不需要。 在app / Conversations文件夹中,创建一个名为mainConversation.php的文件。


在屏幕上,您可以看到对话的最小配置


 namespace App\Conversations; use BotMan\BotMan\Messages\Conversations\Conversation; class mainConversation extends conversation { public function run () { } } 

您的类必须具有公共运行方法,它是控制器的入口点。


将我们的模型连接到控制器:


use app\messengerUser;
让我们编写初始逻辑。 run方法将运行一个私有方法,该方法询问用户名是什么,并将其ID和名称写入id_chat和表名称。


首先,编写:


 use App\messengerUser as database; use BotMan\BotMan\Messages\Attachments\Image; use BotMan\BotMan\Messages\Conversations\Conversation; use BotMan\BotMan\Messages\Incoming\Answer as BotManAnswer; use BotMan\BotMan\Messages\Outgoing\Actions\Button; use BotMan\BotMan\Messages\Outgoing\OutgoingMessage; use BotMan\BotMan\Messages\Outgoing\Question as BotManQuestion; 

这将使我们能够使用机器人手的方法


现在,我们将对控制器进行更改:


 class mainConversation extends conversation { public $response = []; public function run () { $this->setName(); } private function setName() { $question = BotManQuestion::create("!   ?"); $this->ask( $question, function ( BotManAnswer $answer ) { if( $answer->getText () != '' ){ array_push ($this->response, $answer->getText()); $this->askWeather (); } }); } } 

run()启动我们需要的方法,它是setName()。 在setName()中,我们已经要求输入用户名,将名称写入数组,然后运行下一个方法,该方法将询问用户有关天气的信息。


 private function askWeather () { $question = BotManQuestion::create("    ?"); $question->addButtons( [ Button::create('')->value(1), Button::create('')->value(2) ]); $this->ask($question, function (BotManAnswer $answer) { //      ,       array_push ($this->response, $answer); $this->exit(); }); } 

askWeather()具有类似的结构,但是在这里我们使用按钮来限制用户的选择并使我们的生活更轻松。 按钮消除了用户可以创建的许多错误。 在这里,我们还创建了一个问题,借助addButtons()将按钮附加到问题上,然后调用此问题并处理答案,还转到最后一个方法。


exit()方法会将所有数据写入数据库(可以在单独的方法中取出),与用户说再见,还向他发送图片。


 private function exit() { $db = new database(); $db->id_chat = $this->bot->getUser()->getId(); $db->name = $this->response[0]; $db->response = $this->response[1]; $db->save(); $attachment = new Image('https://gykov.ru/projects/botelegram.png'); $message = OutgoingMessage::create('  !') ->withAttachment($attachment); $this->bot->reply($message); return true; } 

使用OutgoingMessage ::创建(“再见!”)-> withAttachment($附件),我们创建一条新消息并为其添加图片。 通常,用户应该看到的所有公用文件都放在公用文件夹中,但是在我的上一个bot中,这存在问题,因此我不得不将它们放在服务器上的单独文件夹中(与项目无关)。 我在这里做了同样的事情。


我们的机器人的逻辑已准备就绪。 要测试它,只需通过openserver打开站点,但是在此之前,您需要创建一个具有以下内容的.htiaccess文件


 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule> 

该文件应位于站点的根目录中。 现在,所有请求将被传输到公用文件夹。 laravel是这样工作的。 我们打开站点并测试该机器人,不要忘记首先需要输入“ / start”。


确保一切正常后,您可以将其附加到电报中。 为此,请在@botfather创建一个新的bot,并将bot密钥复制到.env文件的末尾。 看起来像这样:


TELEGRAM_KEY=key_bot


现在,我们需要在项目中放入一个驱动程序,以进行逻辑和电报机器人的联合工作。 只需在控制台中执行一个命令即可完成:


composer require botman/driver-telegram


您还需要在laravel中注册该机器人。


php artisan botman:telegram:register


我们将被要求输入我们的机器人可用的地址。


图片


如果您正在服务器上开发一个机器人,则只需在该机器人之后添加https:// url_site / botman即可在Messenger中对其进行测试。 但是请注意,laravel需要特殊的服务器设置,您很可能必须自行配置它。 我将在文章末尾留下有关如何配置服务器的链接。


也许就这些。 如果您读到最后,那么恭喜您,现在您可以使用botman为laravel开发聊天机器人。 如果您有任何疑问,我将很乐意在评论中以及答应的链接中回答:


github上的来源
Botman文档
服务器设置
我创建了第一个机器人的文章
上一篇关于botman的文章

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


All Articles