Crear chatbot con laravel

¿Qué es un chabot?

Cada vez es más frecuente encontrarnos en páginas web un sistema de chatbot, que es un bot que interactua de forma autónoma y que ha sido diseñado para imitar una conversación con una persona real, dar respuesta e incluso solucionar problemas.

¿Como creamos un chatbot en Laravel?

Para crear un chatbot en Laravel, haremos uso de la librería Botman, que es una librería php independiente del framework y que podemos utilizar para simplificar el desarrollo de bots en nuestra aplicación.

Creación de chatbot en Laravel

Botman ha sido creado por Marcel Pociot, que ha creado Botman studio, que es un proyecto de Laravel listo para usar con Botman. En Botman Studio encontraremos herramientas de pruebas para arrancar super rápido nuesto chatbot.

Instalación de Botman en Laravel

Como hemos dicho, crearemos nuestro proyecto con el comando:

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

Una vez instalado nuestro proyecto, nos dirijimos a «http://127.0.0.1:8000/botman/tinker» y nos aparecerá ya un chatbot que viene por defecto y que interactúa con nosotros con el mensaje «Hi».

Configuración de nuestro chatbot

Para comenzar, vamos a crearnos un constructor llamado ChatController.php, que será el encargado de comenzar nuestra conversación cuando el usuario escriba el comando que nosotros elijamos:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Conversations\BotConversation;


class ChatController extends Controller
{
    function index($bot){
        $bot->startConversation(new BotConversation);
    }

}

Si nos fijamos, estamos llamando a la clase BotConversation, que crearemos en App\Conversations. Y le añadiremos el siguiente codigo:

<?php

namespace App\Conversations;

use Illuminate\Foundation\Inspiring;
use BotMan\BotMan\Messages\Incoming\Answer;
use BotMan\BotMan\Messages\Outgoing\Question;
use BotMan\BotMan\Messages\Outgoing\Actions\Button;
use BotMan\BotMan\Messages\Conversations\Conversation;

class BotConversation extends Conversation
{
    /**
     * First question
     */
    public function hello()
    {

    }

    /**
     * Start the conversation
     */
    public function run()
    {
        $this->hello();
    }
}

La función hello, será la que se ejecutará en cuanto el usuario escriba la frase que elijamos, como estamos indicando en la función run

Lo que vamos a hacer en esta función es saludar al usuario y le daremos elegir dos opciones. Una vez seleccione una de ellas, programaremos nuestro bot para que responda de una forma u otra.

Este será el código que tendrá nuestra función hello:

public function hello()
    {
        $question = Question::create("¡Hola! Elige una opción") //Saludamos al usuario
            ->fallback('Unable to ask question')
            ->callbackId('ask_reason')
            ->addButtons([
                Button::create('¿Quién eres?')->value('who'),//Primera opcion, esta tendra el value who
                Button::create('¿Qué puedes decirme?')->value('info'), //Segunda opcion, esta tendra el value info
            ]);
        //Cuando el usuario elija la respuesta, se enviará el value aquí:
        return $this->ask($question, function (Answer $answer) {
            if ($answer->isInteractiveMessageReply()) {
                if ($answer->getValue() === 'who') {//Si es el value who, contestará con este mensaje
                    $this->say('Soy un chatbot, te ayudo a navegar por esta aplicación, 
                    solo debes escribir "Hola bot"');
                    //Si es el value info, llamaremos a la funcion options
                } else if ($answer->getValue() === 'info'){
                    $this->options();
                }
            }
        });
    }

Crearemos otra función llamada options, bajo la función hello, que se llamará si elegimos la opción con value «info». Ésta preguntará a nuestro usuario si quiere saber la hora o la fecha actual y le responderá a esta petición:

public function options(){
        $question = Question::create("¿Qué quieres saber?")//le preguntamos al usuario que quiere saber
            ->fallback('Unable to ask question')
            ->callbackId('ask_reason')
            ->addButtons([
                Button::create('¿Qué hora es?')->value('hour'),//Opción de hora, con value hour
                Button::create('¿Qué día es hoy?')->value('day'),//Opción de fecha, con value day
            ]);

            return $this->ask($question, function (Answer $answer) {
                if ($answer->isInteractiveMessageReply()) {
                    if ($answer->getValue() === 'hour') {//Le muestra la hora la usuario si el value es hour
                        $hour = date('H:i');
                        $this->say('Son las '.$hour);
                    }else if ($answer->getValue() === 'day'){//Le muestra la hora la usuario si el value es date
                        $today = date("d/m/Y");
                        $this->say('Hoy es : '.$today);
                    }
                }
            });
    }

Una vez hecho esto, ya tenemos nuestra clase lista.

Ahora nos vamos al archivo botman.php, que se encuentra en la carpeta routes.

Borraremos el contenido que trae de prueba y definiremos el mensaje que el usuario debe escribir para que nuestro chatbot interactue con él:

<?php
use App\Http\Controllers\BotManController;

$botman = resolve('botman');

$botman->hears('Hola bot', 'App\Http\Controllers\ChatController@index');
//El primer parametro "hola bot" será el que active nuestro bot, llamará a la función
//index de nuestro controlador chatController.php y ésta a la función hello


Ahora bien, nuestro bot responde si nuestro usuario escribe «Hola bot», pero… ¿Qué pasaría si escribiera alguna otra frase, sin estar programada? Para ello vamos a crear una nueva respuesta que saltará cada vez que nuestro bot no encuentre esa frase en su configuración.

Para ello añadiremos esto a nuestro botman.php

$botman->fallback('App\Http\Controllers\FailChatController@index');
//Si lo que envia el usuario no lo conocemos, se ejecuta la función index del
//controlador FailChatController

Ahora, crearemos nuestro FailChatController.php en nuestra carpeta Controller:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FailChatController extends Controller
{
    function index($bot){
        $bot->reply('Lo siento, no reconozco ese comando, intenta utilizar "Hola bot"');
        //Avisamos al usuario que ese comando no esta configurado en el chatbot
    }
}

De esta forma, nuestro ejemplo de chatbot en laravel tendría un funcionamiento básico, ahora es cuestión de echarle unas horitas para tener un bot preparado para interactuar con cualquier usuario de nuestra web.

¡Nos vemos pronto en un nuevo artículo! suscríbete y no te pierdas nuevas entradas.