Aby hostować bota python-telegram-bot 24/7, uruchom go na maszynie, która jest stale włączona, zamiast na swoim komputerze: na serwerze VPS z Linuksem z usługą systemd, która uruchamia go ponownie po awarii lub restarcie, albo w planie botów PlayNHost (od 1,99 USD miesięcznie, zobacz hosting botów Telegram), gdzie wgrywasz kod, wklejasz token i klikasz Start. W naszym teście bot z python-telegram-bot 22.8 zużywał w spoczynku około 44 MB pamięci; nasz najmniejszy plan botów, STARTER, ma 0,5 GB. Obie drogi używają long pollingu: run_polling() pyta Telegram o nowe wiadomości, więc bot nie potrzebuje publicznego adresu. Kroki w PlayNHost:
- W Telegramie wyślij
/newbotdo @BotFather i skopiuj token, który dostaniesz. - Na stronie hosting botów Telegram kliknij Utwórz serwer przy wybranym planie. W oknie zamówienia odpowiedz na Na jaką platformę jest Twój bot? wybierając Telegram i wybierz Python.
- Otwórz swój serwer w panelu. Karta Skonfiguruj swojego bota na stronie Przegląd otwiera się na Połącz z Telegramem; jej pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Python Bot.
- W Połącz z Telegramem wklej token i kliknij Połączenie. Sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
- W Twój kod kliknij Prześlij pliki, aby otworzyć Files i prześlij
bot.pyorazrequirements.txt, albo kliknij Połącz Git. Nie masz jeszcze kodu? Utwórz bota startowego napisze dla ciebie bota z python-telegram-bot 22. - Na stronie Bot, w panelu Kod, sprawdź, czy Plik startowy to plik, który wywołuje
run_polling()(domyślniebot.py). - Kliknij Uruchom bota, otwórz Console i poczekaj na
Logged in as @your_bot. Znacznik na stronie Przegląd zmieni się na Online w Telegramie. Wyślij swojemu botowi/start.
Pierwszy start trwa dłużej, bo pip instaluje python-telegram-bot. Potem instaluje ponownie tylko wtedy, gdy zmieni się plik requirements, dodatkowe pakiety lub wersja Pythona, albo raz dziennie. Krok po kroku ze zrzutami ekranu: Jak hostować bota Telegram.
Co zmierzyliśmy
Uruchomiliśmy trzy biblioteki Telegram dla Pythona na jednym z naszych serwerów, w jednorazowych kontenerach skonfigurowanych tak, jak panel uruchamia bota w Pythonie: Python 3.12 (oznaczone jako zalecane Runtime), pakiety zainstalowane tym samym poleceniem pip, limit pamięci 1 GB i jeden rdzeń procesora.
| Biblioteka | Wersja | Pamięć w spoczynku | Od startu do odpowiedzi Telegrama | Rozmiar po instalacji, z zależnościami |
|---|---|---|---|---|
| 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 |
| Sam Python 3.12 | 9 MB |
Każdy bot załadował bibliotekę i zapytał Telegram, kim jest, z fałszywym tokenem (python-telegram-bot: Application.initialize()). Pamięć to ilość, jaką procesy bota zajmowały 15 sekund po odrzuceniu tokenu przez Telegram; czas startu liczy się od uruchomienia Pythona do zgłoszenia tej odpowiedzi przez bibliotekę, więc obejmuje jedną rundę do Telegrama. Obie wartości to mediana z trzech uruchomień po uruchomieniu rozgrzewkowym.
Te liczby to dolna granica biblioteki: bez czatów, bez pracujących handlerów, bez niczego w cache. Twój własny kod, dane, które trzyma w pamięci, i liczba obsługiwanych czatów dochodzą do tego, więc dobierz plan do tego, co robi twój bot. Nasza starsza strona python-telegram-bot kontra aiogram w PlayNHost mierzyła inną konfigurację (Python 3.13, bot zbudowany i gotowy do startu), więc jej liczb nie da się porównać z tymi.
Minimalny bot python-telegram-bot
Odpowiada na /start, odczytuje token, który daje mu panel, i wypisuje linię gotowości. Umieść bibliotekę w requirements.txt:
python-telegram-bot>=22,<23
A kod w 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 uruchamia się po zainicjalizowaniu aplikacji, czyli wtedy, gdy python-telegram-bot sprawdza token w Telegramie, więc Logged in as @your_bot pojawia się dopiero po jego zaakceptowaniu przez Telegram. Panel odczytuje tę linię, by pokazać Online w Telegramie. Panel przekazuje token twojemu kodowi jako TELEGRAM_BOT_TOKEN, a także jako BOT_TOKEN, TOKEN i TELEGRAM_TOKEN, więc os.environ["TOKEN"] też działa, jeśli zaczynasz od przykładów biblioteki, które używają zmiennej zastępczej "TOKEN".
Gdy token jest błędny
W naszym teście, z tokenem odrzuconym przez Telegram, nasz testowy bot wypisał:
InvalidToken: The token `1000000000:AAFakeTokenForAMemoryTestNotReal00000` was rejected by the server.
python-telegram-bot sprawdza token przed rozpoczęciem pollingu, więc powyższy bot zatrzymuje się od razu z kodem wyjścia 1. Konsola najpierw pokazuje Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. wraz z tracebackiem, potem traceback samego błędu, którego ostatnia linia brzmi telegram.error.InvalidToken: The token `...` was rejected by the server. W PlayNHost panel pokazuje nad konsolą Telegram nie przyjął tokena twojego bota z przyciskiem Zastąp token. Uwaga: oba tracebacki zawierają sam token, więc nie wklejaj tego wyjścia konsoli nigdzie publicznie.
Aby to naprawić, skopiuj token ponownie: w @BotFather wyślij /mybots, wybierz swojego bota, a potem API Token. Wklej go na stronie Bot, w panelu Telegram, w polu Token, i uruchom bota ponownie. Jeśli token zostanie unieważniony, gdy bot już wykonuje polling, python-telegram-bot zapisuje Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. i przestaje wykonywać polling, ale proces nadal działa, więc bot wygląda na działającego, choć nic nie odpowiada. Panel pokazuje ten sam baner.
Co host powinien wiedzieć o python-telegram-bot
- Nazwy pakietu i importu: instalujesz
python-telegram-boti importujesztelegramoraztelegram.ext. - Wersja Pythona: python-telegram-bot 22.8 wymaga Pythona 3.10 lub nowszego. Runtime w panelu Kod oferuje od 3.10 do 3.14, z zalecanym 3.12, więc każdy wybór to spełnia.
- Webhook pozostawiony przez innego hosta: przed rozpoczęciem pollingu
run_polling()usuwa każdy webhook ustawiony dla bota, więc bot przeniesiony z hosta z webhookiem działa bez dodatkowego kodu. Wiadomości czekające w Telegramie są zachowane, chyba że przekażeszdrop_pending_updates=True. - Logowanie: python-telegram-bot zapisuje swój start na poziomie
INFO, którego Python nie pokazuje, dopóki nie skonfigurujesz logowania, więc powyższy bot wypisuje własną linię gotowości. Zlogging.basicConfig(level=logging.INFO)zapisujeINFO:telegram.ext.Application:Application started, co panel także odczytuje jako gotowość. Jeśli to zrobisz, dodaj teżlogging.getLogger("httpx").setLevel(logging.WARNING), tak jak robią to przykłady biblioteki: na poziomieINFObiblioteka HTTP zapisuje każdy adres URL żądania, a adresy URL żądań Telegrama zawierają twój token. - Zaplanowane zadania:
JobQueuewymaga dodatku. Wpiszpython-telegram-bot[job-queue]>=22,<23wrequirements.txt; bez niegoapplication.job_queuetoNone, a biblioteka ostrzegaNo `JobQueue` set up. - Druga kopia: gdy inna kopia wykonuje polling z tym samym tokenem, Telegram odpowiada
409 Conflict. python-telegram-bot zapisujeException happened while polling for updates.i próbuje dalej, więc bot wygląda na działającego, ale gubi wiadomości. Panel pokazuje Twój bot działa też gdzie indziej. Zobacz Jak naprawić błąd 409 Conflict bota Telegram.
Własny hosting na VPS z Linuksem
W Debianie lub Ubuntu zainstaluj Pythona, utwórz użytkownika dla bota i zainstaluj bibliotekę w środowisku wirtualnym. Sprawdź, czy python3 --version pokazuje 3.10 lub nowszy.
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
Umieść token w pliku, który może czytać tylko root. Otwórz go poleceniem sudo nano /etc/tgbot.env, wpisz jedną linię, zapisz, a potem uruchom sudo chmod 600 /etc/tgbot.env:
TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather
Utwórz /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
Uruchom go teraz i przy każdym starcie systemu, a potem śledź jego wyjście:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 ma tu znaczenie: gdy wyjście Pythona nie trafia do terminala, jest buforowane blokowo, więc bez tego Logged in as może utknąć w buforze zamiast trafić do journala. systemctl stop tgbot wysyła SIGTERM, co run_polling() obsługuje, kończąc pracę w czysty sposób. Po zmianie kodu uruchom sudo systemctl restart tgbot. Najpierw zatrzymaj każdą kopię na swoim komputerze, bo inaczej Telegram odpowie 409 Conflict.
Własny hosting czy plan botów
- Na VPS, którym zarządzasz: aktualizacje systemu, wersja Pythona, środowisko wirtualne, ponowna instalacja pakietów, plik unit, czytanie journala i zauważenie, że bot przestał odpowiadać. W zamian masz roota i możesz uruchomić webhook, jeśli dodasz domenę i HTTPS.
- W planie botów panel robi to za ciebie: instaluje
requirements.txt, gdy się zmieni, uruchamia bota ponownie po awarii, sprawdza token w Telegramie przed zapisaniem, przekazuje go twojemu kodowi pod pięcioma nazwami, czyta konsolę i wskazuje przyczynę, gdy bot przestaje odpowiadać (odrzucony token, druga kopia, webhook), z przyciskiem dla tokenu i webhooka. Nasze plany botów nie zawierają jeszcze publicznego adresu HTTPS, więc boty używają tam long pollingu, a to właśnie robirun_polling().
Zobacz też Jak używać bazy danych MySQL z botem python-telegram-bot (aiomysql).
Najczęstsze pytania
Czy potrzebuję webhooka, by bot python-telegram-bot był online?
Nie. run_polling() utrzymuje otwarte połączenie z Telegramem i pyta o nowe wiadomości, więc bot odpowiada, dopóki działa proces. Webhook wymaga publicznego adresu HTTPS, którego nasze plany botów jeszcze nie zawierają. Przenoszenie bota, który go używał: Jak przenieść bota Telegram do PlayNHost.
Dlaczego mój token pojawił się w konsoli?
Pojawia się w dwóch typowych miejscach: w komunikacie InvalidToken, gdy Telegram odrzuca token, i w liniach żądań biblioteki HTTP, gdy logowanie jest na poziomie INFO. Ustaw logger httpx na WARNING, jak pokazano wyżej. Nasz bot startowy też przechwytuje InvalidToken i wypisuje zamiast tego zwykłą linię.
Czy mogę używać run_repeating i innych zaplanowanych zadań?
Tak, z dodatkiem job-queue w requirements.txt. Dodatek instaluje APScheduler przy następnym starcie, ponieważ plik requirements się zmienił. Zadania działają wewnątrz procesu bota, więc działają, dopóki działa bot.
Czy bot startowy używa python-telegram-bot?
Tak. Na serwerze Python Utwórz bota startowego zapisuje bot.py oraz requirements.txt z python-telegram-bot 22. Odpowiada na /start, wypisuje Logged in as @your_bot i nie umieszcza tokenu w swoich liniach logu. Zmień go, jak chcesz, a potem uruchom ponownie.
python-telegram-bot działa w każdym planie botów PlayNHost, od STARTER (0,5 GB) wzwyż. Porównaj plany i kliknij Utwórz serwer na stronie hosting botów Telegram.



