Per ospitare un bot python-telegram-bot 24/7, eseguilo su una macchina che resta sempre accesa invece che sul tuo PC: un VPS Linux con un servizio systemd che lo riavvia dopo un crash o un riavvio, oppure un piano bot PlayNHost (da 1,99 US$ al mese, vedi hosting di bot Telegram), dove carichi il tuo codice, incolli il token e premi Start. Nel nostro test un bot python-telegram-bot 22.8 ha usato circa 44 MB di memoria a riposo; il nostro piano bot più piccolo, STARTER, ha 0,5 GB. Entrambe le strade usano il long polling: run_polling() chiede a Telegram i nuovi messaggi, quindi il bot non ha bisogno di un indirizzo pubblico. I passaggi su PlayNHost:
- In Telegram, invia
/newbota @BotFather e copia il token che ti dà. - Su hosting di bot Telegram, clicca su Crea server su un piano. Nella finestra dell’ordine, rispondi a Per quale piattaforma è il tuo bot? con Telegram e scegli Python.
- Apri il tuo server nel pannello. La scheda Configura il tuo bot in Panoramica si apre su Connetti a Telegram; il suo primo passaggio, Cosa viene eseguito, dovrebbe dire Questo bot esegue Python Bot.
- In Connetti a Telegram, incolla il token e clicca su Connessione. Controlla il nome del bot mostrato e clicca su Sì, continua.
- In Il tuo codice, clicca su Carica i file per aprire Files e carica
bot.pyerequirements.txt, oppure clicca su Collega Git. Non hai ancora codice? Crea un bot di partenza scrive per te un bot python-telegram-bot 22. - Nella pagina Bot, riquadro Codice, controlla che File di avvio sia il file che chiama
run_polling()(bot.pyper impostazione predefinita). - Clicca su Avvia il bot, apri Console e attendi
Logged in as @your_bot. L’indicatore in Panoramica passa a Online su Telegram. Invia/startal tuo bot.
Il primo avvio richiede più tempo mentre pip installa python-telegram-bot. Dopo, reinstalla solo quando cambiano il file dei requisiti, i pacchetti extra o la versione di Python, oppure una volta al giorno. Passo dopo passo con screenshot: Come ospitare un bot Telegram.
Cosa abbiamo misurato
Abbiamo eseguito le tre librerie Telegram per Python su uno dei nostri server, in container usa e getta configurati come il pannello esegue un bot Python: Python 3.12 (il Runtime contrassegnato come consigliato), pacchetti installati con lo stesso comando pip, un limite di memoria di 1 GB e un core CPU.
| Libreria | Versione | Memoria a riposo | Dall’avvio alla risposta di Telegram | Dimensione installata, con dipendenze |
|---|---|---|---|---|
| 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 da solo | 9 MB |
Ogni bot ha caricato la libreria e ha chiesto a Telegram chi è con un token finto (python-telegram-bot: Application.initialize()). La memoria è quella occupata dai processi del bot 15 secondi dopo che Telegram ha rifiutato il token; il tempo di avvio va dal lancio di Python al momento in cui la libreria segnala quella risposta, quindi include un viaggio di andata e ritorno verso Telegram. Entrambi sono la mediana di tre esecuzioni dopo una esecuzione di riscaldamento.
Questi numeri sono il minimo della libreria: nessuna chat, nessun handler al lavoro, niente in cache. Il tuo codice, i dati che tiene in memoria e il numero di chat che serve si sommano, quindi dimensiona il piano in base a quello che fa il tuo bot. La nostra vecchia pagina python-telegram-bot vs aiogram su PlayNHost ha misurato una configurazione diversa (Python 3.13, un bot già costruito e pronto a partire), quindi i suoi numeri non sono confrontabili con questi.
Un bot python-telegram-bot minimale
Risponde a /start, legge il token che gli dà il pannello e stampa una riga di pronto. Metti la libreria in requirements.txt:
python-telegram-bot>=22,<23
E il codice in 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 viene eseguito dopo che l’applicazione è stata inizializzata, ed è il momento in cui python-telegram-bot verifica il token con Telegram, quindi Logged in as @your_bot compare solo dopo che Telegram lo ha accettato. Il pannello legge quella riga per mostrare Online su Telegram. Il pannello passa il token al tuo codice come TELEGRAM_BOT_TOKEN, e anche come BOT_TOKEN, TOKEN e TELEGRAM_TOKEN, quindi os.environ["TOKEN"] funziona anche se parti dagli esempi della libreria, che usano un segnaposto "TOKEN".
Se il token è sbagliato
Nel nostro test, con un token che Telegram rifiuta, il nostro bot di prova ha stampato:
InvalidToken: The token `1000000000:AAFakeTokenForAMemoryTestNotReal00000` was rejected by the server.
python-telegram-bot verifica il token prima che inizi il polling, quindi il bot qui sopra si ferma subito con codice di uscita 1. La console mostra prima Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. con un traceback, poi il traceback dell’errore vero e proprio, la cui ultima riga dice telegram.error.InvalidToken: The token `...` was rejected by the server. Su PlayNHost il pannello mostra Telegram non ha accettato il token del bot sopra la console, con Sostituisci il token. Nota che entrambi i traceback contengono il token stesso: non incollare quell’output della console in nessun luogo pubblico.
Per risolvere, copia di nuovo il token: in @BotFather invia /mybots, scegli il tuo bot, poi API Token. Incollalo nella pagina Bot, riquadro Telegram, sotto Token, e avvia di nuovo il bot. Se il token viene revocato mentre il bot sta già facendo polling, python-telegram-bot registra Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. e smette di fare polling, ma il processo continua a girare, quindi il bot sembra in esecuzione mentre nulla risponde. Il pannello mostra lo stesso banner.
Cosa deve sapere un host su python-telegram-bot
- Nomi del pacchetto e dell’import: installi
python-telegram-bote importitelegrametelegram.ext. - Versione di Python: python-telegram-bot 22.8 richiede Python 3.10 o successivo. Il Runtime nel riquadro Codice offre da 3.10 a 3.14, con 3.12 contrassegnato come consigliato, quindi ogni scelta lo soddisfa.
- Un webhook rimasto da un altro host: prima di iniziare il polling,
run_polling()elimina qualsiasi webhook impostato sul bot, quindi un bot spostato da un host con webhook funziona senza codice aggiuntivo. I messaggi in attesa su Telegram vengono conservati a meno che tu non passidrop_pending_updates=True. - Logging: python-telegram-bot registra il suo avvio a livello
INFO, che Python non mostra finché non configuri il logging, quindi il bot qui sopra stampa una propria riga di pronto. Conlogging.basicConfig(level=logging.INFO)registraINFO:telegram.ext.Application:Application started, che il pannello legge anch’esso come pronto. Se lo fai, aggiungi anchelogging.getLogger("httpx").setLevel(logging.WARNING), come fanno gli esempi della libreria: a livelloINFOla libreria HTTP registra ogni URL di richiesta, e gli URL di richiesta di Telegram contengono il tuo token. - Job pianificati: la
JobQueuerichiede un extra. Scrivipython-telegram-bot[job-queue]>=22,<23inrequirements.txt; senza di essoapplication.job_queueèNonee la libreria avvisaNo `JobQueue` set up. - Una seconda copia: quando un’altra copia fa polling con lo stesso token, Telegram risponde
409 Conflict. python-telegram-bot registraException happened while polling for updates.e continua a riprovare, quindi il bot sembra in esecuzione ma perde messaggi. Il pannello mostra Il tuo bot è in esecuzione anche altrove. Vedi Come risolvere l’errore 409 Conflict di un bot Telegram.
Ospitarlo da te su un VPS Linux
Su Debian o Ubuntu, installa Python, crea un utente per il bot e installa la libreria in un ambiente virtuale. Controlla che python3 --version indichi 3.10 o successivo.
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
Metti il token in un file che solo root può leggere. Aprilo con sudo nano /etc/tgbot.env, scrivi una riga, salva, poi esegui 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
Avvialo ora e a ogni boot, poi segui il suo output:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 è importante qui: quando l’output di Python non va a un terminale è bufferizzato a blocchi, quindi senza di esso Logged in as può restare in un buffer invece di arrivare al journal. systemctl stop tgbot invia SIGTERM, che run_polling() gestisce chiudendosi in modo pulito. Dopo aver modificato il codice, esegui sudo systemctl restart tgbot. Ferma prima ogni copia sul tuo PC, altrimenti Telegram risponde 409 Conflict.
Self-hosting o piano bot
- Su un VPS che gestisci tu: gli aggiornamenti di sistema, la versione di Python, l’ambiente virtuale, la reinstallazione dei pacchetti, il file di unità, la lettura del journal e accorgersi quando il bot smette di rispondere. In cambio hai root e puoi usare un webhook se aggiungi un dominio e HTTPS.
- Su un piano bot, il pannello si occupa di: installare
requirements.txtquando cambia, riavviare il bot dopo un crash, verificare il token con Telegram prima di salvarlo, passarlo al tuo codice con cinque nomi, leggere la console e indicare la causa quando il bot smette di rispondere (un token rifiutato, una seconda copia, un webhook), con un pulsante per il token e il webhook. I nostri piani bot non includono ancora un indirizzo HTTPS pubblico, quindi lì i bot usano il long polling, che è ciò che farun_polling().
Vedi anche Come usare un database MySQL con un bot python-telegram-bot (aiomysql).
Domande frequenti
Mi serve un webhook per tenere online un bot python-telegram-bot?
No. run_polling() tiene aperta una connessione con Telegram e chiede i nuovi messaggi, quindi il bot risponde finché il processo è in esecuzione. Un webhook richiede un indirizzo HTTPS pubblico, che i nostri piani bot non includono ancora. Per spostare un bot che ne usava uno: Come spostare un bot Telegram su PlayNHost.
Perché il mio token è comparso nella console?
Compare in due punti comuni: il messaggio InvalidToken quando Telegram rifiuta il token, e le righe di richiesta della libreria HTTP quando il logging è a livello INFO. Imposta il logger httpx su WARNING come mostrato sopra. Il nostro bot di partenza intercetta anche InvalidToken e stampa invece una riga semplice.
Posso usare run_repeating e altri job pianificati?
Sì, con l’extra job-queue in requirements.txt. L’extra installa APScheduler al prossimo avvio, perché il file dei requisiti è cambiato. I job vengono eseguiti dentro il processo del bot, quindi continuano a funzionare finché il bot è in esecuzione.
Il bot di partenza usa python-telegram-bot?
Sì. Su un server Python, Crea un bot di partenza scrive bot.py e un requirements.txt con python-telegram-bot 22. Risponde a /start, stampa Logged in as @your_bot e tiene il token fuori dalle sue righe di log. Modificalo come preferisci, poi riavvia.
python-telegram-bot funziona su ogni piano bot PlayNHost, da STARTER (0,5 GB) in su. Confronta i piani e clicca su Crea server su hosting di bot Telegram.



