NapNodes

← Guías de Bots de Discord

Bots de Discord · actualizada el 23 de octubre de 2026

Mi bot de Discord no responde (o sale desconectado): causas y soluciones

Casi siempre es una de cinco cosas: el programa del bot no está encendido, el token no vale, falta el intent de contenido de mensajes (Message Content Intent), el bot no tiene permiso en ese canal o Discord lo está frenando (error 429). La consola te dice cuál: aquí tienes cada error y su arreglo, en discord.py y en discord.js.

Primero, mira la consola

La terminal donde arrancas el bot (o la «Consola» del panel, si lo tienes alojado) es lo primero que hay que mirar. Si el bot no llega a escribir tu «Conectado como…», no se ha conectado, y el error de justo encima dice por qué. Si sí lo escribe y aun así no contesta, el problema está en los intents, en los permisos o en tu código.

Un consejo: copia el error tal cual, en inglés. Las secciones de abajo llevan los textos exactos que escriben discord.py 2.7 y discord.js 14 para buscarlos rápido.

¿Prefieres no montarlo tú? Hosting de bots de Discord desde 1,50 € al mes, sin permanencia y con devolución íntegra en 72 horas. O crea un bot de Discord gratis, sin tarjeta.

El bot sale desconectado: el programa no está encendido

Un bot solo está «en línea» mientras su programa está en marcha. Si lo arrancas en tu ordenador, se desconecta al cerrar la terminal, al apagar o suspender el PC o si se va la conexión. No es un fallo de tu código: hace falta que el programa esté encendido en algún sitio.

En plataformas gratis pensadas para webs (Replit, Render…), el programa se duerme si nadie visita su página, y un bot no recibe visitas: por eso se desconecta solo al rato (por qué pasa y opciones gratis que sí lo dejan encendido). Para tenerlo siempre encendido, mira la guía de hosting para tu bot.

Si el bot se cae y se reinicia sin parar, arregla el error antes de dejarlo así: Discord permite 1000 inicios de sesión (IDENTIFY) por bot cada 24 horas, y al pasarse cierra todas sus sesiones, cambia el token y te avisa por correo.

Error de token: «Improper token has been passed» o «TokenInvalid»

discord.py escribe «discord.errors.LoginFailure: Improper token has been passed.» y discord.js «Error [TokenInvalid]: An invalid token was provided.». Las dos dicen lo mismo: el token que lee tu código no es el bueno. discord.js también da TokenInvalid si el token llega vacío, que es lo que pasa cuando el .env no está en la carpeta o la variable se llama de otra forma.

Causas típicas: se copió con un espacio o con comillas de más; se pulsó «Reset Token» en el portal (el token anterior deja de valer en ese momento); o el token se publicó en un repositorio público de GitHub, que busca tokens de Discord en el código público y avisa a Discord para que pueda anularlo.

  1. Saca un token nuevo

    En discord.com/developers/applications, tu aplicación → «Bot» → «Reset Token». Cópialo entero; solo se enseña una vez.

  2. Pégalo en el .env

    DISCORD_TOKEN=el-token, sin comillas ni espacios. El .env tiene que estar en la misma carpeta que el bot (y fuera de cualquier repositorio público).

  3. Reinicia el bot

    El token solo se lee al arrancar. Si el bot está alojado, sube el .env nuevo y reinícialo.

Está conectado pero no lee los mensajes: Message Content Intent

Si tu bot usa comandos con prefijo (!ping) o lee lo que escribe la gente, necesita el intent de contenido de mensajes. Sin él, Discord le manda los mensajes con el texto vacío: el bot está en línea, recibe el mensaje y no ve «!ping», así que no contesta. Hay tres excepciones: los mensajes que manda el propio bot, los mensajes directos y los que lo mencionan.

Hay que activarlo en dos sitios: en el portal de desarrolladores y en tu código. Con 100 servidores o más el bot tiene que estar verificado y Discord tiene que aprobar el intent; para un bot pequeño, basta con el interruptor. Los comandos con barra no necesitan este intent.

