() translation by (you can also view the original English article)



Slack fue fundada en el año 2014 y está siendo considerado como la aplicación de negocios de más rápido crecimiento en la historia. Actualmente cuenta con más de 50.000 pagando las empresas que utilizan sus productos, incluyendo mi actual lugar de trabajo.
Slack muy ha distinguido de sus precursores que se centraron más en ser un sistema de mensajería con algunas capacidades de voz y video. Slack realmente ha empujado a la envolvente y está trabajando diligentemente en la construcción de un directorio de aplicación muy potente. El directorio de la aplicación contiene cientos o miles de integraciones que pueden proporcionar una cantidad increíble de flexibilidad para mejorar la eficiencia de la empresa.
El objetivo de este artículo es demostrar cómo usted puede construir su propia integración única con Slack, aprovechamiento de Python para la lógica.
Para ayudar a centrarse en la comprensión de la mecánica de los fundamentos de un Bot de Slack, me centraré en un bot personalizado.
¿Por qué construir un Bot Slack?
Aunque Slack tiene un directorio de aplicación de clase mundial, cada empresa tiene procesos únicos del negocio. Esto deja a muchas empresas en una situación donde simplemente no puede encontrar la aplicación perfecta para ellos.
Se trata de construir tu propio Bot de Slack donde entra en juego.
Trabajo de un Bot de Slack es recibir y manejar los eventos generados por la interacción flojo de su equipo. Holgura ofrece por lo menos 50 tipos de diferentes eventos, tales como:
-
message
: un mensaje a un canal. -
team_join
: un nuevo miembro ha unido el equipo. -
member_joined_channel
: un usuario se unió a un canal público o privado.
Y por supuesto, hay muchos más tipos de eventos que tu bot opcionalmente puede manejar y reaccionar a. Por ejemplo, el evento team_join
es un evento fantástico que puede comenzar un proceso de inducción completa.
El objetivo de este artículo demostrará cómo un Bot de holgura interactuarán con el evento de message
para realizar acciones específicas cuando los miembros del equipo interactúan con el bot.
Escogiendo Bien el Tipo Bot Slack
En este artículo, creo una aplicación de Python y un Bot de Slack que se puede Agregar a su proyecto de equipo para responder al evento de message
.
Para empezar, necesito crear un Bot en holgura. Pueden crear dos tipos de bots:
- un bot personalizado
- crear una aplicación y agregar un usuario bot
Este artículo va a crear un bot personalizado porque un usuario bot de aplicación sería más apropiado si estuviera planea escribir y publicar una aplicación en Slack Dado que deseo este bot sea privada para mi equipo, bastará con un bot personalizado.
Crear un Bot de Slack Personalizado
Aquí se puede crear un bot personalizado: https://my.slack.com/apps/A0F7YS25R-bots. Si ya está conectado a tu cuenta de Slack el de la izquierda Seleccione el botón de Añadir Configuración; en caso contrario, inicie sesión en su cuenta de parafina antes de proceder. Si no tienes una cuenta de parafina, usted puede registrarse gratis.
Esto le llevará a una nueva página donde deberá proporcionar un nombre de usuario para tu bot. Ingrese su ahora, que seguir pautas de nomenclatura de Slack Una vez haya seleccionado un nombre impresionante bot, pulse Agregar configuración de bot.
Después de que has creado correctamente tu bot, Slack te redirige a una página que permite la mayor personalización de tu bot. Te dejo esa parte a su uno mismo creativo. Lo único que necesita de esta página es el API Token que comienza con xoxb-
. Copiar este símbolo (token) en un lugar seguro para su uso posterior o simplemente deje esta página abierta hasta que necesitamos el token para la aplicación Python.
Configuración de Su Aplicación de Python
Según documentación oficial de Slack para el Kit de Desarrollador de Slack para Python, actualmente soporta la version 2.7. Hace mención a que la versión 3 se apoyará en un futuro cercano.
Ya tengo la version 2.7 instalado, así que voy a pegarlo con esa versión de Python por ahora. Si la instalación de Python ya está configurada y listo para entrar, puede pasar al siguiente paso; de lo contrario, por favor visite la página de Python Descargar y descargue la versión apropiada para su sistema operativo.
Para instalar el Kit de desarrollador de Slack, utilizo PyPi para simplificar la instalación del cliente de Slack. En algunos sistemas operativos, el comando de la pip
se puede ejecutar directamente desde un símbolo del sistema. Si no, tendría que hacer referencia a la ruta completa al programa pip
.
Por ejemplo, en mi sistema de Windows, ejecuté el siguiente comando para instalar el cliente de juego desde un símbolo del sistema (hace referencia a la ruta de acceso completa al archivo pip.exe): \Python27\Scripts\pip instalar slackclient
.
A continuación, tienes que elegir una ubicación para su aplicación. Disfruto usando GitHub, así que creé una carpeta principal de python
que contiene todas mis diferentes aplicaciones de Python. Dentro de esta carpeta, hice una subcarpeta llamada apropiadamente slackbot
.
Una vez que he elegido donde se celebrará mi solicitud, voy a guardar la base de mi aplicación en un archivo llamado slackbot.py
.
La Primera Llamada de API de Slack
Es el momento de poner los dedos en el teclado y conectar con holgura y hacer nuestra primera llamada a la API. Vamos a la derecha del código, y voy a explicar lo que sucede después de:
1 |
from slackclient import SlackClient |
2 |
|
3 |
slack_client = SlackClient("xoxb-*******************") |
4 |
|
5 |
api_call = slack_client.api_call("users.list") |
6 |
if api_call.get('ok'): |
7 |
users = api_call.get('members') |
8 |
for user in users: |
9 |
print user.get('name') |
El código comienza con la importación de la biblioteca de cliente de Slack, seguida de instanciar la clase SlackClient
con API Token de tu Bot Slack que guardó anteriormente. Asegúrese de reemplazar el token de ejemplo en este ejemplo con tu token.
El objeto de SlackClient
se almacena en una variable local denominada slack_client
que se utilizará para interactuar con Slack.
Usando el slack_client
, se hace una llamada a la API para obtener una lista de los usuarios de su equipo. Si tuvo éxito la llamada a la API, la lista de los miembros del equipo se almacena en la variable de users
. La variable de los users
es una matriz que, utilizando un bucle, imprime el nombre de cada miembro del equipo para la aplicación de consola.
Slack es compatible con diferentes tipos de interacciones con el sistema. El primero, que nos acaba de terminar, hizo una llamada a la API. Holgura ofrece muchos otros tipos de llamadas a la API: API Web, API de eventos, conversaciones API, API de mensajería de tiempo Real y SCIM API. La llamada de API que hicimos para recuperar la lista de usuarios aprovecha la API de SCIM.
En el siguiente ejemplo, demuestro cómo utilizar el sistema de mensajería de tiempo Real. Una vez que comenzamos el bot final del edificio, se utilizará el API de conversaciones enviar mensajes en respuesta a los comandos de a que nuestro bot responderá.
Conectar con el Sistema de Mensajería en Tiempo Real
El sistema RTM proporciona un gran poder porque holgura envía eventos que su aplicación puede manejar y responder inmediatamente a. Por supuesto, hay muchos eventos que tu bot no necesitar controlar cada evento. Para demostrar los muchos y diferentes eventos que ocurren simplemente en la conexión, en el ejemplo siguiente se dará salida a cada evento que se recibe.
Inmediatamente veamos el código para conectar y comenzar a recibir eventos de Slack:
1 |
from slackclient import SlackClient |
2 |
import time |
3 |
|
4 |
slack_client = SlackClient("xoxb-****************") |
5 |
|
6 |
if slack_client.rtm_connect(with_team_state=False): |
7 |
print "Successfully connected, listening for events" |
8 |
while True: |
9 |
print slack_client.rtm_read() |
10 |
|
11 |
time.sleep(1) |
12 |
else: |
13 |
print "Connection Failed" |
Al igual que el ejemplo anterior, este código comienza con la importación de la biblioteca de cliente de Slack y crea una instancia de la clase SlackClient
con el mismo API Token como antes. Este ejemplo también importa la biblioteca de tiempo que se utiliza más adelante en el código.
Con el SlackClient
creado con éxito, la siguiente línea de código hace una llamada al método rtm_connect
. Esto se hace con un if instrucción. Si la conexión falla por alguna razón, se genera un mensaje de error en la consola. Cuando es exitosa, un mensaje de éxito es impreso para hacernos saber que estamos conectados y listo para comenzar a interactuar con eventos de Slack.
Un sin fin mientras que entonces se inicia el bucle. Dentro de este bucle, yo llame al método rtm_read
de la biblioteca de cliente de Slack.
Los resultados de esta convocatoria se registran en la consola. Después de esto ocurre, la aplicación duerme durante 1 segundo antes de leer el próximo evento potencial de Slack A continuación es un ejemplo de lo que parece leyendo eventos en la primera conexión:
1 |
Successfully connected, listening for events |
2 |
[] |
3 |
[{u'type': u'hello'}] |
4 |
[{u'url': u'wss://lbmulti-yeo0.lb.slack-msgs.com/websocket/Rm8R-Q0PLxK_8UQmBo0Apru-AtL7qnICzeNazVUDQGUCnIY8N51kO07ZUw37jZc4KvXJlu4c1EWDNwTtrXkLzkwn0GBmak_RATHLSFVCCCcht0YLqlgZAS0-6cb1marGhznvmnQStgdW6rd3yub0CpCzmJdgIkRPgIOIB2JurYA=', u'type': u'reconnect_url'}] |
5 |
[{u'type': u'presence_change', u'user': u'U6RM1S17T', u'presence': u'active'}] |
6 |
[] |
7 |
[] |
Cuando se conecta el bot, tres eventos son enviados por la Slack como se ve arriba. Porque esto es en un tiempo del lazo, cuando no hay ningún caso, recibe una matriz vacía como se ve arriba con el vacío corchetes [].
Ahora que tenemos una comprensión básica de hacer una llamada a la API y conectar al sistema de mensajería de tiempo Real de juego, es el momento de construir un robot completamente funcional de Slack.
Mi Bot de Slack se escucha eventos usando el sistema RTM. Cuando recibe un evento de mensaje que se dirige a mi bot, mi aplicación responderá al usuario con una respuesta al comando que recibió.
Construyendo el Bot Slack
Para construir un bot completo, requiere un poco de código. Para ayudar a organizar y simplificar el código final, voy a dividir la funcionalidad en tres clases diferentes: Bot, eventos y comandos. Estas clases deben ser extensibles por su aplicación, mejorar la funcionalidad de su propio bot. Vamos a explorar el propósito de cada una de las tres clases diferentes:
- La clase de Bot se encargará de conectar con Slack y comenzará el tiempo bucle de eventos.
- La clase de evento es responsable de leer los acontecimientos recibidos de Slack, los análisis sólo trato con eventos de mensaje que apuntan directamente a nuestro bot. Cuando se recibe un mensaje, llamar a la clase de comando y enviar una llamada a la API con la respuesta de la clase de comando.
- La clase de comando recibirá el texto del evento y brindar un mensaje personalizado basado en el comando recibido. Este mensaje se enviará entonces a la clase de evento canal de Slack origina al canal de origen del mensaje.
Inicializando el Bot Slack
Anteriormente había mencionado que mi punto de entrada de aplicación Python se coloca en el archivo slackbot.py
. Este archivo contiene el mínimo para obtener la aplicación del balanceo que es instanciar la clase de Bot que controlará el resto del proceso:
1 |
import bot |
2 |
|
3 |
bot.Bot() |
Crear la Clase de Bot
La clase de Bot contiene el corazón del bot y configuración. Echemos un vistazo a toda la clase Bot que yo he colocado dentro de un archivo bot.py
:
1 |
import time |
2 |
import event |
3 |
from slackclient import SlackClient |
4 |
|
5 |
class Bot(object): |
6 |
def __init__(self): |
7 |
self.slack_client = SlackClient("xoxb-*****************") |
8 |
self.bot_name = "jamiestest" |
9 |
self.bot_id = self.get_bot_id() |
10 |
|
11 |
if self.bot_id is None: |
12 |
exit("Error, could not find " + self.bot_name) |
13 |
|
14 |
self.event = event.Event(self) |
15 |
self.listen() |
16 |
|
17 |
def get_bot_id(self): |
18 |
api_call = self.slack_client.api_call("users.list") |
19 |
if api_call.get('ok'): |
20 |
# retrieve all users so we can find our bot
|
21 |
users = api_call.get('members') |
22 |
for user in users: |
23 |
if 'name' in user and user.get('name') == self.bot_name: |
24 |
return "<@" + user.get('id') + ">" |
25 |
|
26 |
return None |
27 |
|
28 |
def listen(self): |
29 |
if self.slack_client.rtm_connect(with_team_state=False): |
30 |
print "Successfully connected, listening for commands" |
31 |
while True: |
32 |
self.event.wait_for_event() |
33 |
|
34 |
time.sleep(1) |
35 |
else: |
36 |
exit("Error, Connection Failed") |
El fichero empieza importando las librerías necesarias: tiempo, evento y SlackClient. A continuación se creará la biblioteca de eventos.
Con las bibliotecas de importados, ahora se crea la clase de Bot. Constructor de la clase dentro de la función __init__
establece algunas variables que se utilizarán durante el resto del código. Esto incluye el slack_client
, el bot_name
y el bot_id
.
El nombre del bot se utiliza para encontrar el ID del bot. El ID se utilizará más adelante para analizar eventos que buscan directamente el bot. Si la aplicación no puede encontrar el bot, la aplicación se sale con un error como que no se puede continuar sin el ID.
La clase de evento entonces se crea una instancia un poco más adelante en la clase. La última cosa que hace el constructor es llamar a la función de escuchar
, que conecta con el sistema RTM y comienza el bucle infinito a la espera de acontecimientos que el bot va a controlar.
La siguiente función, get_bot_id
, es muy similar al primer ejemplo que recorre los usuarios, esta vez encontrar el ID de nuestro bot por encontrar su nombre en la lista de usuarios y devolver el ID. En el caso de que no se puede encontrar el bot, no
se devuelve, que hará que el código anterior salir porque era incapaz de encontrar el bot.
La función final de la clase de Bot es la función de escuchar
antes mencionados. Esta función es muy similar al segundo ejemplo donde previamente conectado al sistema de RTM de holgura. La diferencia clave en este ejemplo es que él llama la función wait_for_event
que será explorado siguiente en el evento de la clase.
Esto completa la clase del Bot, lo que es responsable de crear el SlackClient y a partir del bucle infinito a la espera de acontecimientos. Él, sin embargo, no hace nada con esos eventos, dejando esa responsabilidad a la clase de evento.
La Clase de Evento
El propósito de la clase Event es leer cualquier evento devuelto por sistema RTM de holgura. Se examinará cada evento recibida un mensaje que contiene una referencia al ID. del Bot La siguiente es la clase de evento que he colocado dentro de un archivo event.py:
1 |
import command |
2 |
|
3 |
class Event: |
4 |
def __init__(self, bot): |
5 |
self.bot = bot |
6 |
self.command = command.Command() |
7 |
|
8 |
def wait_for_event(self): |
9 |
events = self.bot.slack_client.rtm_read() |
10 |
|
11 |
if events and len(events) > 0: |
12 |
for event in events: |
13 |
#print event
|
14 |
self.parse_event(event) |
15 |
|
16 |
def parse_event(self, event): |
17 |
if event and 'text' in event and self.bot.bot_id in event['text']: |
18 |
self.handle_event(event['user'], event['text'].split(self.bot.bot_id)[1].strip().lower(), event['channel']) |
19 |
|
20 |
def handle_event(self, user, command, channel): |
21 |
if command and channel: |
22 |
print "Received command: " + command + " in channel: " + channel + " from user: " + user |
23 |
response = self.command.handle_command(user, command) |
24 |
self.bot.slack_client.api_call("chat.postMessage", channel=channel, text=response, as_user=True) |
Esta clase comienza importando la clase final que se estudiarán, la clase de comando. El constructor de la clase de evento recibe un único parámetro: una referencia al objeto Bot. Se almacena en una variable que se puede acceder por las otras funciones de esta clase. Dentro de la función __init__
, se crea otra variable que crea una instancia de la clase de comando previamente importada.
La siguiente función, wait_for_event
, es la función que fue llamada por la función de escucha
de clase del Bot. Esta función Lee los eventos que se han recibido desde sistema de RTM de holgura. La función rtm_read()
devuelve una matriz de eventos. La función wait_for_event
chequea si el array contiene los eventos. Si lo hace, los eventos se coloca a través de y llaman a parse_event
de función interna del evento.
La función parse_event
recibe el evento como entrada. Procede a comprobar una propiedad en el evento denominada text
. Si esta propiedad existe, entonces comprueba que la propiedad text
contiene una referencia al ID. de nuestro Bot Cuando esta condición es true, esta función llama a la función final de esta clase, la función handle_event
.
Antes de llamar a la función handle_event
, la propiedad de text
utiliza el Python función split
, el separador de cadena está representada por el ID. del bot Esto convierte la propiedad text
en una matriz. El primer elemento de la matriz es la cadena que contiene el texto del bot ID. El segundo elemento contiene el resto del mensaje. Este elemento se pasa a la función handle_event
antes mencionados como el comando.
La función final, handle_event
, acepta tres propiedades: el usuario que envió el mensaje, el comando que se envía y el canal fue enviado en.
La función de handle_event
asegura que el mando y el canal contienen valores válidos. Cuando lo hacen, un mensaje de depuración amistoso se genera en la consola que indica lo que fue recibido, el canal fue enviado y usuario que lo envió.
Después del mensaje de depuración amigable, la función handle_event
llama a la función principal de la clase de comando antes mencionada. El resultado de esta función se utiliza la función handle_event
por hacer una llamada de API que los mensajes de la respuesta de la función de la clase de comando al canal que inició el evento.
Ahora veamos la clase de comando para ver cómo genera una respuesta personalizada basada en el comando recibido del usuario.
La Clase de Comando
Para completar nuestro bot, es el momento de crear la clase final, Comando, en un archivo de nombre command.py:
1 |
class Command(object): |
2 |
def __init__(self): |
3 |
self.commands = { |
4 |
"jump" : self.jump, |
5 |
"help" : self.help |
6 |
}
|
7 |
|
8 |
def handle_command(self, user, command): |
9 |
response = "<@" + user + ">: " |
10 |
|
11 |
if command in self.commands: |
12 |
response += self.commands[command]() |
13 |
else: |
14 |
response += "Sorry I don't understand the command: " + command + ". " + self.help() |
15 |
|
16 |
return response |
17 |
|
18 |
def jump(self): |
19 |
return "Kris Kross will make you jump jump" |
20 |
|
21 |
def help(self): |
22 |
response = "Currently I support the following commands:\r\n" |
23 |
|
24 |
for command in self.commands: |
25 |
response += command + "\r\n" |
26 |
|
27 |
return response |
Me gusta mucho cómo esta clase resultó porque proporciona una base sólida que es fácilmente extensible para manejar muchos más comandos que describí anteriormente.
El constructor a la clase de comando crea un diccionario de claves con un acompañamiento nombre de la función que se ejecutará cuando se recibe la orden de la clase de evento. En este ejemplo abreviado, el Diccionario de comandos
contiene dos comandos: saltar y ayudar. Este diccionario puede ampliarse para incluir otros comandos que desea manejar con su propio bot.
La siguiente función, handle_command
, es la función que se llama cuando un evento exitoso que contiene un mensaje dirigido a nuestro bot se llama a la función de handle_event
del evento clase.
La función handle_command
acepta dos parámetros: el usuario que envió el mensaje y el comando. La función comienza con la construcción de una cadena de respuesta que dirigirá un mensaje al usuario que envió el comando. La función comprueba entonces que el comando recibido es un comando válido en el Diccionario de comandos definidos en el constructor.
Cuando el comando es válido, se llama la función asociada a esa orden, anexar la cadena a la variable de respuesta
que creó anteriormente.
Si el comando no existe, la respuesta se agrega para indicar que el comando no es válido. También se pide la ayuda función de mando para ayudar
al usuario en la comprensión de lo que manda es compatibles con este bot.
Las funciones restantes, jump
y help
, generan una respuesta personalizada que se enviará al usuario que ha iniciado el comando.
Como ya he mencionado en el constructor, el Diccionario de comandos se puede ampliar con un nuevo comando. Para completar que proceso, una función de acompañamiento debe ser creada es llamado automáticamente mediante la función handle_command
.
Prueba del Slack Bot
Ahora que toda la codificación se completa, es hora de probar nuestro nuevo. Para empezar, debemos ejecutar nuestro script principal de Python: slackbot.py. En el símbolo del sistema, ejecute este script con el Python, por ejemplo python slackbot.py
.
Esto lanzará el bot y conectar al sistema de mensajería en tiempo Real de holgura. Con éxito, se debe imprimir nuestro mensaje de depuración a la consola que indica que nuestro bot flojo está listo para recibir comandos.
Para ejecutar un comando, nuestro bot debe ser invitado a un canal público o privado. Una vez que el bot en el canal, un usuario puede saber el bot para saltar o pedir ayuda. En mi caso yo diría: @jamietest jump
. Responde acertadamente el bot: @endyourif: Kris Kross te hará saltar salto
.
Este bot no se limita a un solo canal. Porque analiza el canal desde el mensaje de evento, puede manejar comandos de diversos canales.
Ahora es tu turno de darle tu bot un ir y ver lo que usted puede hacer que hacer!
Conclusión
Mi bot está ahora completa. Que te he demostrado el poder de crear un bot flojo. Con las clases múltiples (Bot, evento y comando) cada uno manejando una sola preocupación, la clase de comando puede ampliarse para manejar muchos más comandos.
Para ver el código fuente completo, he creado un Repositorio de GitHub.
Recuerde, no dude en ver lo que tenemos disponibles para la venta y para el estudio en Envato Market y no dude en hacer cualquier pregunta y proporcionar sus valiosos comentarios con el avance a continuación.
El cielo es verdaderamente interminable en cómo este bot puede ser extendido. Debajo está una lista corta de ideas para ampliar la configuración inicial de las clases:
- Para agregar un nuevo comando, sería crear una nueva función siguiendo el modelo de las funciones de
jump
yhelp
dentro de la clase de comando. Cuando la función se crea, debe agregarse al Diccionario de comandos disponibles. - Otra gran manera de mejorar aún más tu bot es extender la funcionalidad de la función
parse_event
en la clase de evento. En la actualidad, esta función explícitamente busca un evento de mensaje que contiene el identificador de nuestro Bot en el texto. Esta función podría ampliarse aún más para buscar otros eventos, comoteam_join
. Este evento podría llamar un nuevo comando (en la clase de comando) que proporciona al nuevo miembro del equipo con las políticas y documentos de incorporaciones de la empresa. - Por último, si usted está interesado en crear una aplicación personalizada o el deseo de crear tus propios Comandos de Slack, puede explorar creando una aplicación personalizada y agregar un usuario bot a la aplicación. Muchos de los ejemplos de código funcionan con cualquier tipo de bot.
Espero que has disfrutado este artículo sobre como crear un Bot de parafina usando Python. ¡Utilice el siguiente formulario de comentarios para que los demás lectores sepan cómo han extendido los ejemplos anteriores para crear un Bot de Slack muy robusto!