Crea un Bot de Slack Usando Node.js en 7 Pasos

¿Tienes dos horas? Eso suele ser suficiente para crear un bot de Slack si sabes dónde están los puntos de fricción. Usa Node.js, el marco Bolt de Slack y OAuth para autenticar. Luego, despliega en un VPS o función sin servidor para que tu bot funcione 24/7 sin interrupciones.

Crea un Bot de Slack Usando Node.js en 7 Pasos — NewsTide Foto: Ant Rozetsky en Unsplash

Para quién es esto: Fundadores solitarios que gestionan pequeños equipos (de una a cinco personas) que desean automatizar flujos de trabajo en Slack. Piensa en recordatorios de reuniones, alertas de clientes, notificaciones de despliegue, todo sin pagar por Zapier o contratar a un desarrollador backend.

Paso 1: Crea una Aplicación de Slack y Configura Permisos

Comienza visitando api.slack.com/apps y haz clic en "Crear nueva aplicación". Elige "Desde cero", dale un nombre a tu bot y selecciona tu espacio de trabajo de prueba.

Dirígete a OAuth & Permissions en la barra lateral. Agrega estos bajo "Bot Token Scopes":

  • chat:write — para enviar mensajes
  • channels:history — para leer mensajes de canales públicos
  • app_mentions:read — se activa cuando se menciona con @
  • commands — habilita comandos de barra

Instala la aplicación en tu espacio de trabajo. Slack te dará un Bot User OAuth Token, que comienza con xoxb-. Cópialo para el Paso 3.

En Event Subscriptions, activa "Enable Events". Guarda este lugar para el Paso 5 para agregar una Request URL después de que tu servidor esté activo.

Paso 2: Configura Tu Proyecto Node.js

# slack text Foto: Scott Webb en Unsplash

Crea un nuevo directorio e inicializa npm:

mkdir slack-bot
cd slack-bot
npm init -y

Instala el marco Bolt de Slack y dotenv para variables de entorno:

npm install @slack/bolt dotenv

Crea un archivo .env en la raíz de tu proyecto:

SLACK_BOT_TOKEN=xoxb-your-token-here
SLACK_SIGNING_SECRET=your-signing-secret

Obtén tu secreto de firma de la página de Basic Information de la aplicación de Slack bajo "App Credentials."

Crea un .gitignore:

node_modules
.env

Paso 3: Escribe el Código del Servidor del Bot

Desarrolla app.js:

require('dotenv').config();
const { App } = require('@slack/bolt');

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  socketMode: false, // Usaremos el modo HTTP para producción
  port: process.env.PORT || 3000
});

// Responder a menciones de la aplicación
app.event('app_mention', async ({ event, client }) => {
  try {
    await client.chat.postMessage({
      channel: event.channel,
      text: `Hola <@${event.user}>, estoy vivo y funcionando en Node.js.`
    });
  } catch (error) {
    console.error(error);
  }
});

// Ejemplo de comando de barra
app.command('/status', async ({ command, ack, respond }) => {
  await ack();
  await respond(`Tiempo de actividad del servidor: ${process.uptime()} segundos`);
});

// Escuchador de mensajes para palabras clave específicas
app.message('deploy', async ({ message, say }) => {
  await say({
    text: `Despliegue detectado en <#${message.channel}>`,
    thread_ts: message.ts
  });
});

(async () => {
  await app.start();
  console.log('⚡️ La aplicación Bolt está funcionando en el puerto', process.env.PORT || 3000);
})();

Este bot hace tres cosas:

  1. Responde a menciones con @.
  2. Maneja un comando de barra /status.
  3. Escucha mensajes de "deploy" y responde en el hilo.

Prueba localmente:

node app.js

En este momento, tu bot no recibirá eventos. Slack no puede alcanzar localhost. Necesitarás una URL pública.

Paso 4: Expón Tu Servidor Local con ngrok

Instala ngrok o la versión de npm:

npm install -g ngrok
ngrok http 3000

Ngrok proporciona una URL pública como https://abc123.ngrok.io. Cópiala, asegurándote de usar la versión HTTPS.

Regresa a la página de Event Subscriptions de la aplicación de Slack. Agrega tu URL de ngrok seguida de /slack/events:

https://abc123.ngrok.io/slack/events

Slack envía una solicitud de desafío. Si tu servidor está activo, responde automáticamente y muestra "Verificado."

Bajo "Subscribe to bot events," agrega:

  • app_mention
  • message.channels

Haz clic en "Save Changes."

Navega a Slash Commands y crea uno nuevo:

  • Comando: /status
  • Request URL: https://abc123.ngrok.io/slack/events
  • Descripción corta: "Verificar estado del bot"

