Extendiendo Slack: Comandos personalizados, bots, webhooks y aplicaciones

Una de las principales ventajas de usar Slack respecto de Skype o cualquier otra alternativa de mensajería es, además de mejorar la comunicación interna de equipos, la capacidad de extenderse hasta donde tú quieras. A través de simples comunicaciones JSON HTTP podrás responder con un mensaje cuando alguien invoque tu comando, cuando quieras (Incoming Webhooks), o cuando alguien escriba a tu usuario Bot.

Si tienes cualquier duda extra siempre puedes usar la ayuda oficial: Slack API.

slack

Cómo funcionan los comandos de Slack

Cuando se ejecuta un comando personalizado de Slack, los servidores del servicio hacen una llamada HTTP a la URL que definamos con una serie de campos a través de queryparameters. Por ejemplo, el comando /test hola! haría una llamada a nuestro endpoint con los siguientes parámetros:

token=gIkuvaNzQIHg97ATvDxqgjtO
team_id=T0001
team_domain=girosp
channel_id=C2147483705
channel_name=test
user_id=U2147483697
user_name=admin
command=/test
text=hola!
response_url=https://hooks.slack.com/commands/1234/5678

Cada campo es un detalle del contexto en el que se ha invocado el comando, se puede ver el equipo, canal y usuario relativos a la ejecución. El parámetro response_url es un Incoming Webhook que te provee Slack para dar respuestas de forma asíncrona.

Se tiene que contestar a esta llamada con un 200 OK y JSON de este estilo:

{
  "text": "¡Hola Mundo!",
  "response_type": "in_channel",
  "attachments": [
    {
      "text":"Este es un adjunto de prueba"
    }
  ]
}

Si logramos contestar antes de 3 segundos, el canal o la conversación donde se haya ejecutado el comando verá un nuevo mensaje que diga: “¡Hola Mundo!”. Muy fácil, ¿no? Si no podemos ofrecer una respuesta en menos de 3000 ms dará un timeout y el comando devolverá un error sólo al usuario que lo invocó. Si crees que tu respuesta puede tardar más de este tiempo en ser devuelta es mejor que devuelvas un 200 OK vacío y contestes al webhook.

Ejemplo de comando: /meme

Vamos a crear un nuevo comando en nuestro equipo de Slack. La idea es que se muestre la imagen de un meme o cualquier otra imagen graciosa cada vez que se ejecute el comando /meme en cualquiera de los canales de Slack del equipo.

Lo primero es ir a la página de creación de comandos de tu equipo y rellenar los datos:

slack1

La URL es el endpoint completo al que Slack llamará cuando el comando sea ejecutado por alguien. Es el encargado de la lógica de todo, será el que busque el meme o imagen graciosa por donde tenga definido y devuelva el JSON asociado al mensaje. Luego se explicará cómo preparar el servidor web, por ahora en nuestro caso es algo así: http://******.ngrok.io/api/commands/meme

El token sirve para comprobar la veracidad de las llamadas. Para asegurarnos de que quien ataca a nuestro API es Slack y por lo tanto podemos dar por cierto que alguien ha ejecutado el comando.

Es muy recomendable activar para que se vea el comando en la lista de comandos disponibles y añadir una pequeña ayuda indicando si acepta parámetros, devuelve algo…

Una vez creado el comando, Slack está esperando que contestemos las llamadas que nos hacen a nuestro API con mensajes.

Incoming Webhooks

Los webhooks son un mecanismo que da Slack para enviar mensajes a un canal de Slack siempre que queramos sin necesidad de que ningún usuario haya hecho nada necesariamente.

Cuando definimos un Incoming Webhook le pasamos un canal, un usuario (que escribirá el mensaje) y un logo por defecto. De todas formas, estos parámetros se pueden cambiar dependiendo del mensaje que enviemos.

Podría ser útil, por ejemplo, cuando en la oficina alguien llame al timbre. A través de nuestro servidor web (o un simple curl), hacemos una llamada HTTP al webhook con el contenido del mensaje a mostrar en Slack:

slack2

En este caso ha valido con ejecutar desde el terminal:


curl -X POST --data-urlencode 'payload={"channel": "#general", "username": "ElFantasmaDeLaPuerta", "text": "Alguien llamó a la puerta en Satélite", "icon_emoji": ":ghost:"}' https://hooks.slack.com/services/******/*******/****

Bots

Los bots son usuarios de Slack en los que sus mensajes se definen programáticamente. Los bots pueden ser agregados a canales, puedes tener conversaciones privadas con ellos y pueden ser eliminados de conversaciones como cualquier otro usuario.

Un usuario bot puede estar integrado en un único equipo Slack o estar empaquetado como app Slack listo para que lo usen otros equipos. Cada tipo de bot puede hacer unas u otras cosas.

Para desarrollar Bots es necesario usar el Real Time Messaging API de Slack a través de Websockets, pero hay un framework de Node.js llamado Botkit que ayuda mucho en la tarea.

Apps

Una app de Slack es un conjunto de comandos, incoming webhooks y bots encapsulados para ser instalados en cualquier equipo de Slack.

Crear una app incluso puede ser una buena opción de cara a ahorrar unas cuantas integraciones al límite gratuito de 10 que da el plan free. Con una app sólo utilizarás una integración de comandos, incoming webhooks y usuarios bot.

Diseñando mensajes de respuesta

slack3

Cualquiera de los diferentes tipos de integración tiene como finalidad escribir mensajes en canales de Slack. Los mensajes de respuesta pueden tener un título, descripción, link, pero lo más importante, puede tener uno o muchos adjuntos. El JSON asociado a la captura que se muestra es:

{
  "response_type": "in_channel",
  "attachments": [
    {
      "title": "De tu envidia nace mi fama\n",
      "title_link": "http://yonkiblog.com/de-tu-envidia-nase-mi-fama/",
      "image_url": "http://41.media.tumblr.com/c27a5fd05e908f94d457ea3331339e89/tumblr_o5rumzl0t21slstjgo4_500.jpg",
      "color": "#764FA5"
    }
  ]
}

El campo response_type indica si quieres que el mensaje sea visible para todos en el canal (in_channel) o sólo para el que lo ha ejecutado (ephemeral).

En este caso el adjunto únicamente tiene un título, el link, la imagen (puede tener thumb_url) y el color de la barra de la izquierda que recorre todo el adjunto.

Puedes trastear todo lo que quieras para diseñar el mensaje que más te guste con el Message Builder.

Todo texto es susceptible de formatear prácticamente casi de la forma en la que usas Slack. Puedes añadir saltos de línea con \n, enlaces de la forma <http://link.com>, usar variables y hasta insertar emojis.

Puedes ver más acerca del formato que soportan los campos de los mensajes en Message Formatting y en Attachments para ver todas las opciones que permiten los adjuntos en mensajes de Slack.

Una vez has conseguido devolver un JSON como el de antes a través de una URL accesible desde Internet podrás decir que ya has hecho una extensión de Slack.

 

Recibe más artículos como este

Recibirás un email por cada nuevo artículo.. Acepto los términos legales

Escribe un comentario