Desenvolvimento de chatbot (laravel + botman)

Bem vindo! Eu, como desenvolvedor júnior de pilha cheia, encontrei muitos problemas ao tentar escrever um bot usando laravel e botman. Em primeiro lugar, não sei muito inglês, mas há muito poucos artigos sobre esse assunto em russo e aqueles que não me ajudaram a resolver meus problemas. O artigo irá mostrar e mostrar como desenvolver um chatbot no laravel + botman para telegrama. Eu mesmo desenvolvi bots (comerciais) para Viber e telegrama. Como desenvolvedor de telegrama, eu gosto mais.


imagem


Não mostrarei como instalar o laravel e configurar o servidor para que ele funcione. Se você nunca fez isso antes, será mais fácil instalar o openserver, o compositer (gerenciador de pacotes para php) está embutido nele e o servidor local para laravel já está configurado. Você apenas precisa escrever algum código em .htaccess. É exatamente isso que trabalho em casa. No artigo, mostrarei uma das maneiras de desenvolver um bot de bate-papo, configurá-lo para trabalhar em telegramas e, no final, deixarei links para artigos úteis sobre laravel'e e botman'e.


Design / Preparação


Proponho o desenvolvimento de um bot, como todos os desenvolvedores normais, com o design, a definição de uma tarefa e a explicação de como o laravel funciona. Antes disso, direi que estou escrevendo código no phpStrom. Você pode escrever em qualquer outro IDE, mas eu o uso.


O Laravel implementa o padrão MVC (Model View Controller). Isso não significa que você só precisa escrever no mvc, pode escrever uma merda, mas é melhor usar as vantagens que a estrutura oferece. Se você conhece o mvc, mas não o usou como eu, o desenvolvimento com o laravel é a melhor maneira de consolidar o conhecimento.


O que nosso bot deve fazer:


  • Pedir nome de usuário
  • Pergunte se o usuário gosta ou não do clima.
  • Escreva também a resposta no banco de dados
  • Diga adeus e envie uma foto

Um pouco sobre o MVC. Ao acessar nosso software, por meio de comandos (URL URL), devemos aceitar esses comandos e processar, entender o que o usuário precisa. Existem rotas para isso, chamadas rotas. Rotas determina qual Controlador deve ser usado; por sua vez, o controlador, se necessário, acessa o banco de dados através do modelo. O modelo entra em contato com o banco de dados e retorna o resultado que precisamos. No bot, a visualização não é necessária, porque todo o trabalho passa pela interface do messenger. Assim, após receber dados do modelo, o controlador fornece esses dados de visualização, no nosso caso, é um modelo blade (usado pelo laravel). Os dados podem ser enviados para uma página php comum, mas é melhor fazer isso através de modelos de blade. Usamos a interface do messenger e, em seguida, enviaremos os dados imediatamente para ela.


Desenvolvimento


Para criar um projeto, basta digitar o seguinte comando no console


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


O ponto de entrada será roteado "/ start". Existem várias implementações de rota no botman. Porque vamos acessar rotas através de um bot em um telegrama, então precisamos de "botman.php".


imagem


Nele, precisamos escrever a próxima linha


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

O próprio telegrama se oferece para começar a trabalhar com o bot através do comando "start" e, se assim for, podemos facilitar a interação com o bot, definindo o ponto de entrada inicial como "/ start" e imediatamente trabalhar com ele.


Usando $ bot-> startConversation (novo mainConversation); indicamos qual controlador será responsável pelo trabalho. Além disso, registraremos o uso do nosso controlador, para isso precisamos adicionar este código no arquivo de caminho:


 use App\Conversations\mainConversation; 

Vamos continuar. Precisamos criar um banco de dados e o próprio controlador. Quero dizer que você está usando o openserver. O banco de dados pode ser criado através do console ou usando o phpMyAdmin, que é incorporado ao openserver.


Agora algumas configurações. Precisamos inserir os dados do banco de dados no arquivo de configuração do laravel. Ele está no diretório raiz do projeto e é chamado .env


imagem


Encontre as linhas associadas ao banco de dados


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

Aqui estamos interessados ​​apenas no nome do banco de dados, nome de usuário e senha. Se você usa o openserver, você pode escrever em root-name e deixar a senha vazia, o nome do banco de dados depende de você.


Agora nosso aplicativo tem acesso ao banco de dados. A próxima coisa que precisamos fazer é criar um modelo e migração. Escrevemos no console:


php artisan make:model messengerUser -m


O sinalizador -m criará uma migração para o banco de dados e o associará ao nosso modelo. Vamos configurar nossa migração imediatamente para não voltar mais a ela.


É melhor não fazer isso, mas para não criar um monte de arquivos, escrevemos todos os dados em uma tabela.
Precisamos de:


  • id de bate-papo
  • Nome de usuário
  • Bom tempo ou não

