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.

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".

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

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

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:

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) {
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.

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