Para alojar un bot de python-telegram-bot 24/7, ejecútalo en una máquina que se quede encendida en lugar de tu PC: un VPS Linux con un servicio systemd que lo arranque de nuevo tras un fallo o un reinicio, o un plan de bots de PlayNHost (desde US$1.99 al mes, consulta alojamiento de bots de Telegram), donde subes tu código, pegas el token y pulsas Start. En nuestra prueba, un bot con python-telegram-bot 22.8 usó unos 44 MB de memoria en reposo; nuestro plan de bots más pequeño, STARTER, tiene 0.5 GB. Ambas vías usan long polling: run_polling() pregunta a Telegram por mensajes nuevos, así que el bot no necesita una dirección pública. Los pasos en PlayNHost:
- En Telegram, envía
/newbota @BotFather y copia el token que te da. - En alojamiento de bots de Telegram, haz clic en Crear servidor en un plan. En la ventana del pedido, responde ¿Para qué plataforma es tu bot? con Telegram y elige Python.
- Abre tu servidor en el panel. La tarjeta Configura tu bot en Resumen se abre en Conectar con Telegram; su primer paso, Qué se ejecuta, debería decir Este bot ejecuta Python Bot.
- En Conectar con Telegram, pega el token y haz clic en Conexión. Comprueba el nombre del bot que aparece y haz clic en Sí, continuar.
- En Tu código, haz clic en Subir archivos para abrir Files y sube
bot.pyyrequirements.txt, o haz clic en Conectar Git. ¿Aún no tienes código? Crear un bot inicial escribe por ti un bot de python-telegram-bot 22. - En la página Bot, panel Código, comprueba que Archivo de entrada sea el archivo que llama a
run_polling()(bot.pypor defecto). - Haz clic en Iniciar bot, abre Console y espera a
Logged in as @your_bot. El indicador en Resumen pasa a En línea en Telegram. Envía/starta tu bot.
El primer arranque tarda más mientras pip instala python-telegram-bot. Después solo se vuelve a instalar cuando cambian tu archivo de requisitos, los paquetes adicionales o la versión de Python, o una vez al día. Paso a paso con capturas: Cómo alojar un bot de Telegram.
Qué medimos
Ejecutamos las tres bibliotecas de Telegram para Python en uno de nuestros propios servidores, en contenedores desechables configurados como el panel ejecuta un bot de Python: Python 3.12 (el Entorno de ejecución marcado como recomendado), paquetes instalados con el mismo comando de pip, un límite de memoria de 1 GB y un núcleo de CPU.
| Biblioteca | Versión | Memoria en reposo | Del arranque a la respuesta de Telegram | Tamaño instalado, con dependencias |
|---|---|---|---|---|
| python-telegram-bot | 22.8 | 44 MB | 0.9 s | 12.3 MB |
| aiogram | 3.31.0 | 173 MB | 4.3 s | 33.9 MB |
| pyTelegramBotAPI | 4.37.1 | 40 MB | 0.7 s | 21.9 MB |
| Python 3.12 solo | 9 MB |
Cada bot cargó la biblioteca y preguntó a Telegram quién es con un token falso (python-telegram-bot: Application.initialize()). La memoria es lo que ocupaban los procesos del bot 15 segundos después de que Telegram rechazara el token; el tiempo de arranque va desde el lanzamiento de Python hasta que la biblioteca informa de esa respuesta, así que incluye un viaje de ida y vuelta a Telegram. Ambos son la mediana de tres ejecuciones tras una ejecución de calentamiento.
Estas cifras son el mínimo de la biblioteca: sin chats, sin handlers trabajando, nada en caché. Tu propio código, los datos que guarda en memoria y el número de chats que atiende se suman, así que elige el plan según lo que haga tu bot. Nuestra página anterior python-telegram-bot vs aiogram en PlayNHost midió una configuración distinta (Python 3.13, un bot ya construido y listo para arrancar), así que sus cifras no son comparables con estas.
Un bot mínimo con python-telegram-bot
Responde a /start, lee el token que le da el panel e imprime una línea de listo. Pon la biblioteca en requirements.txt:
python-telegram-bot>=22,<23
Y el código en bot.py:
import os
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.effective_message.reply_text("Hello! I am running on PlayNHost.")
async def post_init(application: Application) -> None:
print(f"Logged in as @{application.bot.username}")
def main() -> None:
application = (
Application.builder()
.token(os.environ["TELEGRAM_BOT_TOKEN"])
.post_init(post_init)
.build()
)
application.add_handler(CommandHandler("start", start))
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
post_init se ejecuta después de que la aplicación se haya inicializado, que es cuando python-telegram-bot comprueba el token con Telegram, así que Logged in as @your_bot solo aparece cuando Telegram lo ha aceptado. El panel lee esa línea para mostrar En línea en Telegram. El panel entrega el token a tu código como TELEGRAM_BOT_TOKEN, y también como BOT_TOKEN, TOKEN y TELEGRAM_TOKEN, así que os.environ["TOKEN"] también funciona si partes de los ejemplos de la biblioteca, que usan un marcador "TOKEN".
Si el token es incorrecto
En nuestra prueba, con un token que Telegram rechaza, nuestro bot de prueba imprimió:
InvalidToken: The token `1000000000:AAFakeTokenForAMemoryTestNotReal00000` was rejected by the server.
python-telegram-bot comprueba el token antes de que empiece el polling, así que el bot de arriba se detiene al instante con el código de salida 1. La consola muestra primero Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. con un traceback, y luego el traceback del propio error, cuya última línea dice telegram.error.InvalidToken: The token `...` was rejected by the server. En PlayNHost, el panel muestra Telegram no aceptó el token de tu bot sobre la consola, con Reemplazar el token. Ten en cuenta que ambos tracebacks contienen el propio token: no pegues esa salida de la consola en ningún sitio público.
Para arreglarlo, copia el token de nuevo: en @BotFather envía /mybots, elige tu bot y luego API Token. Pégalo en la página Bot, panel Telegram, en Token, y vuelve a iniciar el bot. Si el token se revoca mientras el bot ya está haciendo polling, python-telegram-bot registra Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. y deja de hacer polling, pero el proceso sigue en marcha, así que el bot parece funcionar mientras nada responde. El panel muestra el mismo aviso.
Qué debe saber un host sobre python-telegram-bot
- Nombres del paquete y de importación: instalas
python-telegram-bote importastelegramytelegram.ext. - Versión de Python: python-telegram-bot 22.8 necesita Python 3.10 o superior. El Entorno de ejecución del panel Código ofrece de 3.10 a 3.14, con 3.12 marcado como recomendado, así que cualquier opción cumple.
- Un webhook que quedó de otro host: antes de empezar el polling,
run_polling()elimina cualquier webhook configurado en el bot, así que un bot que viene de un host con webhook funciona sin código extra. Los mensajes que esperan en Telegram se conservan salvo que pasesdrop_pending_updates=True. - Logging: python-telegram-bot registra su arranque con nivel
INFO, que Python no muestra hasta que configuras el logging, así que el bot de arriba imprime su propia línea de listo. Conlogging.basicConfig(level=logging.INFO)registraINFO:telegram.ext.Application:Application started, que el panel también lee como listo. Si lo haces, añade tambiénlogging.getLogger("httpx").setLevel(logging.WARNING), como hacen los propios ejemplos de la biblioteca: conINFOla biblioteca HTTP registra cada URL de petición, y las URL de petición de Telegram contienen tu token. - Tareas programadas: la
JobQueuenecesita un extra. Escribepython-telegram-bot[job-queue]>=22,<23enrequirements.txt; sin él,application.job_queueesNoney la biblioteca avisaNo `JobQueue` set up. - Una segunda copia: cuando otra copia hace polling con el mismo token, Telegram responde
409 Conflict. python-telegram-bot registraException happened while polling for updates.y sigue reintentando, así que el bot parece funcionar pero pierde mensajes. El panel muestra Tu bot también se está ejecutando en otro sitio. Consulta Solucionar el error 409 Conflict de un bot de Telegram.
Alójalo tú mismo en un VPS Linux
En Debian o Ubuntu, instala Python, crea un usuario para el bot e instala la biblioteca en un entorno virtual. Comprueba que python3 --version indique 3.10 o superior.
sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt
Guarda el token en un archivo que solo root pueda leer. Ábrelo con sudo nano /etc/tgbot.env, escribe una línea, guarda y luego ejecuta sudo chmod 600 /etc/tgbot.env:
TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather
Crea /etc/systemd/system/tgbot.service:
[Unit]
Description=Telegram bot (python-telegram-bot)
Wants=network-online.target
After=network-online.target
[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Arráncalo ahora y en cada inicio, y luego sigue su salida:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 importa aquí: cuando la salida de Python no va a un terminal se almacena en bloques, así que sin él Logged in as puede quedarse en un búfer en lugar de llegar al journal. systemctl stop tgbot envía SIGTERM, que run_polling() gestiona apagándose limpiamente. Después de cambiar el código, ejecuta sudo systemctl restart tgbot. Detén primero cualquier copia en tu PC, o Telegram responderá 409 Conflict.
Autoalojamiento o plan de bots
- En un VPS que gestionas tú: las actualizaciones del sistema, la versión de Python, el entorno virtual, reinstalar paquetes, el archivo de unidad, leer el journal y darte cuenta de cuándo el bot deja de responder. A cambio tienes root y puedes ejecutar un webhook si añades un dominio y HTTPS.
- En un plan de bots, el panel se encarga de: instalar
requirements.txtcuando cambia, volver a arrancar el bot tras un fallo, comprobar el token con Telegram antes de guardarlo, entregarlo a tu código con cinco nombres, leer la consola y nombrar la causa cuando el bot deja de responder (un token rechazado, una segunda copia, un webhook), con un botón para el token y el webhook. Nuestros planes de bots aún no incluyen una dirección HTTPS pública, así que los bots allí usan long polling, que es lo que hacerun_polling().
Consulta también Cómo usar una base de datos MySQL con un bot de python-telegram-bot (aiomysql).
Preguntas frecuentes
¿Necesito un webhook para mantener en línea un bot de python-telegram-bot?
No. run_polling() mantiene una conexión abierta con Telegram y pregunta por mensajes nuevos, así que el bot responde mientras el proceso esté en marcha. Un webhook necesita una dirección HTTPS pública, que nuestros planes de bots aún no incluyen. Si mueves un bot que usaba uno: Cómo mover un bot de Telegram a PlayNHost.
¿Por qué apareció mi token en la consola?
Aparece en dos lugares habituales: el mensaje InvalidToken cuando Telegram rechaza el token, y las líneas de petición de la biblioteca HTTP cuando el logging está en INFO. Pon el logger httpx en WARNING como se muestra arriba. Nuestro bot inicial también captura InvalidToken e imprime una línea sencilla en su lugar.
¿Puedo usar run_repeating y otras tareas programadas?
Sí, con el extra job-queue en requirements.txt. El extra instala APScheduler en el siguiente arranque, porque el archivo de requisitos cambió. Las tareas se ejecutan dentro del proceso del bot, así que siguen funcionando mientras el bot funcione.
¿El bot inicial usa python-telegram-bot?
Sí. En un servidor de Python, Crear un bot inicial escribe bot.py y un requirements.txt con python-telegram-bot 22. Responde a /start, imprime Logged in as @your_bot y mantiene el token fuera de sus líneas de log. Cámbialo como quieras y luego reinicia.
python-telegram-bot funciona en todos los planes de bots de PlayNHost, desde STARTER (0.5 GB). Compara los planes y haz clic en Crear servidor en alojamiento de bots de Telegram.



