Cómo integrar tu aplicación Python a Slack usando Bots

como-integrar-tu-aplicación-python-a-slack-usando-bots-landscape

En Swapps, usamos Slack diariamente para comunicarnos con los otros miembros del equipo de trabajo; desde decir buenos días hasta notificar una situación de gran relevancia. Debido a que Slack es una aplicación que usamos constantemente, hemos integrado diferentes notificaciones a esta herramienta; así, por ejemplo, en cuestión de segundos, sabemos si un sitio se ha eliminado o si las pruebas de una pull request han fallado.

Slack le permite crear aplicaciones que se pueden integrar en los canales de conversación. Como mencioné anteriormente, estas aplicaciones pueden ser notificaciones simples enviadas cuando ocurre un evento en una aplicación externa o aplicaciones que permiten leer y responder mensajes o conversaciones usando Bots. Un Bot es un tipo de aplicación de Slack diseñada para interactuar con los usuarios a través de una conversación. Se pueden construir con events o con Real Time Messaging, RTM.

Vamos a crear nuestro pequeño Bot, al que vamos a saludar y él nos responderá. Para este ejemplo, utilizaremos la suscripción a events.

Creamos la APP de Slack:

Creamos el usuario Bot

Instalamos la aplicación en el ambiente de trabajo

Después de la instalación, copiamos el token de acceso OAuth de Bot User y el token de verificación, que se encuentra en las credenciales de información básica, y lo guardamos para su uso posterior en nuestra aplicación Python.

Creamos el recurso en nuestra aplicación Python

Antes de activar la suscripción al evento, debemos crear el recurso al que Slack hará las solicitudes en nuestra aplicación Python.

Slack requiere confirmar que el recurso funciona correctamente. Con este fin, Slack envía una solicitud con un JSON similar al siguiente ejemplo y espera, en respuesta, el valor de “challenge”; que debemos regresar de nuestra aplicación Python.

{
    "token": "Jhj1dZrFaK1ZwHjjRyZWjbDl",
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
    "type": "url_verification"
}

La aplicación de ejemplo se realizó con Django, pero se puede hacer con otra herramienta similar como Flask, además utilizamos el Cliente de Slack para Python:

La librería es instalada con el comando siguiente:

Pip install slackclient

Para inicializar el cliente usamos el token previamente agregado en nuestra aplicación:

from slack import WebClient

class SlackBotTest(object):
   def __init__(self, request):
       self.Client = WebClient(<SLACK_BOT_USER_TOKEN>)
       self.slack_message = request.data
       self.user = None
       self.channel = None

Debemos retornar el mismo atributo challenge, adicionalmente, es recomendable validar que el token que recibimos es el mismo que guardamos.

if self.slack_message.get("token") != <SLACK_VERIFICATION_TOKEN>:
           return {"status": HTTP_403}
 # verification challenge
 if self.slack_message.get("type") == "url_verification":
           return self.slack_message.get("challenge")

Activamos la suscripción del evento

El código anterior se devuelve en un recurso que creamos “api / slack-events-test”, ingresamos la URL y con la URL verificada podemos continuar configurando la suscripción al evento. La aplicación Python se desarrolla localmente para que Slack pueda realizar la solicitud desde el exterior. He expuesto mi instancia local al acceso público utilizando ngrok.

En la misma configuración, debemos elegir el evento en el que responderá el Bot, el Evento: message.im, lo que significa que podemos interactuar con él cuando mencionamos el bot en el canal directo.

Al final, guardamos los cambios. En este momento, ya hemos configurado el Bot usando la suscripción al evento; solo tenemos que implementar la lógica para que el Bot salude.

Al código que hemos creado, agregamos la lógica para obtener el texto que proviene de Slack. En caso de que contenga la palabra “hello” procedemos a devolver la respuesta a Slack, con el método api_call ():

from slack import WebClient

class SlackBotTest(object):
   def __init__(self, request):
       self.Client = WebClient(<SLACK_BOT_USER_TOKEN>)
       self.slack_message = request.data
       self.user = None
       self.channel = None

if self.slack_message.get("token") != <SLACK_VERIFICATION_TOKEN>:
           return {"status": status.HTTP_403_FORBIDDEN}
 # verification challenge
 if self.slack_message.get("type") == "url_verification":
           return self.slack_message.get("challenge")
if "event" in self.slack_message:
           event_message = self.slack_message.get("event")
           self.user = event_message.get("user")
           self.channel = event_message.get("channel")
           if "hello" in event_message.get("text"):
               self.salute()

           return {"status": HTTP_200}

En el método salute() creamos la respuesta y la enviamos:

def salute(self):
       bot_text = "Hi  <@{}> :wave:".format(self.user)
       self.api_call(bot_text)

Y finalmente, hacemos uso del método api_call () del cliente de Slack, para enviar la respuesta:

def api_call(self, bot_text):
       self.Client.api_call(
           "chat.postMessage",
           json={
               "channel": self.channel,
               "text": bot_text,
           },
       )
       return {"status": status.HTTP_200_OK}

Para probar nuestro pequeño bot, lo buscamos en nuestro ambiente de trabajo:

y le escribimos:

Si queremos que nuestro Bot sea muy inteligente y sofisticado, podemos agregar procesamiento de lenguaje natural a las respuestas. Sin embargo, usando condicionales, podemos tener un resultado bastante bueno. Algunas ideas para usar Slack API pueden ser: integrar un proyecto externo para consultar información importante; recibir alertas cuando se haya excedido el presupuesto del proyecto; felicitar a los miembros de su equipo por su cumpleaños o por su buen desempeño automáticamente; publicar una publicación en diferentes redes sociales, etc.

Como hemos visto, construir nuestro Bot ha sido fácil, es bastante útil usar las herramientas que Slack nos brinda, ya que podemos mejorar la comunicación de los miembros del equipo, podemos automatizar procesos, prevenir y actuar en caso de eventualidades, el uso que le podemos dar depende de nuestra imaginación y necesidades de trabajo.