Slack te pedirá que reinstales la aplicación.

Ahora prueba en Slack. Escribe /status o menciona a tu bot. Las respuestas deberían aparecer.

Paso 5: Agrega Funcionalidad Real — Ejemplo de Integración API

La mayoría de los bots obtienen datos de APIs externas. Aquí te mostramos cómo obtener estrellas de un repositorio de GitHub y enviar esos datos a Slack:

Instala axios:

npm install axios

Inserta esto en app.js:

const axios = require('axios');

app.command('/github', async ({ command, ack, respond }) => {
  await ack();

  const repo = command.text; // por ejemplo, "facebook/react"
  if (!repo) {
    return respond('Uso: `/github owner/repo`');
  }

  try {
    const { data } = await axios.get(`https://api.github.com/repos/${repo}`);
    await respond({
      blocks: [
        {
          type: 'section',
          text: {
            type: 'mrkdwn',
            text: `*${data.full_name}*\n⭐ ${data.stargazers_count} estrellas\n🍴 ${data.forks_count} bifurcaciones\n${data.description || 'Sin descripción'}`
          }
        }
      ]
    });
  } catch (error) {
    await respond('Repositorio no encontrado o error de API.');
  }
});

Reinicia tu bot y luego ejecuta /github facebook/react en Slack. Espera una tarjeta formateada que muestre las estadísticas del repositorio.

Paso 6: Despliega en Producción

Ngrok es suficiente para pruebas, pero se detiene cuando se cierra la terminal. Despliega en un VPS o plataforma sin servidor para que funcione continuamente.

Opción A: Desplegar en un Droplet de DigitalOcean de $5

Conéctate a tu servidor por SSH:

ssh root@your-server-ip

Instala Node.js:

curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs

Clona tu repositorio (o copia tus archivos), instala dependencias y ejecuta con PM2:

npm install pm2 -g
pm2 start app.js --name slack-bot
pm2 startup
pm2 save

Apunta tu dominio o usa la IP del servidor. Actualiza la Request URL de Slack a http://your-server-ip:3000/slack/events.

Opción B: Desplegar en Vercel o Railway

Vercel no soporta conexiones WebSocket persistentes, pero el modo HTTP funciona. Crea vercel.json:

{
  "version": 2,
  "builds": [{ "src": "app.js", "use": "@vercel/node" }],
  "routes": [{ "src": "/(.*)", "dest": "/app.js" }]
}

Despliega:

npm i -g vercel
vercel --prod

Actualiza la Request URL de Slack a tu dominio de Vercel.

Railway simplifica el despliegue de bots: soporta procesos de larga duración. Sube tu repositorio a GitHub, conéctalo a Railway, agrega variables de entorno en el panel y despliega. Railway genera automáticamente una URL pública.

Paso 7: Asegura Tu Bot y Maneja Límites de Tasa

Slack impone límites de tasa: típicamente una solicitud por segundo para la mayoría de los métodos. Si tu bot envía mensajes en masa, usa una cola:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

async function sendBulkMessages(channels, message) {
  for (const channel of channels) {
    await app.client.chat.postMessage({
      token: process.env.SLACK_BOT_TOKEN,
      channel,
      text: message
    });
    await delay(1100); // Slack permite ~1 msg/sec
  }
}

Verifica las solicitudes. Bolt maneja esto por defecto, pero asegúrate de que tu secreto de firma esté configurado.

Mantén tu token de bot en variables de entorno, no en el código. Si los tokens terminan en GitHub, gíralos de inmediato en la configuración de tu aplicación de Slack.

Lo Que Nadie Te Dice Sobre los Bots de Slack

La API de Eventos de Slack tiene un tiempo de espera de 3 segundos. Llamar a una API externa lenta causará errores. Usa ack() de inmediato y luego maneja las respuestas de forma asíncrona:

app.command('/slow-api', async ({ command, ack, respond }) => {
  await ack(); // Reconocer dentro de 3 segundos

  // Realiza trabajo lento aquí
  const result = await someSlowApiCall();
  await respond(result);
});

El Modo Socket existe pero tiene inconvenientes. El Modo Socket te permite ejecutar bots sin una URL pública, útil para el desarrollo. Sin embargo, necesita una conexión WebSocket, lo que no es adecuado para plataformas sin servidor. El modo HTTP es mejor para producción a menos que uses un VPS.

Bolt puede oscurecer la depuración. Si los eventos no se activan, verifica los errores de entrega en las Suscripciones de Eventos de Slack. Se muestran las solicitudes fallidas y las cargas útiles, lo que es mucho más útil que los registros de consola.

