Blog de Gonzalo

CREAR UN CHATBOT CON BOTMAN EN PHP

Ya hay varias aplicaciones y webs que usan chatbots y pueden estar diseñados para realizar tareas sin la ayuda de un humano. Por ejemplo, como pedir una pizza o marcar una fecha en el calendario del móvil Aunque yo prefiero el trato humano.
En este post voy a explicar las nociones básicas de como crear un chatbot con botman en php. Botman es un framework de php para realizar chatbots.
Para instalar botman hay que hacerlo con composer con el comando composer require botman/botman y a partir de ahí ya podemos empezar a programar nuesttro chatbot.
Yo empecé con un ejemplo bastante sencillito:
En el ejemplo que empecé tengo tres ficheros (solo e sun ejemplo):
El primer fichero será el index.html donde estará el código javascript donde se inicializará el chatbot:



        var botmanWidget = {
            frameEndpoint: 'chat.html',
            introMessage: 'Hola',
            chatServer : 'chat.php',
            title: 'Mi chatbot',
            mainColor: '#456765',
            bubbleBackground: '#ff76f4',
            aboutText: '',
            bubbleAvatarUrl: '',
        };

//include javascript a la url 'https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/js/widget.js'>


Lo más importante del código anterior es la llamada del chatserver a chat.php que es donde está la programación del chatbot en php
El segundo fichero será chat.php donde estará el código php donde estará programado el chatbot:
IMPORTANTE: Es necesario usar un sistema de cacheado para las conversaciones. En el ejemplo se usa la cache de doctrine que se instala con composer: composer require doctrine/cache


 require_once 'vendor/autoload.php';

 use BotMan\BotMan\BotMan;
 use BotMan\BotMan\BotManFactory;
 use BotMan\BotMan\Drivers\DriverManager;
 use BotMan\BotMan\Messages\Conversations\Conversation;
 use BotMan\BotMan\Messages\Outgoing\Question;
 use BotMan\BotMan\Messages\Outgoing\Actions\Button;
 use BotMan\BotMan\Messages\Incoming\Answer;
 use BotMan\BotMan\Cache\DoctrineCache;
 use Doctrine\Common\Cache\FilesystemCache;


//Clase conversación
 class OnboardingConversation extends Conversation
 {
     protected $section;

     protected $name;

     protected $email;

     public function askName()
     {  
         //Pregunta del chat bot al usuario donde se obtiene la respuesta
         $this->ask('Antes que nada. ¿Cómo te llamas? Para dirigirme a ti', function(Answer $answer) {
             // Texto respuesta
             $this->name = $answer->getText();
             $this->say('Encantado, '.$this->name);
            $this->askWhatToDo();
         });
     }

     public function askWhatToDo(){
        //Se programa una pregunta donde se establacen dos respuestas por defecto y un fallback por si no es ninguna de las dos
        $question =  Question::create('¿Qué deseas hacer en mi blog?')
                        ->fallback('Lo siento pero...')
                        ->callbackId('que_quieres_hacer')
                        ->addButtons([Button::create('¿Ver todos los posts?')->value('all'),Button::create('¿Ver todas las categorías?')->value('categorias'),]);
        $this->ask($question, function(Answer $answer) {

          if ($answer->isInteractiveMessageReply()){
            $value = $answer->getValue();
            $text = $answer->getText();
               $this->say('Opcion, '.$value.' '.$text);
          }
        });
    }

     public function run()
     {
         // Función llamada cuando se inicia la conversación
         $this->askName();
     }
 }

 $config = [
  // Your driver-specific configuration
  // "telegram" => [
  //    "token" => "TOKEN"
  // ]
];

 DriverManager::loadDriver(\BotMan\Drivers\Web\WebDriver::class);

//Se crea el objeto del chatbot. El parámatro de doctrine es el cache de las conversaciones y se indica en que directorio se almacenará dicha
 $botman = BotManFactory::create($config, new DoctrineCache(new FilesystemCache('/cache/')));

/*
 Inicio de la conversación por parte del usuario que puede ser: hola o buenas o buenos díaso bueno o dias o buenas tardes o buenas noches
*/
$botman->hears('.*(hola|buenas|buenos días|buenos dias|buenas tardes|buenas noches).*', function (BotMan $bot,$word) {
      //Se espera un segundo
      $bot->typesAndWaits(1);
      //Se inicia la conversación
      $bot->startConversation(new OnboardingConversation);
});

/*
 Si el usuario introduce alguna palabra que no está en la lista anterior salta el siguiente mensaje
*/
$botman->fallback(function($bot) {
  $bot->reply('Lo siento no te puedo ayudar');
});

$botman->fallback(function($bot) {
  $bot->reply('Sorry, I did not understand these commands. Here is a list of commands I understand: ...');
});

//ejemplo de pregunta específica
$botman->hears('¿Qué hora es {ciudad} en {continente}' , function (BotMan $bot,$ciudad,$continente) {
     date_default_timezone_set("$continent/$city");
    $bot->reply('The time in '.$ciudad.' '.$continente.' is '.date('h:i:sa'));
});

// Botman empieza a escuchar
$botman->listen();


En el código anterior está el comentado lo que es cada cosa.
Botman se puede usar con telegram y crear conversaciones con dialogflow de google y otros. Este post pretene ser una introducción sencillita.

Compartir en twitter