Objetivos de aprendizaje
Después de leer este artículo podrás:
- Crear la app y el token del bot en el Portal de Desarrolladores de Discord
- Escribir, registrar y probar un slash command con discord.js
- Poner el bot en línea y comprobar que funciona
En esta página
- ¿Qué necesitas antes de empezar?
- ¿Cómo creas la app y el token en el Portal?
- ¿Cómo armas el proyecto?
- ¿Cómo escribes el código del bot?
- ¿Cómo registras y pruebas el slash command?
- ¿Qué errores aparecen en el primer bot?
- ¿Cómo mantienes el bot en línea todo el tiempo?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
Un bot de Discord es un programa que se conecta a Discord con un token y reacciona a eventos: un comando escrito, un mensaje, la entrada de un miembro. No vive dentro de Discord. Se ejecuta en tu computadora o en un servidor, así que solo está en línea mientras ese proceso esté corriendo.
Crear el primer bot tiene dos partes: configurar la app en el Portal de Desarrolladores y escribir el código. Esta guía cubre las dos y termina con el bot en línea, usando JavaScript con discord.js v14, la biblioteca más usada para esto.
¿Qué necesitas antes de empezar?#
- Una versión actual de Node.js. La guía oficial de discord.js recomienda la versión LTS activa de Node.js; el calendario oficial muestra cuál es. Comprueba la tuya con
node --version. - Una cuenta de Discord y un servidor tuyo para probar. Para invitar un bot necesitas el permiso Gestionar servidor en él.
- Un editor de texto y una terminal.
¿Cómo creas la app y el token en el Portal?#
- Abre el Portal de Desarrolladores de Discord y haz clic en New Application. Ponle nombre y confirma.
- En la página de la app, copia el Application ID (pestaña General Information). Ese es tu
CLIENT_ID. - Abre la pestaña Bot y haz clic en Reset Token. Copia el token enseguida, porque solo se muestra una vez. Si lo pierdes, genera otro.
- No confundas el token con el client secret, que es una cadena más corta y no sirve para el bot.
El token es la contraseña del bot: quien lo tiene controla el bot. Nunca lo pongas en el código ni en un repositorio. El artículo sobre el token del bot de Discord explica cómo guardarlo y qué hacer si se filtra.
Para el GUILD_ID, activa el Modo desarrollador en Ajustes de usuario, Avanzado. Luego haz clic derecho en el ícono de tu servidor y elige la opción para copiar su ID (el paso a paso está en el soporte de Discord).
¿Cómo invitas el bot a tu servidor?#
En el Portal, abre OAuth2 y usa el generador de URL:
- Marca los scopes bot y applications.commands.
- Elige los permisos que necesita el bot. El
/pingde esta guía no necesita ninguno. - Copia la URL generada, ábrela en el navegador y elige tu servidor de pruebas.
El bot aparece en la lista de miembros como desconectado. Solo se conectará cuando el código esté corriendo.
¿Cómo armas el proyecto?#
Crea la carpeta, instala la biblioteca y habilita módulos ES en el package.json:
mkdir mi-bot && cd mi-bot
npm init -y
npm pkg set type=module
npm install discord.jsCrea un archivo .env junto al package.json y agrega .env al .gitignore:
DISCORD_TOKEN=pega_el_token_aqui
CLIENT_ID=id_de_la_aplicacion
GUILD_ID=id_del_servidor_de_pruebasNode.js lee este archivo con la opción --env-file, sin paquetes extra, como muestra la documentación de Node.js.
¿Cómo escribes el código del bot?#
Crea index.js. El bot usa solo el intent Guilds, suficiente para slash commands, y responde a /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);La estructura sigue la guía oficial de discord.js: crea el cliente, avisa cuando conecta, escucha interacciones e inicia sesión con el token.
¿Cómo registras y pruebas el slash command?#
Escribir el if de /ping no crea el comando en Discord. Debes enviar su definición a la API una vez, y de nuevo cada vez que cambie. 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).`);Para probar, registra los comandos solo en tu servidor. La guía de discord.js indica que hay un límite diario de creación de comandos, así que no registres en cada arranque del bot. Cuando los comandos estén listos, cambia la ruta a Routes.applicationCommands(process.env.CLIENT_ID) para que valgan en todos los servidores.
¿Cómo pruebas el bot en local?#
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, y el bot aparece en línea en tu servidor. Escribe /ping y comprueba la respuesta Pong!.
¿Qué errores aparecen en el primer bot?#
Error [TokenInvalid]: An invalid token was provided.: el token está vacío o es incorrecto. Verifica que.envesté en la carpeta correcta, que pasaste--env-file=.envy que no copiaste el client secret.- El comando no aparece en Discord: no ejecutaste
deploy-commands.js, elGUILD_IDes de otro servidor, o la invitación no tenía el scopeapplications.commands. Integration requires code grant(en guías antiguas,Bot requires a code grant): desactiva la opción Requires OAuth2 Code Grant en la pestaña Bot del Portal.Used disallowed intents: el código pide un intent privilegiado que no está activo en la pestaña Bot del Portal.- El bot se cae al cerrar la terminal: es lo esperado. El proceso debe correr en una máquina que no se apague.
Si el bot está en línea pero no responde, mira bot de Discord que no responde.
¿Cómo mantienes el bot en línea todo el tiempo?#
Tu computadora sirve para desarrollar, pero el bot se cae cada vez que la computadora se apaga o pierde la conexión. Hay dos caminos para un bot 24/7:
- VPS: instalas Node.js, configuras un supervisor como pm2 o systemd y te encargas de actualizaciones y firewall. Los pasos están en cómo dejar un bot en línea 24/7.
- Plataforma de hospedaje de bots: subes el código y defines las variables de entorno; el entorno de Node.js ya existe.
Para estimar la memoria de tu bot, mira cuánta RAM necesita un bot. El proceso completo de hospedaje está en cómo hospedar un bot de discord.js.
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 con un ZIP en el panel, la CLI, GitHub o la extensión de VS Code.
- Comprime el proyecto con
index.jsypackage.jsonen la raíz del ZIP, sin el.envy sinnode_modules(al iniciar, la plataforma ejecutanpm install). - Súbelo desde el panel. El archivo
squarecloud.appes opcional: el panel lo genera con el runtime, la memoria y el archivo principal, o puedes escribirlo en la raíz del proyecto. - Elige el runtime Node.js e
index.jscomo archivo principal. Cada aplicación de fondo, 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 se aplica en el siguiente reinicio. - Ejecuta
deploy-commands.jsuna vez en tu computadora, como antes, y sigue los logs en tiempo real hasta que aparezcaEn línea como ....
Los planes son de pago: el Hobby cuesta desde R$12,49 al mes, con 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
¿Necesito saber programar para crear un bot de Discord?
Sí, lo básico. Esta guía usa JavaScript con Node.js y unas 30 líneas de código, en dos archivos. Si sabes ejecutar un archivo con Node.js y editar texto, puedes seguirla.
¿Qué lenguaje uso para el primer bot?
JavaScript con discord.js y Python con discord.py son las opciones más comunes y tienen la documentación más completa. Elige el que ya conoces, porque los pasos en el Portal son los mismos.
¿Por qué mi bot está en línea pero el comando no aparece?
Encender el bot no crea los slash commands. Hay que registrarlos en la API de Discord con un script aparte, y el bot debe haberse invitado con el scope applications.commands.
¿El bot necesita intents privilegiados?
No para slash commands. El intent Guilds basta. Los privilegiados, como MessageContent, solo hacen falta para leer el texto de mensajes normales y deben activarse en el Portal.
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.
- Cómo mantener tu bot de Discord en línea 24/7Para mantener un bot de Discord en línea 24/7, ejecuta el proceso en una máquina siempre encendida con reinicio automático. Compara PC, VPS con pm2 o systemd.
- 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.