Objetivos de aprendizaje
Después de leer este artículo podrás:
- Crear un bot de discord.js que lee el token de una variable de entorno
- Registrar un slash command y probar el bot en local
- Llevar el bot a un hosting y comprobar que está en línea
Un bot de discord.js es un proceso de Node.js que abre una conexión con el Gateway de Discord y responde a eventos. El bot aparece en línea mientras ese proceso está activo y conectado; si el proceso se detiene, el bot queda desconectado para todos.
Esta guía va de una carpeta vacía a un bot en línea, con código completo de discord.js v14 y módulos ES. Si aún no creaste la app en Discord, cómo crear tu primer bot de Discord explica esa parte en detalle.
¿Qué necesitas antes de empezar?#
- Node.js en una versión LTS. La guía oficial de discord.js recomienda la versión LTS activa de Node.js, y el calendario oficial muestra cuál es.
- Una app en el Portal de Desarrolladores de Discord, con el bot creado y el token copiado.
- Un servidor de pruebas donde puedas invitar al bot.
El token es la contraseña del bot. Mira cómo obtenerlo y guardarlo en token del bot de Discord. De aquí en adelante siempre viene de una variable de entorno llamada DISCORD_TOKEN.
¿Cómo armas el proyecto?#
Crea la carpeta e instala la biblioteca:
mkdir mi-bot && cd mi-bot
npm init -y
npm install discord.jsEn package.json agrega "type": "module" para usar import. Luego crea un archivo .env (y agrégalo al .gitignore):
DISCORD_TOKEN=pega_el_token_aqui
CLIENT_ID=id_de_la_aplicacion
GUILD_ID=id_del_servidor_de_pruebasNode.js carga ese archivo solo con la opción --env-file, sin paquetes extra. Existe desde la versión 20.6 y es estable desde la 24.10, según la documentación de Node.js.
¿Cómo escribes el código del bot?#
Crea index.js. Este bot usa solo el intent Guilds, suficiente para slash commands, y responde al comando /ping:
import { Client, Events, GatewayIntentBits } from "discord.js";
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (readyClient) => {
console.log(`En línea como ${readyClient.user.tag}`);
});
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === "ping") {
await interaction.reply("Pong!");
}
});
client.login(process.env.DISCORD_TOKEN);Si el bot necesita leer el texto de los mensajes, deberás activar el intent privilegiado MessageContent en el Portal y en el código. Es el tropiezo más común de quien viene de comandos con prefijo, y se explica en error de intents en el bot de Discord.
¿Cómo registras el slash command?#
Encender el bot no crea el comando. Hay que enviarlo a la API de Discord una vez, y de nuevo cada vez que cambie su definición. Crea deploy-commands.js:
import { REST, Routes, SlashCommandBuilder } from "discord.js";
const commands = [
new SlashCommandBuilder().setName("ping").setDescription("Responde con Pong!"),
].map((command) => command.toJSON());
const rest = new REST().setToken(process.env.DISCORD_TOKEN);
await rest.put(
Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
{ body: commands },
);
console.log(`${commands.length} comando(s) registrado(s).`);Registrar por servidor es lo recomendado para probar. Cuando los comandos estén listos, cambia la ruta por Routes.applicationCommands(process.env.CLIENT_ID) para que valgan en todos los servidores donde está el bot, como explica la guía de discord.js.
Para que la invitación funcione, genera la URL en OAuth2 del Portal con los scopes bot y applications.commands.
¿Cómo pruebas antes de hospedar?#
Registra el comando y enciende el bot:
node --env-file=.env deploy-commands.js
node --env-file=.env index.jsLa terminal debe mostrar En línea como NombreDelBot. En tu servidor escribe /ping y comprueba que llega la respuesta. Si el bot está en línea, pero el comando no aparece, vuelve al paso de registro. Si el bot nunca se conecta, el token es incorrecto o fue restablecido.
¿Dónde hospedar el bot?#
Tu computadora sirve para desarrollar, pero el bot se cae cuando la apagas. Para mantenerse en línea, el proceso debe correr en otra máquina siempre encendida:
- VPS: instalas Node.js, configuras un supervisor como pm2 o systemd y te encargas de actualizaciones y firewall. El paso a paso está en cómo mantener un bot de Discord en línea 24/7.
- Plataforma de hosting de bots: subes el código y defines las variables; el entorno Node.js ya existe. Suele ser más rápido de configurar.
Para estimar la memoria de tu bot, mira cuánta RAM necesita un bot de Discord, y para comparar precios, cuánto cuesta hospedar un bot de Discord.
¿Qué errores aparecen al hospedar?#
Error [TokenInvalid]: An invalid token was provided.: la variableDISCORD_TOKENno llegó al proceso. Tu.envlocal no existe en el hosting salvo que lo subas, así que define la variable en el panel.Used disallowed intents: el código pide un intent privilegiado que no está activo en el Portal.- El proceso termina sin error: el archivo principal es incorrecto, o una excepción no controlada detuvo Node.js. Lee los logs y revisa por qué tu bot de Discord se desconecta.
- Un comando aparece dos veces: el mismo comando se registró por servidor y de forma global. Regístralo solo por una de las dos vías.
Cómo hacerlo en Square Cloud#
En Square Cloud, el bot corre en un contenedor aislado y siempre encendido, con reinicio automático (activado por defecto en el deploy desde el panel) cuando el proceso termina con error. Tú haces el deploy por ZIP en el panel, CLI, GitHub o la extensión de VS Code.
- Comprime el proyecto en un ZIP (
index.js,package.json, sinnode_modules) y súbelo en el panel; al iniciar, la plataforma ejecutanpm install. El archivo de configuraciónsquarecloud.appes opcional: el panel lo genera con el runtime, la memoria y el archivo principal, o tú lo escribes en la raíz del proyecto. - Elige Node.js como runtime e
index.jscomo archivo principal. Cada aplicación en segundo plano, como un bot, usa como mínimo 256 MB del pool de RAM del plan. - Define
DISCORD_TOKENen las variables de entorno de la aplicación. El cambio aplica en el siguiente reinicio, sin rebuild. - Sigue los logs en tiempo real en el panel, la CLI o VS Code y confirma la línea
En línea como ....
Los planes son de pago: Hobby, a R$12,49 al mes, incluye 1 GB de RAM y 1 vCPU. Mira los detalles en hosting de bots de Discord en Square Cloud.
Hosting de bots
Tu bot en línea 24/7, con reinicio automático
Preguntas frecuentes
¿Qué versión de Node.js debo usar con discord.js?
Usa la versión LTS activa de Node.js, como recomienda la guía oficial de discord.js. Cumple el mínimo que discord.js v14 declara en npm y recibe correcciones durante más tiempo.
¿Necesito el intent MessageContent para que el bot funcione?
No para slash commands. Con el intent Guilds basta. MessageContent es privilegiado y solo hace falta si el bot debe leer el texto de mensajes normales.
¿Puedo poner el token directamente en el código?
No. Cualquiera que vea el código puede controlar el bot. Lee el token de una variable de entorno y, si se filtra, genera otro en el Portal de Desarrolladores.
¿Por qué no aparece mi slash command en Discord?
El comando debe registrarse en la API de Discord, y es un paso distinto de encender el bot. Ejecuta el script de registro y comprueba que invitaste al bot con el scope applications.commands.
Más en Bots
Ver los 33 artículos- ¿Cuánto cuesta hospedar un bot de Discord?El costo de hospedar un bot de Discord depende de la RAM, el tiempo en línea, la base de datos y los servicios externos. Aprende a estimar el tuyo.
- Correr un bot en el celular (Termux) o en tu PC vs hospedarloUn bot en tu PC o celular (Termux) se cae cuando el equipo se apaga, se suspende o pierde la red. Compara las tres opciones y cuándo sirve cada una.
- Por qué tu bot de Discord se apaga o aparece offlineUn bot de Discord aparece offline cuando el proceso se cae, el token es inválido, falta una intent o se acaba la memoria. Diagnostica y corrige cada causa.
- Cómo hospedar un bot de Telegram 24/7Para mantener un bot de Telegram en línea 24/7, ejecuta el proceso en un servidor siempre encendido con long polling o webhook. Código y errores comunes.