”LoginFailure: Improper token has been passed” / TokenInvalid
Qué significa: Discord rechazó el token con el que tu bot inicia sesión. El mensaje exacto depende de la librería:- discord.py:
discord.errors.LoginFailure: Improper token has been passed. - discord.js v14:
Error [TokenInvalid]: An invalid token was provided. - discord.js antiguo:
Error [TOKEN_INVALID]: An invalid token was provided. - otras librerías: un HTTP
401 Unauthorizedal iniciar sesión.
- El token fue regenerado o revocado en el Discord Developer Portal. Generar un token nuevo invalida al instante el anterior en todos los lugares donde se usaba.
- El string del token tiene espacios o comillas extra copiadas por accidente.
- El código está leyendo la variable de entorno equivocada, o la variable no está definida en Square Cloud.
- Ve al Developer Portal → tu aplicación → Bot → Reset Token.
- Actualiza el token en las variables de entorno de la aplicación (en el dashboard, Ajustes → Variables de entorno, o con
squarecloud app env set). Nunca subas el token en un archivo que se incluya en el zip. - Verifica que no haya espacios o comillas de más alrededor del valor.
- Actualiza la librería (
discord.js@latestopip install -U discord.py). - Reinicia la aplicación para que cargue el nuevo valor.
”Used disallowed intents” / Message Content Intent
Qué significa: el bot inicia sesión y aparece online, pero ignora todos los mensajes, o el gateway rechaza la conexión con “used disallowed intents”. Por qué ocurre: desde 2022, Message Content es un intent privilegiado. Sin habilitarlo explícitamente en ambos lugares, el contenido del mensaje llega vacío (o la conexión del gateway se rechaza si tu código declara un intent que no está habilitado para la aplicación). Cómo solucionarlo, en ambos lugares:- Discord Developer Portal → tu aplicación → Bot → Privileged Gateway Intents → habilita Message Content Intent.
- Decláralo también en el código:
- Reinicia la aplicación.
Una vez que un bot supera los 100 servidores, los intents privilegiados (incluido Message Content) también requieren aprobación de Discord, solicitada desde la misma página del Developer Portal.
Conexión de Lavalink cerrada con código 1006
Qué significa: el cliente de Lavalink del bot cierra el WebSocket de forma anormal con el código 1006, a menudo precedido por “Unexpected server response: 400”. Por qué ocurre: esto es una incompatibilidad de versiones. Lavalink v4 está basado en REST y es incompatible con un wrapper de cliente construido para v3, por lo que el handshake falla y el socket se cierra con 1006. Cómo solucionarlo:- Alinea la versión del wrapper de cliente de Lavalink de tu bot con la versión mayor del servidor Lavalink (cliente v3 con servidor v3, cliente v4 con servidor v4).
- En Square Cloud, el servidor Lavalink en sí enlaza el puerto
80, pero tu bot debe conectarse a él a través del edge en el puerto443consecure: true. - Reinicia tanto la aplicación de Lavalink como la del bot después de corregir la incompatibilidad de versiones.
El bot queda offline después de funcionar en local
Qué significa: el bot inicia sesión correctamente cuando lo ejecutas en tu máquina, pero queda offline (o se reinicia repetidamente) una vez desplegado. Por qué ocurre, más comúnmente:- Una conexión inestable a nivel de gateway sin manejo de reconexión.
- Versiones de dependencias conflictivas o incompatibles entre lo que probaste en local y lo que está en tu archivo de dependencias.
- El bot se detuvo por superar su RAM o su CPU, o por saturar la API de Discord. En ese caso los logs muestran una línea
[SQUARE-SHIELD]y recibes un correo: consulta la tabla de estados.
- Revisa primero los logs de la aplicación en el dashboard, muestran la razón real del fallo.
- Agrega manejadores de errores para que un error transitorio no termine el proceso:
process.on("unhandledRejection", ...)yclient.on("error", ...)en discord.js, manejo equivalente en discord.py. - Agrega
AUTORESTART=truea tusquarecloud.apppara que Square Cloud reinicie el bot después de un fallo. Viene desactivado por defecto y solo reinicia en los casos que se listan enAUTORESTART. Mantiene al bot vivo ante errores transitorios, pero nunca soluciona un token inválido, un error de sintaxis o una dependencia faltante: esos todavía necesitan una corrección en el código. - Vigila los límites de tasa (429) de la API de Discord: el límite global es de aproximadamente 50 solicitudes/segundo por token de bot, con buckets más estrictos por ruta (crear/editar canal permite aproximadamente 2 cambios cada 10 minutos por canal). Cachea de forma agresiva, usa una cola asíncrona que respete los encabezados
X-RateLimit-Remaining/X-RateLimit-Reset-After, y usa webhooks para envíos masivos. Un bot que sigue saturando Discord se detiene conABUSE_REQUESTS.
Guías relacionadas
- Tutorial de hosting de bots de Discord: configura y haz deploy de un bot desde cero.
- Variables de entorno: guarda el token fuera de tu código.
- La aplicación no inicia: errores de subida, módulos faltantes y otros fallos al arrancar.