Los comandos de barra no soportan subcomandos de forma nativa. Analiza command.text manualmente. Divídelo en segmentos y enrútalo según sea necesario:

app.command('/mybot', async ({ command, ack, respond }) => {
  await ack();
  const [action, ...args] = command.text.split(' ');

  if (action === 'deploy') {
    // manejar despliegue
  } else if (action === 'status') {
    // manejar estado
  } else {
    await respond('Comando desconocido. Intenta `/mybot deploy` o `/mybot status`.');
  }
});

El Block Kit de Slack es excesivo hasta que no lo es. Comienza con texto plano. ¿Necesitas botones, modales o formato enriquecido? Entonces, usa Block Kit Builder. Copia bloques JSON directamente en tu código cuando sea necesario.

Errores Comunes

Instalar la aplicación sin los alcances correctos. Si tu bot no puede leer mensajes, probablemente te perdiste channels:history. ¿No puedes publicar? Te falta chat:write. Siempre verifica "OAuth & Permissions" y reinstala después de agregar alcances.

No manejar subtipos de mensajes. Slack envía eventos para ediciones, eliminaciones y mensajes de bots. Filtra por message.subtype para evitar bucles infinitos:

app.message(async ({ message, say }) => {
  if (message.subtype) return; // Ignorar ediciones, mensajes de bots, etc.
  await say('Recibido un mensaje de un usuario real');
});

Codificar IDs de canal. Los IDs de canal pueden cambiar si se recrea un canal. Usa nombres de canal o permite que los usuarios configuren canales con comandos de barra.

Olvidar rotar tokens. Un token de bot filtrado permite que cualquiera se haga pasar por tu bot. Rota los tokens en "OAuth & Permissions" de Slack y actualiza tu .env de inmediato.

Preguntas Frecuentes

¿Necesito un plan de pago de Slack para construir bots?

No. Los bots funcionan en el nivel gratuito de Slack. Estás limitado a 10 integraciones en total, pero un solo bot cuenta como una, sin importar sus características. Los planes de pago desbloquean integraciones ilimitadas y un historial de mensajes más largo, pero ninguno afecta la funcionalidad del bot.

¿Puedo usar TypeScript en lugar de JavaScript?

Sí. Instala @types/node y ts-node, renombra app.js a app.ts, y agrega tipos para Bolt. El SDK de Slack incluye definiciones de TypeScript. Compila usando tsc o ejecuta con ts-node app.ts. TypeScript mejora la autocompletación y reduce errores en tiempo de ejecución en la mayoría de los bots de producción.

¿Cómo puedo probar mi bot sin spamear a mi equipo?

Crea un canal privado o un espacio de trabajo de Slack separado para el desarrollo. Invita solo a tu bot. Prueba todos los eventos y comandos allí. Slack te permite crear hasta 10 espacios de trabajo en el plan gratuito. Usa uno solo para pruebas de bots.

¿Cuál es la diferencia entre la API de Eventos y RTM?

La API de Eventos utiliza solicitudes HTTP. Slack envía eventos a la URL pública de tu servidor. RTM (Real Time Messaging) utiliza WebSockets y mantiene una conexión persistente con Slack. RTM está en desuso. Usa la API de Eventos para nuevos bots, o el Modo Socket si no se puede exponer una URL pública.

Conclusión

La conclusión es: ahora tienes un bot de Slack funcional que escucha menciones, maneja comandos de barra y obtiene datos de API. Despliega en un VPS de $5 o Railway, y luego implementa los flujos de trabajo que tu equipo realmente necesita. Deja de pagar por herramientas de automatización que hacen lo mismo.

Próximo paso: Identifica una tarea manual que realices diariamente en Slack, como recordatorios de standup, notificaciones de despliegue o alertas de clientes, y automatízala. Escribe el controlador en app.js, pruébalo en un canal privado y envíalo hoy. Para obtener más información sobre la automatización de tareas, consulta nuestro artículo sobre Configuración paso a paso de Mailchimp para fundadores solitarios o explora Las mejores herramientas CRM para hackers independientes en 2026.


Nota editorial: Este artículo fue elaborado con asistencia de IA y revisado por Javier Valencia. A lo largo del texto se distinguen los hechos verificados de la opinión editorial. Las fuentes externas enlazadas son independientes de NewsTide.

Nota editorial: Este artículo ha sido elaborado con asistencia de inteligencia artificial y revisado por Javier Valencia para garantizar su precisión y relevancia. Conoce nuestra política editorial.

Más sobre Indie Hacking

← Volver al inicioVer todos de Indie Hacking