Ejemplo simple de chatbot con dialogflow y Fulfillment V2

AUTOR: Hugo Miguez CREADO: 2018-05-22 13:47:28

En este ejemplo de chatbot utilizaremos fulfillment para poder obtener información desde nuestro servidor, otros servidores o servicios webs. Este ejemplo básico mostrará como puedes conectar el servicio de dialogflow con tu servidor para obtener la temperatura de una ciudad.

Crear un nuevo proyecto llamado agente_fulfillment

Para empezar crearemos un nuevo agente con el nombre de agente_fulfillment. Te recomencamos leas los dos ejemplos anteriormente publicados antes de comenzar este ejemplo.

Con el agente ya creado, seleccionamos el intent "Default Wellcome Intent" que como sabemos se crea automaticamente al crear el agente. Le cambiamos el nombre por "Temperatura intent".

A continuación seguimos los siguientes pasos:

  • 1- Eliminamos el evento "Wellcome"
  • 2- Escribimos las frases de entrenamiento en Training phrases:
    • Temperatura en madrid
    • Clima en barcelona
    • Tiempo de buenos aires
    • Qué tiempo hace en valencia
  • 3- En action and parameters cambiamos el valor de input.welcome por el de getcontent
  • 4- En responses añadimos la frase de respuesta "Ciudad no disponible" y eliminamos el resto que venian por defecto.
  • 5- Finalmente en Fulfillment desplegamos y activamos el primer check que dice Enable webhook call for this intent

chatbot dialogflow fulfillment

Habras notado que cuando has añadido las frases de entrenamiento en las ciudades se han resaltado de color amarillo (como puedes apreciar en la imagen superior). Esto es así porque dialogflow detecta que esta palabra clave es una ciudad y automaticamente crea un parámetro nuevo del tipo sys.geo-city. Esto es correcto y permitirá diferenciar cuando el usuario introduce una ciudad o no. Si el usuario no introduce una ciudad automaticamente mostrará la frase que hemos puesto en Response "Ciudad no disponible". Y si ha puesto una ciudad se lanzará fulfillment.

En action and parameters hemos eliminado input.wellcome y hemos colocado "getcontent". Este nombre es inventado y no tiene nada que ver con dialogflow. Basicamente será un parámetro que enviará a una url que indicaremos más adelante para el funcionamiento de fulfillment.


chatbot dialogflow fulfillment

Configurar fulfillment con una url de nuestro servidor

Ya tenemos casi todo terminado desde el panel de DialogFlow. Nos queda activar el fulfillment y indicar la url de la cual obtendrá la respuesta. Mira la siguiente imagen.

chatbot fulfillment dialogflow

1- Tienes que presionar en el menu FulFillment para cargar este formulario.
2- Activa Webhook
3- introduce una url donde estará la página (en php), que crearemos en el punto siguiente, donde aceptará la solicitud de fulfillment.


Crear la página php de respuesta en nuestro servidor

Ahora crearemos un archivo php que se encargará de tratar la solicitud y enviar una respuesta con la información de la termperatura empleando la api de openweathermap.org.

<?php

function processMessage($update) {
    //el action getcontent que hemos indicado en el intent (action and parameters)
    if($update["queryResult"]["action"] == "getcontent"){
        //parametros creados en el intent. En nuestro caso vendrá el nombre de la ciudad
        $params = $update["queryResult"]["parameters"];
        //obtenemos el nombre de la ciudad
        $city = $params["geo-city"];
        
        //obtenemos la temperatura
        $temperatura = getTemperatura($city);
        
        //creamos el mensaje a mostrar al usuario
        sendMessage(array(
            "fulfillmentText" => "La temperatura para hoy en ".$city." es de ".$temperatura." grados c",
            "source"=> "javamovil.info"
        ));
    }else{
        //mensaje de error
        sendMessage(array(
            "fulfillmentText"=> "Se ha producido un error",
            "source"=> "example.com"
        ));
    }
}

//obtenemos la temperatura por medio de la api de openweathermap.org
function getTemperatura($city){
    $json_file = file_get_contents('http://api.openweathermap.org/data/2.5/weather?q='.$city.'&APPID=CODIGO_API');
    $vars = json_decode($json_file);
    $cond = $vars->main;
    return $temp_c = (int)($cond->temp - 273.15);
}
 
function sendMessage($parameters) {
    echo json_encode($parameters);
}

//obtenemos el post desde dialogflow
$update_response = file_get_contents("php://input");
$update = json_decode($update_response, true);
if(isset($update["queryResult"]["action"])) {
    processMessage($update);
}
Para que funcione correctamente recuerda crearte una cuenta en openweathermap.org y obtener un código de api. Y reemplaza en la url de la función php getTemperatura justo en el parámetro APPID=CODIGO_API, donde CODIGO_API debe ser tu código de api que se te ha ofrecido.

Ejemplo funcional


Comentar

Para poder realizar comentarios. Primero debes inicar sesión o crear una cuenta.