Bot en Telegram con Watson Assistant y Node-red 2

En el post anterior explique los primero pasos que se deben realizar para crear un bot en telegram con Watson Asisistant. Vimos como iniciar Nodered, como crear conversaciones básicas con Watson Assistant y como crear el bot usando BotFather.
En este post me enfocaré en explicar los pasos para poder enviar opciones e imágenes desde Watson Assistant a Telegram y en el uso de nuevos nodos de Nodered.
Contenidos
Watson Assistant
Lo primero que debemos hacer es crear la conversación en el servicio de IBM. Para esto, en la pestaña “Dialog” , creamos un nodo que será activado cuando Watson reconozca el “intent” apropiado. En mi bot tengo los intents #Location, donde responderé con una imagen que mostrará la ruta de como llegar y #Reserve, donde me dará dos opciones a elegir.
Nota: Si no entiendes lo que digo, puedes revisar el post anterior, Bot en Telegram con Watson Assistant y Node-red, ahí explico esto con más detalle
Respuestas con imágenes en Watson Assistant
Hacer que nuestro bot responda con una imagen es muy sencillo. Lo primero que tenemos que hacer es crear un nuevo nodo, hacer click en “Add response type” y seleccionar “Image”.
Nota: Para este ejemplo, es necesario eliminar la opción de texto, y dejar solo la respuesta con imagen. Para que nuestro bot realice multiples respuestas es necesario un poco de programacion.

El servicio de Watson Assistant no almacena imagenes directamente, así que es necesario pasarle la imagen como una url. También tienes la opción de colocar un título y una descripción, pero prefiero dejarlas en blanco. Listo!

Opciones en Watson Assistant
Los pasos para responder con opciones son similares a los anteriores. Primero creamos el nodo de conversación, eliminamos el texto haciendo click en el basurero y haciendo click en “Add response type” seleccionamos “option”.

Las opciones requieren: título y opciones (obvio jajaja). El título es la pregunta que hará el bot. En mi caso, ¿Que necesita? y las opciones serán, Clases particulares y Ayudantías.
Para agregar una opción debemos hacer click en “Add option” y debemos completar los datos, donde “List label” es el mensaje que envía Watson como nombre de la opción y “Value” es el valor que envía Watson para luego analizarlo y detectar un intent.
Nota: De la manera que configuro el Nodered y como lo muestro en este post, la casilla “Value” puede estar vacía, ya que solo se enviarán los datos de la columna “List label”.
Nodered
Ahora que tenemos lista nuestra conversación, debemos adaptar nuestro Nodered para que envíe el mensaje a Telegram, ya que nuestro flujo solo es capaz de enviar texto.
Inject and debug
Cada ves que recibimos datos nuevos o falla algo en Nodered, hay dos nodos obligatorios de usar. Inject y Debug.
- Inject es un nodo que nos permite pasar cualquier tipo de información a otro nodo. Esto nos sirve para poder probar nuestra lógica cuando algo falla, o cuando queremos pasar información de manera más rápida.
- Debug es un nodo que nos permite saber que información está saliendo de algún nodo. Esto nos sirve cuando no sabemos en que nodo se está cortando nuestro flujo, entonces colocamos el nodo a la salida del nodo sospechoso para saber que ocurre.
Lo primero que debemos hacer es saber como llega la información desde Watson Assistant. Para esto colocamos un nodo inject antes de entrar al nodo assistant y un nodo debug a la salida. (Recuerda desconectar el flujo hacia telegram para que no se produzca un error, ver imagen mas abajo).
El nodo inject por defecto nos entrega un timestamp, por lo que debemos cambiarlo a String y escribir alguna frase que active los intent que retornan una imagen u opciones.

Una vez que le damos Deploy, hacemos click en el cuadrado que está a la izquierda del nodo Inject. Esto inyectará el mensaje al Assistant y la respuesta la recibirá el nodo Debug.

En el costado derecho del navegador, tenemos una barra lateral que dice info. Si hacemos click en el insecto que se encuentra al lado superior derecho, nos mostrará el debug.
Si hiciste el Deploy y clickeaste el Inject, te debería aparecer algo como en la imagen

