Objetivos de aprendizaje
Después de leer este artículo podrás:
- Escribir un bot discord.py 2.x listo para producción
- Preparar requirements.txt y variables de entorno para el deploy
- Verificar que el bot está en línea y corregir los errores más comunes
En esta página
- ¿Qué necesitas antes de hospedar?
- ¿Cómo escribir un bot de discord.py que funcione en producción?
- ¿Cómo declarar las dependencias?
- ¿Cómo pasar el token sin ponerlo en el código?
- ¿Cómo poner el bot en línea?
- ¿Cómo verificar que el bot funciona?
- ¿Qué errores comunes tumban un bot de discord.py?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
Un bot hecho con discord.py es un script de Python que abre una conexión con el Gateway de Discord y se queda en ejecución. Hospedar el bot es decidir dónde vive ese proceso, para que siga activo cuando cierras el editor o apagas el equipo.
Esta guía cubre el camino completo: código, dependencias, token, deploy y verificación. Los ejemplos usan la API de discord.py 2.x; consulta la versión actual en PyPI.
¿Qué necesitas antes de hospedar?#
- Una versión de Python que aún tenga soporte. La documentación de discord.py indica el mínimo exigido. Prefiere una versión actual.
- Una aplicación en el Discord Developer Portal, con el bot creado y el token copiado.
- El bot invitado a tu servidor de pruebas.
- Un lugar donde el proceso corra las 24 horas. Si aún comparas opciones, mira cómo dejar un bot de Discord en línea 24/7 y cuánto cuesta hospedar un bot de Discord.
¿Cómo escribir un bot de discord.py que funcione en producción?#
Crea un entorno virtual e instala la biblioteca:
python3 -m venv .venv
source .venv/bin/activate # en Windows: .venv\Scripts\activate
pip install -U discord.pyAhora el bot.py (discord.py 2.x). Usa un slash command, que no necesita el intent privilegiado message_content, y lee el token del entorno:
import os
import discord
from discord.ext import commands
class MiBot(commands.Bot):
async def setup_hook(self) -> None:
# Registra los slash commands en Discord al iniciar
await self.tree.sync()
intents = discord.Intents.default()
bot = MiBot(command_prefix=commands.when_mentioned, intents=intents)
@bot.event
async def on_ready() -> None:
print(f"En línea como {bot.user}")
@bot.tree.command(name="ping", description="Muestra la latencia del bot")
async def ping(interaction: discord.Interaction) -> None:
await interaction.response.send_message(f"Pong! {round(bot.latency * 1000)} ms")
bot.run(os.environ["DISCORD_TOKEN"])Dos detalles importan para el hospedaje. Primero, os.environ["DISCORD_TOKEN"] lanza KeyError si la variable no existe, lo cual es bueno: el bot ni siquiera arranca con una configuración incompleta. Segundo, bot.run() ya configura el log y bloquea hasta que el proceso termina, así que no necesitas un bucle ni asyncio.run.
Sincronizar los comandos en cada inicio sirve para un bot pequeño. Si reinicias el bot con frecuencia, ejecuta la sincronización solo cuando cambien los comandos.
¿Cuándo necesito el intent message_content?#
Solo si el bot lee el texto de los mensajes, como en comandos con prefijo (!ping). El quickstart de discord.py, que responde a $hello, advierte en un comentario que el ejemplo "requiere el intent message_content" y lo activa con intents.message_content = True. Es un intent privilegiado: actívalo en la pestaña Bot del Developer Portal, en Privileged Gateway Intents, y también en el código. Activarlo solo de un lado no basta. Por encima de 100 servidores, la documentación advierte que usar intents privilegiados exige la verificación del bot.
¿Cómo declarar las dependencias?#
El hospedaje necesita saber qué instalar. Crea un requirements.txt en la raíz del proyecto, junto a bot.py:
discord.py>=2.7,<3Si el bot reproduce audio en canales de voz, la documentación indica instalar el extra: discord.py[voice]. Fija de la misma forma la versión de cualquier otra biblioteca que uses (base de datos, peticiones HTTP). Genera la lista de tu entorno con pip freeze > requirements.txt cuando todo funcione.
¿Cómo pasar el token sin ponerlo en el código?#
Usa una variable de entorno. En la terminal, en Linux y macOS:
export DISCORD_TOKEN="pega_aqui_el_token"
python3 bot.pyEn PowerShell: $env:DISCORD_TOKEN="pega_aqui_el_token". Si usas un archivo .env en local, nunca lo subas al repositorio: agrégalo al .gitignore. El concepto y su razón de ser están en qué son las variables de entorno. Si el token se filtra, restablécelo en el Developer Portal; el anterior deja de funcionar al instante.
¿Cómo poner el bot en línea?#
En cualquier hospedaje los pasos son los mismos: subir bot.py y requirements.txt, definir DISCORD_TOKEN e iniciar con python bot.py. Lo que cambia es quién mantiene vivo el proceso:
| Dónde | ¿Sobrevive si apagas tu PC? | Qué mantienes tú |
|---|---|---|
| Tu computadora | No | Todo, y el bot cae con la máquina |
| VPS | Sí | Sistema, actualizaciones, supervisor (systemd, Docker) |
| Plataforma de hospedaje de bots | Sí | El código y la memoria |
En un VPS, ejecuta el bot bajo systemd con Restart=always o en un contenedor Docker con --restart unless-stopped, como muestra la guía de bot en línea 24/7. Ejecutar python bot.py en una sesión SSH no basta: el proceso muere al cerrar la sesión. Para entender qué pasa con tu PC, lee bot de Discord sin conexión cuando se apaga el PC. La idea general de enviar el código para que corra en otra máquina está en qué es el deploy.
¿Cómo verificar que el bot funciona?#
- Mira los logs de inicio. Debes leer la línea
En línea como NombreDelBot. - En el servidor, confirma que el bot aparece en línea en la lista de miembros.
- Escribe
/pingy confirma la respuesta. Los slash commands pueden tardar unos instantes en aparecer; si no aparecen, reinicia el cliente de Discord. - Mata el proceso y comprueba si el hospedaje lo levanta de nuevo. Sin eso, el "24/7" es puro optimismo.
¿Qué errores comunes tumban un bot de discord.py?#
discord.errors.LoginFailure: Improper token has been passed.El token es incorrecto, tiene espacios de más o fue restablecido. Cópialo de nuevo en el Developer Portal y revisa la variable.discord.errors.PrivilegedIntentsRequired. El código pide un intent privilegiado (comomessage_content) que no está activado en el portal. Actívalo o quítalo del código.ModuleNotFoundError: No module named 'discord'. Las dependencias no se instalaron en el entorno donde corre el bot. Revisa elrequirements.txt.KeyError: 'DISCORD_TOKEN'. La variable no se definió en el hospedaje.- Un archivo llamado
discord.py. La documentación advierte: no llames a tu scriptdiscord.py, porque choca con la biblioteca. Usabot.py. - Un bot que cae por poca RAM. El proceso se mata cuando la memoria se agota. Mira la lista completa en por qué un bot de Discord se queda sin conexión.
- Respuestas lentas o fallos por exceso de peticiones. Mira el error 429 de Discord.
Cómo hacerlo en Square Cloud#
En Square Cloud, tu bot.py corre en un contenedor aislado con el runtime de Python, siempre encendido y sin modo de suspensión. El reinicio automático viene activado en el deploy desde el panel y trae el bot de vuelta cuando el proceso termina con error. Tú mismo haces el deploy: subida de ZIP en el panel, CLI, GitHub (un push despliega) o la extensión de VS Code. Al iniciar, la plataforma instala las dependencias con pip install -r requirements.txt. discord.py funciona como cualquier otra biblioteca de Gateway, con sharding y voz, y FFmpeg está disponible en el contenedor.
El token entra como variable de entorno de la aplicación, en el panel, la API o la CLI; el cambio se aplica en el próximo reinicio, sin rebuild. El archivo de configuración squarecloud.app es opcional: el panel lo genera en el deploy con runtime, memoria y archivo principal, y escribirlo en la raíz del proyecto es la alternativa. Los logs aparecen en tiempo real en el panel, la CLI y la app móvil.
Todos los planes son de pago y se cobran en reales. El Hobby cuesta R$12,49 al mes, con 1 GB de RAM compartido entre tus aplicaciones y un mínimo de 256 MB por aplicación en segundo plano, como un bot. Mira los detalles en hospedaje de bots de Discord.
Hosting de bots
Tu bot en línea 24/7, con reinicio automático
Preguntas frecuentes
¿Qué versión de Python necesita discord.py?
Consulta la versión mínima en la documentación oficial de discord.py. En un proyecto nuevo, usa una versión de Python que aún reciba actualizaciones de seguridad.
¿Necesito el intent message_content para que el bot funcione?
Solo si el bot lee el texto de los mensajes, por ejemplo con comandos con prefijo. Los slash commands no lo necesitan. Es un intent privilegiado: actívalo en el Developer Portal y también en el código.
¿Puedo hospedar un bot de discord.py en mi PC?
Sirve para probar, pero el bot queda sin conexión cuando el equipo se apaga, se suspende o pierde internet. Para estar en línea las 24 horas, usa una máquina que no se apague, como un VPS o una plataforma de hospedaje.
¿Cómo paso el token del bot sin ponerlo en el código?
Define una variable de entorno, como DISCORD_TOKEN, y léela con os.environ en Python. Así el token no llega al repositorio y puedes cambiarlo sin editar el código.
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.