Publicado por Wesley Chun (@wescpy), representante de desarrolladores, G Suite

Si bien la mayoría de chatbots responden a las solicitudes de los usuarios de forma síncrona, hay situaciones en las que los bots no realizan acciones en función de una solicitud explícita del usuario, como ocurre con las alertas o las notificaciones. En el video de DevByte de hoy, te mostraré la manera de enviar mensajes de manera asíncrona a salas o mensajes directos (DM) en Hangouts Chat, la herramienta de comunicación y colaboración grupal de G Suite.

¿Qué imagen proyectas en tu cabeza cuando piensas en un bot en una sala de chat? Quizás un usuario quiera ver los números de las ventas del último trimestre en Europa, o bien buscar el estado del tiempo actual o el próximo horario de una película. Suponiendo que hay un bot para la solicitud en cuestión, un usuario enviará a este un mensaje directo (DM) o lo mencionará precedido por @ desde una sala de chat. Luego, el bot tomará la solicitud (enviada por el servicio de Hangouts Chat), aplicará las acciones necesarias y le enviará una respuesta al usuario en ese “espacio”; la nomenclatura genérica para una sala o un DM.

En nuestro video anterior de DevByte para el marco de trabajo de bots de Hangouts Chat mostramos a los desarrolladores de qué se tratan los bots y el marco de trabajo, y cómo compilar uno de esos tipos de bots en Python y JavaScript. No obstante, debes reconocer que esos bots responden de forma síncrona a la solicitud de un usuario. Esto no es suficiente si los usuarios quieren recibir notificaciones cuando se complete una tarea de ejecución prolongada en segundo plano, cuando falte poco para que llegue un autobús o tren demorado o cuando quede fuera de servicio uno de sus servidores. Debes reconocer que esas alertas pueden provenir de un bot, pero quizá también de una aplicación de supervisión. En el último episodio de G Suite Dev Show, puedes aprender a integrar esta funcionalidad a cualquiera de estos tipos de aplicación.



En el video puedes ver que esas alertas y notificaciones son mensajes “fuera de banda”, lo cual significa que pueden ingresar en cualquier momento. El marco de trabajo del bot de Hangouts Chat proporciona varias alternativas para enviar mensajes asíncronos a una sala o un DM, lo que genéricamente se conoce como “espacio”. La primera es la API de REST basada en HTTP. La otra lo que se conoce como “webhooks entrantes”.

Los bots usan la API de REST para enviar mensajes a un espacio. Debido a que un bot nunca será un usuario humano, se requiere una cuenta de servicio de Google. Una vez que crees una cuenta de servicio para tu bot de Hangouts Chat en la consola para desarrolladores, podrás descargar las credenciales necesarias para comunicarte con la API. A continuación te mostramos un fragmento de Python de ejemplo que usa la API para enviar un mensaje de forma asíncrona a un espacio.
from apiclient import discovery
from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = 'https://www.googleapis.com/auth/chat.bot'
creds = ServiceAccountCredentials.from_json_keyfile_name(
        'svc_acct.json', SCOPES)
CHAT = discovery.build('chat', 'v1', http=creds.authorize(Http()))

room = 'spaces/<ROOM-or-DM>'
message = {'text': 'Hello world!'}
CHAT.spaces().messages().create(parent=room, body=message).execute()

La alternativa a usar la API con las cuentas de servicio es el concepto de webhooks entrantes. Los webhooks representan una alternativa rápida y sencilla de enviar mensajes a cualquier sala o DM sin configurar un bot completo; por ejemplo, a apps de supervisión. Los webhooks también te permiten integrar tus flujos de trabajo personalizados, como cuando se agrega un cliente nuevo al CRM (sistema de administración de relaciones con clientes) corporativo, y también en los casos que se mencionan más arriba. A continuación, te mostramos un fragmento de Python que usa un webhook entrante para comunicarse en un espacio de forma asíncrona.
import requests
import json

URL = 'https://chat.googleapis.com/...&thread_key=T12345'
message = {'text': 'Hello world!'}
requests.post(URL, data = json.dumps(message))

Debido a que los webhooks entrantes son puntos de conexión en los que se realizan publicaciones mediante HTTP POST, puedes incluso usar curl para enviar un mensaje a un espacio de Hangouts Chat desde la línea de comandos:
curl \
    -X POST \
    -H 'Content-Type: application/json' \
    'https://chat.googleapis.com/...&thread_key=T12345' \
    -d '{"text": "Hello!"}'

Para comenzar, repasemos la documentación de Hangouts Chat para desarrolladores; en especial, las páginas específicas cuyos vínculos se proporcionan más arriba. Esperamos que este video, en el que se muestra cómo enviar mensajes al servicio de Hangouts Chat de forma asíncrona, te ayude a llevar tus habilidades de desarrollo de bots al siguiente nivel.