Lo que ves es el mensaje principal que fluye entre los nodos, llamado “Payload”, que es un atributo del objeto msg. Si hacemos click sobre el mensaje, luego sobre output, despues sobre generic y finalmente en cero, veremos que, ya sea que responda con una imagen o una opción, Watson nos envía una variable llamada “Response_type“.


La variable Response_type, contiene el tipo de mensaje que sale desde Watson Assistant. Estos pueden ser “text”, “option”, “image” o “pause”.
Ahora que sabemos donde está la variable que contiene el tipo de mensaje, (msg.payload.output.generic[0].response_type) podemos preparar el mensaje para que pueda ser enviado a Telegram.
En las funciones de la barra de nodos, existe un nodo llamado “switch”. Este nodo nos permite crear bifurcaciones de nuestro flujo según las condiciones que le entregemos.

El nodo requiere los siguientes datos:
- Property: Es la variable que usaremos para separar nuestro mensaje. Esta debe ser escrita desde el “msg”. Como nuestra variable se llama response_type y se encuentra en msg.payload.output.generic[0].response_type .
- Lógica: Es un menú desplegable en el que podemos seleccionar como queremos realizar la comparación, puede ser: igual (==), mayor que (>), menor que (<), distinto (!=), verdadero (is true), falso (is false), entre muchas otras.
- Valor: Es el valor que puede tomar la variable utilizada para separar el flujo. Esta puede ser un caracter (string), numero (number), un atributo del msg (msg.), etc.
Nuestra lógica es sencilla. Hacemos click en el botón “add” tres veces (porque tenemos tres tipos de mensajes), en los menús desplegables de la izquierda seleccionamos “==” y en los de la derecha “string” y luego escribimos en las casillas los valores que puede tomar nuestra variable (text, image y option).

Ahora nuestro nodo cambia y tiene tres salidas que deben ir hacia tres funciones diferentes, según el tipo de respuesta que queremos dar.
Para las respuestas tipo texto, usaremos la misma función del tutorial anterior y para la salida tipo imagen haremos un pequeño cambio. En el atributo “content” cambiamos al final “text” por “source” y en el campo type cambiamos “message”, por “photo”.

Para las respuesta tipo opción, hay que saber un poquito acerca de los tipos de datos en Javascript para entender. Te dejo el script para que copies y pegues. Pd: Aprende a programar, te cambiará la vida!

Ya tenemos una función por cada tipo de mensaje, solo nos queda conectar los nodos al nodo “sender” de Telegram y listo.

¡Ahora tu bot puede responder de tres formas diferentes!
Nota: Puedes tener el flujo completo en tu nodered importando mi script. Ve mi respositorio en github
4 comentarios
Abi · 5 agosto, 2019 a las 8:43 AM
Gracias Danilo! por compartir tus conocimientos, me ha servido muchoo!!
Saludos
Blanca · 12 mayo, 2020 a las 4:43 PM
Buenas tardes Danilo!
Lo primero muchas gracias por el tutorial muy útil!
Pero tengo una duda si ponemos msg.payload.output.generic[0].source lo que nos muestra es la url no la imagen, ¿sabes cómo hacerlo para que muestre la imagen?
Muchas gracias!
Blanca · 12 mayo, 2020 a las 5:38 PM
Es decir, muestra las dos cosas, imagen y url pero yo quiero que aparezca solo la imagen sin url, me puedes ayudar?
Muchas gracias!
Danilo Toro · 14 mayo, 2020 a las 2:01 PM
Hola Blanca,
En el Mail que te respondí te comenté que no existía forma sencilla de hacerlo, pero acabo de encontrar un nodo que podría ayudarte.
Instala el nodo llamado node-red-contrib-image-tool. Este te permite transformar una imagen que tengas como url a un buffer o base64. Prueba haciendo la conversión a alguno de esos dos antes de enviarla al nodo de telegram.
Si tienes dudas de como utilizar el nodo me avisas 😉