Ir al contenido principal

Mi primer chatbot con whatsapp

No voy a hacer "apología de whatsapp" pues es claro para todos que es una herramienta de comunicación que todo el mundo (al menos occidental) tiene y usa a diario.

Siendo así ¿que tal si mi aplicación pudiera responder por ese medio? ¿Qué skills necesitaría? ¿Qué otros recursos?

Revisé algunos contenidos al respecto, por cierto los recomiendo, especialmente los producidos en el GX29: https://meetings.genexus.com/2019/sessions/chatbots

Es tremendo lo que se puede hacer alrededor del tema. Sin embargo lo que yo quería era algo bien sencillo, no quería tanto la parte de NLP (PLN), IA, etc que es un camino muy interesante pero que implicaba más trabajo y lo mio era explorar, divertirme, hacer algo útil y aprender en el camino (algunos le llaman "procastinar":)).

Quería probar la utilidad de "dialogar" con mi aplicación vía Whatsapp, generar otras ideas a partir de ver y sentir algo funcionando, resolviendo un problema real, un prototipo de bajo costo.
Así que partí de un servicio que simplemente me contesta un dato (cantidad de usuarios registrados), el cual ya tengo y es cuestión de ponerle Whatsapp arriba.
Si funciona para ese primer servicio, podría implementarlo para otros servicios: ¿que tal que Whatsapp fuera la UI de esos servicios?

Algo así:

Whatsapp llama a mi "proxy" y mi "proxy" llama al servicio que se quiera consumir.
Ir directo con whatsapp me complicó un poco (cuenta certificada, etc) así que terminé incluyendo Twilio como un "broker" entre Whataspp y mi proxy (algo de esto habla Sebastián en su charla del GX29)

Así que el esquema quedó:


Es decir: Whatsapp "llama" a Twilio, Twilio a mi app, esta determina cuál es el servicio y lo llama, luego contesta a Twilio que contesta a Whatsapp.

¿A qué se resume hacer un chatbot como este?

1. Crearse una cuenta en Twilio (acá una guía)
2. Definir un "webhook" que atenderá las llamadas de Twilio.

Esto en GeneXus 16 U6 es un proc HTTP y con el módulo de GeneXusChannels que viene en GeneXus es simplemente:

&Value = Parameters.TwilioKey
&Query = &HttpRequest.ToString()
GeneXusChannels.Webhooks.Whatsapp.Twilio.WhatsappTwilioWebhook(&Query, &Message, &ChannelConfiguration)

&ChannelConfigurationProperty = new()
&ChannelConfigurationProperty.Key = WhatsappProperties.Token
&ChannelConfigurationProperty.Value = &Value
&ChannelConfiguration.Properties.Add(&ChannelConfigurationProperty)

// processing the message received
do case
    case &Message.Text.ToLower().Trim() = !"1"
        &Message.Text = str(GetGeneXusUsersTotal())
    case &Message.Text.ToLower().Trim() = !"2"
        &Message.Text = "another service"
    otherwise
        &Message.Text="Choose:"+newline()+"1. Total Registered Users (demo)"+newline()+"2. Another service"+Newline()
endcase

GeneXusChannels.Message.SendMessage(&ChannelConfiguration, &Message, &Messages)
Digamos que creando la cuenta y escribiendo 10 lineas de código tengo un chatbot funcional!
Es más, si no la quieren escribir pueden obtener la KB de acá y esta guía puede aportar.

Se ve así:



De acuerdo que no tiene NLP, la seguridad es básica (uso un token en el header del servicio que consumo), no mantiene estado de la conversación, etc pero funciona y me llevó 20 minutos dejarlo andando!!

A su vez, viendo la cantidad de servicios de datos que existen hoy, viendo las charlas del GX29 y lo que hay publicado en el wiki de GeneXus quisiera tener un par de horas para poder seguir explorando, aprendiendo, haciendo prototipos rápido y fácil porque se pueden hacer cosas muy útiles (y divertidas) con esto!

Comentarios

Entradas más populares de este blog

Abrir links con aplicaciones nativas y no el browser (deeplinking)

El problema que tengo con algunas aplicaciones Android/iOS es que cuando recibo un link por algún medio (mail, tweet, etc) al abrirlo me lo abre con el browser, en lugar de abrirlo con una aplicación nativa asociada a ese “contenido”.

Por ejemplo, si recibo un link a un tweet espero que lo abra con alguna aplicación de twitter que tenga instalada y no con el browser. De modo análogo si recibo un mail con una nota de prensa de un medio X y tengo la aplicación de ese medio X instalada, espero que el link lo abra con la aplicación nativa y no con el browser.
Lo mismo quisiera con mi aplicación de "banking" o cualquiera que tenga instalada y sepa manejar ese "contenido" (link).

Los motivos son bastante obvios pero los resumo en: la experiencia de usuario es mucho mejor en la aplicación nativa que en el navegador.

Parte importante del tema es que el mismo link sea válido tanto para ver el contenido en el browser como para verlo en la aplicación, porque como proveedor de…

Acumular-Definir-Decidir-Ejecutar

Hay mucho escrito sobre el proceso de toma de decisiones y ejecución de las mismas, comparto la fórmula mínima que a mí me funciona mejor y es fácil de recordar:

1. Acumulación/análisis (de datos)
2. Definición (de opciones)
3. Decisión (de opción)
4. Ejecución (de la elegida)

Esto es un proceso personal o grupal, en cualquier caso aplican algunos tips:

Es importante saber (uno mismo o todos los involucrados) en qué etapa se está en todo momento.

Personalmente soy explícito en "terminamos la etapa TAL, pasamos a CUAL".

Siempre se puede volver para atrás un paso, lo cual es explícito también. Ejemplo: si en la Decisión no hay un acuerdo, eventualmente volvemos a la Definición y así sucesivamente.

Si es grupal creo que siempre es bueno que cada uno haya trabajado en las primeras 3 etapas antes de poner el tema en común en el grupo.


En fin, muchas cosas más pero seguir el método de ADDE es, lo que a mí, me ha dado mejores resultados.



Sobre viajes y puertas

He tenido la oportunidad de viajar por algunas partes del mundo y los viajes definitivamente son nutritivos. Se descubren personas, sociedades, culturas, lugares, historias… en fin… una actividad que aconsejo plenamente.
Obviamente cada viajero disfruta más de algunas actividades o lugares que otros, observa determinadas cosas con más atención, valora más esto o aquello. 
En particular a mi me gustan mucho todos los lugares con cierta carga histórica, imagino cómo hubiera sido vivir en ese lugar hace 50 o 100 o 500 años, qué sentido tendrían esos edificios, plazas, calles, puentes, cómo se vería todo, cómo la gente interactuaría entre sí y con el medio… en fin… me entretiene y despierta mi imaginación, eso al fin y al cabo es lo que espero de un viaje. 
Aprender en el sentido de “ser más sabio”, acumular contenidos como quien acumula cosas no tiene sentido, para eso está la Wikipedia, en esos viajes yo me nutro de sensaciones y experiencias, las incorporo y transformo en parte de mí y ev…