En discord.py, si usas commands.Bot con prefijo y te falta, el aviso es «Privileged message content intent is missing, commands may not work as expected.». Así queda un bot mínimo que lee mensajes en cada librería:

app.py (discord.py)
import os

import discord
from dotenv import load_dotenv

load_dotenv()

intents = discord.Intents.default()
intents.message_content = True  # y activarlo en el portal
client = discord.Client(intents=intents)


@client.event
async def on_ready():
    print(f"Conectado como {client.user}")


@client.event
async def on_message(message: discord.Message):
    if message.author.bot:
        return
    if message.content == "!ping":
        await message.channel.send("pong")


client.run(os.environ["DISCORD_TOKEN"])
index.js (discord.js)
require("dotenv").config();
const { Client, Events, GatewayIntentBits } = require("discord.js");

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent, // y activarlo en el portal
  ],
});

client.once(Events.ClientReady, (c) => console.log(`Conectado como ${c.user.tag}`));

client.on(Events.MessageCreate, async (message) => {
  if (message.author.bot) return;
  if (message.content === "!ping") await message.reply("pong");
});

client.login(process.env.DISCORD_TOKEN);
  1. Actívalo en el portal

    discord.com/developers/applications → tu aplicación → «Bot» → «Privileged Gateway Intents» → «Message Content Intent», y guarda los cambios.

  2. Pídelo en el código

    En discord.py, intents.message_content = True; en discord.js, GatewayIntentBits.MessageContent junto a Guilds y GuildMessages, como en los ejemplos.

  3. Reinicia el bot

    Los intents se piden al conectarse: hasta que no reinicias, no cambia nada.

Error de intents: PrivilegedIntentsRequired o DisallowedIntents

Es el caso contrario: tu código pide un intent privilegiado (contenido de mensajes, miembros o presencias) que no está activado en el portal, y Discord cierra la conexión. discord.py lo dice con «PrivilegedIntentsRequired: Shard ID None is requesting privileged intents that have not been explicitly enabled in the developer portal» y discord.js con «Error [DisallowedIntents]: Privileged intent provided is not enabled or whitelisted.».

Arreglo: en el portal, «Bot» → «Privileged Gateway Intents», activa los mismos que pides en el código (Message Content, Server Members o Presence) y reinicia. Si no los necesitas, quítalos del código: mejor pedir solo lo que usa tu bot.

No contesta en un canal: permisos del canal o del rol

Si el bot contesta en un canal y en otro no, son permisos. Para escribir necesita «Ver canales» y «Enviar mensajes»; para contestar en hilos, también «Enviar mensajes en hilos»; para mandar tarjetas (embeds), «Insertar enlaces». Los permisos de un canal pueden quitarle lo que su rol le da: mira en «Editar canal» → «Permisos» que ni el rol del bot ni @everyone tengan esos permisos denegados.

Si lo invitaste con pocos permisos, saca un enlace nuevo con los que necesita en la calculadora de permisos de bot (en castellano, con lo que deja hacer cada uno) y ábrelo: no hace falta echar al bot antes. Y si tu bot gestiona roles, solo puede dar o quitar los que estén por debajo del suyo: sube su rol en la lista de roles del servidor.

El comando con barra dice que la aplicación no ha respondido

Discord da 3 segundos para contestar a un comando con barra. Si tu código tarda más (consulta una web, una base de datos…) o no contesta, Discord enseña un error de que la aplicación no ha respondido, aunque el bot esté en línea. Si va a tardar, contesta primero con «pensando…» y luego edita la respuesta: en discord.py, await interaction.response.defer() y después await interaction.followup.send(…); en discord.js, await interaction.deferReply() y después await interaction.editReply(…). Tienes 15 minutos para la respuesta final.

También sale si el comando está publicado pero tu código no lo atiende (por ejemplo, lo borraste del código y sigue registrado en Discord). Y si lo que pasa es que el comando ni siquiera aparece al escribir /, es otro problema: los comandos de barra no aparecen.