Isso é suficiente para demonstrar os recursos básicos do botman. Abra a migração recém-criada, localizada em database / migrations / creation_create_messanger_users_table.php


imagem


Conclua o método up nesta migração, ele deve ficar assim:


 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(); }); } 

Agora precisamos iniciar a migração para que nossa tabela exista no banco de dados. No console, você precisa se registrar:


php artisan migrate


Dica: se durante o processo de desenvolvimento você precisar alterar os campos da tabela, mas houver dados na tabela, e se você não precisar deles, poderá atualizar as tabelas usando o comando php artisan migrate:refresh .


Resultado:


imagem


O laravel realizou 3 migrações, mas estamos interessados ​​apenas na 3ª migração desde é aqui que gravaremos nossos dados.


É hora de criar um controlador, conectar nosso modelo a ele e escrever a lógica.


Em geral, é melhor criar todos os arquivos através do console, mas como usamos o botman e já estou acostumado a isso, criaremos um controlador manualmente. No botman, o controlador é chamado de conversa, talvez haja diferenças significativas entre eles, mas eu não entendi isso - não havia necessidade. Na pasta app / Conversations, crie um arquivo chamado mainConversation.php.


Na tela, você vê uma configuração mínima de conversa


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

Sua classe deve ter um método de execução pública, é o ponto de entrada para o controlador.


Conecte nosso modelo ao controlador:


use app\messengerUser;
Vamos escrever a lógica inicial. O método run executará um método privado que pergunta qual é o nome do usuário, grava seu ID e nome em id_chat e o nome da nossa tabela.


Para começar, escreva:


 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; 

o que nos permitirá usar os métodos do botman


E agora faremos alterações em nosso controlador:


 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 () inicia o método que precisamos, é setName (). Já em setName () pedimos o nome de usuário, escrevemos o nome na matriz e, em seguida, executamos o próximo método, que perguntará ao usuário sobre o clima.


 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(); }); } 

O askWeather () possui uma estrutura semelhante, mas aqui usamos botões para limitar as opções do usuário e facilitar a vida para nós. Os botões removem muitos erros que um usuário pode criar. Aqui também criamos uma pergunta, com a ajuda de addButtons (), anexamos botões à pergunta e, posteriormente, chamamos essa pergunta e processamos a resposta, e também vamos para o último método.


O método exit () grava todos os dados no banco de dados (pode ser retirado em um método separado), se despede do usuário e também envia uma foto para ele.


 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; } 

Usando OutgoingMessage :: create ('Te vejo de novo!') -> withAttachment ($ attachment), criamos uma nova mensagem e anexamos uma imagem a ela. Em geral, todos os arquivos públicos que o usuário deve ver são colocados na pasta pública, mas no meu último bot houve um problema com isso e eu tive que colocá-los em uma pasta separada no servidor (não relacionada ao projeto). Aqui eu fiz o mesmo.


A lógica do nosso bot está pronta. Para testá-lo, basta abrir o site através do openserver, mas antes disso, você precisa criar um arquivo .htiaccess com o seguinte conteúdo


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

O arquivo deve estar na raiz do site. Agora todos os pedidos serão transferidos para a pasta pública. É assim que o laravel funciona. Abrimos o site e testamos o bot, não esqueça que primeiro você precisa digitar "/ start".


Depois de garantir que tudo funcione, você pode anexá-lo aos telegramas. Para fazer isso, crie um novo bot em @botfather, copie a chave bot no final do arquivo .env. É assim:


TELEGRAM_KEY=key_bot


Agora, precisamos colocar em nosso projeto um driver para o trabalho conjunto de nosso bot de lógica e telegrama. Isso é feito com apenas um comando no console:


composer require botman/driver-telegram


Você também precisará registrar o bot no laravel.


php artisan botman:telegram:register


Seremos solicitados a inserir o endereço no qual nosso bot estará disponível.


imagem


Se você estiver desenvolvendo um bot no servidor, basta adicionar https: // url_site / botman após esse bot, você pode testá-lo no próprio messenger. Mas lembre-se, o laravel precisa de configurações especiais do servidor, e você provavelmente precisará configurá-lo por conta própria. Vou deixar um link sobre como configurar o servidor no final do artigo.


Talvez seja só isso. Se você ler até o final, então parabéns, agora você pode desenvolver bots de bate-papo para o laravel usando o botman. Se você tiver dúvidas, terei prazer em responder nos comentários, bem como nos links prometidos:


Fontes no github
Documentação de Botman
Configuração do servidor
Um artigo no qual criei meu primeiro bot
Artigo no botman

Source: https://habr.com/ru/post/pt456240/


All Articles