Slack es una herramienta cada vez más popular para empresas y equipos que necesitan comunicarse al instante. Si bien en algunos casos puede considerarse una interrupción diaria, también tiene un gran potencial de automatización, ya que ofrece docenas de integraciones para mantener todo en un solo lugar y poco a poco está reemplazando a los correos electrónicos.
Hay muchas formas de integrar tus sistemas con Slack; la plataforma incluso proporciona un bot de marca que le permite enviar recordatorios o mensajes en su espacio de trabajo digital. Y para obtener aún más mejoras de colaboración, pruebe estas opciones de almacenamiento en la nube.
Slack ofrece varias entidades que podrían considerarse 'bots':
ganchos web, que permiten publicar mensajes de otras aplicaciones en Slack, pero son una forma de comunicación unidireccional,aplicaciones, para integraciones avanzadas (con otras aplicaciones),usuarios de robots, Más sobre ellos en breve.
En este tutorial veremos particularmente a los 'usuarios de bots', cómo programarlos (consulte nuestra guía de los mejores editores de código para hacerle la vida más fácil) y hacer que se ajusten a sus necesidades. Esto presupone que tienes acceso a un espacio de Slack donde puedes agregar integraciones de aplicaciones. Si aún no eres parte de uno, puedes crearlos libremente.
A continuación, creamos una aplicación NodeJS para publicar y responder mensajes particulares en un canal de Slack. Usamos el módulo 'slackbots', que es un contenedor para la API de mensajería en tiempo real de Slack.
¿También estás interesado en crear un sitio web? Elija un creador de sitios web brillante y el mejor servicio de alojamiento web que lo acompañe.
01. Configuración del código
Este tutorial asume que tienes instalado Node. Si no, hazlo ahora. Luego descargue los recursos que necesitará. Le hemos proporcionado un punto de partida y un marco para el tutorial.
En todo momento, utilizamos módulos como 'slackbots' y 'node-slack-upload'. Se pueden obtener ejecutando el comando de instalación.
instalación npm
02. Configuración floja
Dale un nombre de usuario a tu bot e invítalo a tu canal (Crédito de la imagen: Diseñador web)
Estamos utilizando la integración de “usuario de bot” para Slack. Para hacerlo, necesitamos obtener un token yendo a 'https://.slack.com/apps/A0F7YS25R-bots' y hacer clic en “Agregar configuración”.
Elija un nombre de usuario para su bot (podemos anular esto mediante programación en una etapa posterior) y confirme.
Invita al bot al canal deseado.
Al crear un usuario bot, obtendrás un token en el siguiente formato:
xoxb-000000-000000-x0x0xxXxX0XXxx0x
Copie el token para el siguiente paso.
03. Variables ambientales
Usamos variables de entorno (un archivo '.env') para evitar codificar y revelar tokens y claves secretos, como el token de Slack que hemos generado y el nombre del canal en su espacio de trabajo privado de Slack.
Continúe y complete el archivo '.env' con su token y el nombre del canal al que invitó al usuario del bot.
SLACK_TOKEN=xoxb- SLACK_CHANNEL=
04. Parámetros del robot
El siguiente paso nos lleva a 2 archivos: 'index.js', que veremos brevemente, y 'bin/lib/bot.js', donde se lleva a cabo la mayor parte de nuestro desarrollo. En el archivo de índice, creamos una instancia de nuestro bot dándole un nombre, que es 'WDMBot'.
En 'bot.js' controlamos los parámetros de cada instancia con nombre, token, etc.
//index.js const bot = require('./bin/lib/bot').init ('WDMBot'); //bot.js const botParams = { icon_emoji: ':robot_face:', as_user: false }; dejar bot; function initBot(botName) { bot = new slackbot({ token: proceso.env.SLACK_TOKEN, nombre: botName }); }
05. Publicar en el canal
Ahora puedes hacer que tu bot envíe mensajes (Crédito de la imagen: Diseñador web)
Eche un vistazo a la función 'enviar mensaje'. Usamos el método 'postTo'. Esto manejará la publicación en cualquier tipo de canal, público o privado. Si solo deseas publicar en canales privados, puedes usar 'postToGroup' (o 'postToChannel' para uno público). Para enviar nuestro primer mensaje, podemos agregar código en 'initBot'.
function initBot(botName) { bot = /* ver arriba */ sendMessage('¡Estoy aquí!'); } // Ahora ejecuta 'npm start'
06. Parámetros de bot personalizados
Deberías haber notado que aparece un mensaje de WDMBot en tu canal. Vale la pena señalar que en 'botParams', 'as_user' está configurado en falso, lo que nos permite anular el nombre y la imagen. Si se establece en verdadero, utilizará el nombre y la imagen que configuró al obtener el token.
Podrías cambiar el emoji del bot a una imagen como esta:
const botParams = { icon_url: 'https://pbs.twimg.com/profile_images/976112552081010688/ WLlQvj8D_400x400.jpg', as_user: false };
07. Eventos del canal
Configure su bot para escuchar mensajes (Crédito de la imagen: Diseñador web)
Publicar mensajes es útil, pero para que el bot sea más interactivo, debemos poder identificar publicaciones de otros usuarios en el canal. Escuchemos el evento del mensaje y luego veamos qué sucede cuando escribimos un canal. Deberíamos ver que se registran diferentes tipos de mensajes, como 'user_typing' o 'message'.
function initBot(botName) { bot = /* ver arriba */ bot.on('message', data => { console.log(data); }); }
08. Responder a los mensajes entrantes.
A continuación, queremos responder a los mensajes entrantes del tipo 'mensaje', y quizás a una frase o palabra clave concreta, para evitar responder absolutamente a todo. Nos aseguramos de comparar cadenas en minúsculas si queremos hacer coincidir una frase exacta. También podríamos ver si un mensaje 'incluye()' una palabra en particular.
bot.on('mensaje', datos => { if(data.type === 'mensaje') { if(data.text.toLowerCase() === '¿dónde estás?') { sendMessage('I' ¡estoy aquí!'); } } });
09. Restringir a usuarios “humanos”
Los mensajes enviados por usuarios de bots tienen varias propiedades, como un subtipo de 'bot_message' y un bot_id. Es posible que quieras restringir la respuesta solo a mensajes publicados por humanos para evitar bucles infinitos de robots respondiéndose a sí mismos o entre sí, si su respuesta incluye una de las palabras clave que estás escuchando.
bot.on('mensaje', datos => { if(data.type === 'mensaje' && datos. subtipo!== 'bot_message') { if(data.text.toLowerCase(). incluye('hola' )) { sendMessage('¡Hola, soy un robot!');
10. Respuesta personalizada
Para dar una respuesta más personalizada, puedes aprovechar la identificación de usuario del mensaje al que estás respondiendo. Slack convertirá automáticamente una identificación en el nombre de usuario cuando esté incluida en las etiquetas '<@>'. Identificar a quién estás respondiendo puede resultar útil, especialmente si varios miembros del canal interactúan con tu bot simultáneamente.
bot.on('mensaje', datos => { if(data.type === 'mensaje' && datos. subtipo!== 'bot_message') { if(data.text.toLowerCase(). incluye('hola' )) { sendMessage('Hola <@${data.user} > ¡Soy un robot!');
Si está buscando aprender las últimas habilidades creativas y prácticas para llevar el trabajo, la carrera o la agencia de su cliente al siguiente nivel, únase a nosotros en Generate CSS, nuestra conferencia centrada en CSS para diseñadores y desarrolladores web. Saber más aquí. Utilice el código de oferta especial DISEÑADOR WEB2 ¡Para un 10% de descuento en entradas! (Crédito de la imagen: Getty/Futuro)
11. Actualizar respuestas
Los bots también pueden editar sus respuestas. Pero sólo los suyos. Entonces, si esperaba un robot que detecte errores tipográficos y corrija sus mensajes automáticamente cuando detecte un error, eso no es posible con la configuración actual.
Para actualizar el mensaje, definimos una nueva función y un booleano global que usaremos en nuestra demostración.
dejar cambiarRespuesta = false; función updateMessage(messageParams) { bot.updateMessage(messageParams.channel, messageParams.ts, messageParams.text, botParams); }
12. Cambia el mensaje
Actualiza los mensajes que envía el bot. (Crédito de la imagen: Diseñador web)
Intentemos actualizar el texto que nos envía el bot. En este caso, en un evento de mensaje, necesitamos responder a un mensaje de bot entrante, por lo que cumpliremos esa condición para la actualización y también usaremos la marca de tiempo del mensaje original para actualizarlo. Esto es para que Slack pueda identificar qué mensaje actualizar, en caso de que se publiquen otros en el medio.
if(data.type === 'message' && data.subtype!== 'bot_message' && data.text) { if(data.text.includes('update')) { sendMessage('Actualizaré en 5 segundos'); cambiarRespuesta = verdadero; } } if(data.type === 'mensaje' && data.subtype === 'bot_message' && changeReply) { changeReply = false; setTimeout(() => { updateMessage({ canal: data.channel, ts: data.ts, texto: 'He actualizado'}); }, 5000); }
13. Mensajes efímeros
Los mensajes efímeros solo los ve un usuario y se pueden eliminar (Crédito de la imagen: Diseñador web)
Los mensajes efímeros son, como su nombre indica, temporales. Además, solo son visibles para un usuario y este puede eliminarlos. Ese tipo de mensajes pueden resultar útiles como consejo o recordatorio que no es necesario que permanezca permanentemente.
if(data.text.toLowerCase().includes(' hr ')) { ephemeralMessage({ canal: data.channel, usuario: data.user, text: 'Si necesita comunicarse con RR.HH., su correo electrónico es hr@mycompany. es' }); } // La función que estamos llamando function ephemeralMessage(messageParams) { bot.postEphemeral(messageParams.channel, messageParams.user, messageParams.text, botParams); }
14. Búsqueda de usuarios
Diferentes métodos tomarán parámetros de usuario ligeramente diferentes (ya sea ID o nombre, que es diferente de display_name y real_name). Sin embargo, sólo la identificación del usuario está disponible en los eventos de mensajes. Por lo tanto, podemos implementar una búsqueda de nombre de usuario obteniendo todos los usuarios y haciendo coincidir su ID.
función asíncrona getUserName(userID) { return await bot.getUsers() .then(data => { let member = data.members.find (user => { return user.id === userID; }); return member.name ; }) .catch(err => console.log(err)); }
15. Enviar mensajes directos
Con la nueva búsqueda de usuarios, ahora podemos enviar mensajes directos a un usuario, cuando los mensajes efímeros simplemente no son suficientes. Tenga en cuenta que los mensajes directos se consideran un canal nuevo/diferente, con un ID diferente al del canal original. También podrías implementar una búsqueda de canales de la misma manera que lo hicimos anteriormente con el usuario.
//En el evento del mensaje if(data.text.toLowerCase().includes('bot')) { sendDM({ usuario: data.user, text: '¿Cómo puedo ayudar?' }); } // La función que llamamos función asíncrona sendDM(messageParams) { let user = await getUserName (messageParams.user); return bot.postMessageToUser(usuario, mensaje Params.text, botParams, (err, datos) => { console.log(err) }); }
16. Responde con una imagen
Los usuarios de bots también tienen permisos para subir archivos e imágenes a un canal. Sin embargo, esta funcionalidad no está cubierta por los 'slackbots', por lo que tenemos que crear una instancia de un nuevo cargador, como se demuestra a continuación. También prepare una carpeta de 'activos' en la raíz de su proyecto, con algunas imágenes.
Preparemos una llamada a 'sendImage()', definida en el siguiente paso.
//en initBot() cargador = new slackUpload(process.env. SLACK_TOKEN); //en el evento del mensaje if(data.text.includes('image')) { if(!data.upload) { /*En este caso, no hay ningún subtipo de mensaje, por lo que verificamos que no esté activado por un mensaje anterior subir mensaje*/ let image = data.text.split(' ')[1]; sendImage('Esta es la imagen que querías', imagen); } }
17. La función de carga de archivos.
Utilice el cargador y el sistema de archivos para cargar imágenes. (Crédito de la imagen: Diseñador web)
Subimos imágenes usando el cargador y el módulo FileSystem (fs). Siempre que el mensaje de un usuario tenga el formato “imagen ” y que dicho archivo exista en la carpeta 'activos', la imagen se leerá y se cargará. Si no, le devolvemos un mensaje normal (incluso podría ser efímero).
función sendImage(mensaje, imagen) { uploader.uploadFile({ file: fs.createReadStream(path.join (__dirname, '../../assets/${image}')), mimetype: 'image/*', tipo de archivo: '*', título: imagen, comentario inicial: mensaje, canales: canal }, (err, datos) =>…