Límites de Discord: error 429 (rate limit)

Discord limita cuántas peticiones hace un bot: 50 por segundo en total, y menos en cada tipo de acción (mandar mensajes a un canal, cambiar roles…). Al pasarse, contesta con un 429 y un tiempo de espera. discord.py y discord.js esperan solos y reintentan; discord.py lo avisa en la consola con «We are being rate limited… responded with 429. Retrying in … seconds.».

Un 429 de vez en cuando es normal. Si salen muchos, tu bot está haciendo de más: mensajes en bucle, cambiar el nombre de un canal cada pocos segundos, mandar mensajes directos en masa… Además, si una dirección IP acumula 10.000 peticiones fallidas (401, 403 o 429) en 10 minutos, Discord la bloquea un tiempo y el bot no puede ni conectarse. Arreglo: corta el bucle y no reintentes a mano lo que ya reintenta la librería.

Si tu bot está en NapNodes

El panel te deja encenderlo, ver la consola y subir el código; los errores de tu código, como en cualquier hosting, los arreglas tú. Cómo se monta todo, en la guía de hosting para tu bot. Lo que hay que mirar:

  1. Mira la «Consola»

    Enseña lo que escribe tu bot: el «Conectado como…» o el error que lo para. Con eso y las secciones de arriba sabes qué tocar.

  2. Comprueba que está encendido

    Si sale «Apagado», pulsa «Encender». El bot gratis hay que renovarlo cada 7 días con «Encender» o «Renovar ahora»; si no se renueva, se apaga (no se borra) y en Discord sale desconectado. Los planes de pago no se renuevan.

  3. Revisa lenguaje, fichero de inicio y dependencias

    En «Configuración»: el «Lenguaje» (Node.js o Python) tiene que ser el de tu bot, y el fichero de inicio, el tuyo (index.js o app.py por defecto). Las librerías se instalan al arrancar desde package.json o requirements.txt: si falta discord.js o discord.py ahí, la consola dirá que no encuentra el módulo.

  4. El .env, en «Archivos»

    Si traes el código de GitHub sin el .env (bien hecho), súbelo en «Archivos» junto al fichero de inicio, y reinicia.

Preguntas frecuentes

¿Por qué mi bot de Discord sale desconectado?

Porque su programa no está en marcha: se cerró la terminal, se apagó el PC, la plataforma lo durmió o se paró por un error. Mira la consola: si hay un error, dice cuál. Para tenerlo siempre encendido hace falta alojarlo en un servidor.

Mi bot está en línea pero no responde a los comandos con «!»

Le falta el Message Content Intent: actívalo en el portal («Bot» → «Privileged Gateway Intents») y en el código (intents.message_content = True en discord.py, GatewayIntentBits.MessageContent en discord.js), y reinicia.

¿Qué significa «Improper token has been passed»?

Que el token que usa tu bot no vale: mal copiado, vacío o regenerado con «Reset Token». Saca uno nuevo en el portal, pégalo en el .env sin comillas y reinicia.

¿Qué es el error 429 en un bot de Discord?

Que Discord lo está frenando por hacer demasiadas peticiones. La librería espera y reintenta sola; si pasa a menudo, busca un bucle en tu código que mande mensajes o cambie cosas sin parar.

El bot contesta en un canal y en otro no, ¿por qué?

Por los permisos de ese canal: necesita «Ver canales» y «Enviar mensajes», y un canal puede denegárselos aunque su rol los tenga. Revísalo en «Editar canal» → «Permisos».

¿Lo montamos?

Hosting de bots de Discord desde 1,50 € al mes, sin sobreventa: tu RAM es solo tuya. Y si quieres empezar sin pagar, tienes un bot de Discord gratis, sin tarjeta.

Herramienta gratis: Permisos de un bot de Discord. Marca los permisos de tu bot en castellano y sal con el número y el enlace de invitación; o pega un número y mira qué permisos da.

Más guías de Bots de Discord

Todas las guías de Bots de Discord, ordenadas →