Aby hostować bota pyTelegramBotAPI (telebot) 24/7, uruchom go na maszynie, która zostaje włączona, zamiast na swoim komputerze: na VPS z Linuksem z usługą systemd, która uruchamia go ponownie po awarii lub restarcie, albo w planie dla 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 pyTelegramBotAPI 4.37.1 zajmował w spoczynku około 40 MB pamięci; nasz najmniejszy plan dla botów, STARTER, ma 0,5 GB. Obie drogi używają long pollingu: bot.infinity_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. - W hostingu 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 kroku Połącz z Telegramem; jego pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Python Bot.
- W kroku Połącz z Telegramem wklej token i kliknij Połączenie. Sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
- W kroku Twój kod kliknij Prześlij pliki, aby otworzyć Files, i prześlij
bot.pyorazrequirements.txt, albo kliknij Połącz Git. Wrequirements.txtpakiet nazywa siępyTelegramBotAPI, a nietelebot. - Na stronie Bot, w panelu Kod, sprawdź, czy Plik startowy to plik, który wywołuje
infinity_polling()(domyślniebot.py), oraz czy Runtime to Python 3.11 lub nowszy. - 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.
Pierwsze uruchomienie trwa dłużej, bo pip instaluje pyTelegramBotAPI. Potem instaluje ponownie tylko wtedy, gdy zmieni się plik z wymaganiami, dodatkowe pakiety lub wersja Pythona, albo raz dziennie. Krok po kroku ze zrzutami ekranu: Jak hostować bota Telegram.
Co zmierzyliśmy
Uruchomiliśmy trzy pythonowe biblioteki do Telegrama na jednym z naszych serwerów, w jednorazowych kontenerach skonfigurowanych tak, jak panel uruchamia bota w Pythonie: Python 3.12 (Runtime oznaczony jako zalecany), pakiety zainstalowane tym samym poleceniem pip, limit pamięci 1 GB i jeden rdzeń CPU.
| Biblioteka | Wersja | Pamięć w spoczynku | Od startu do odpowiedzi Telegrama | Rozmiar po instalacji, z zależnościami |
|---|---|---|---|---|
| pyTelegramBotAPI (TeleBot) | 4.37.1 | 40 MB | 0,7 s | 21,9 MB |
| 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 |
| Sam Python 3.12 | 9 MB |
Każdy bot załadował bibliotekę i zapytał Telegram, kim jest, z fałszywym tokenem (pyTelegramBotAPI: bot.get_me() na zwykłym TeleBot). Pamięć to to, co zajmowały procesy bota 15 sekund po odrzuceniu tokena przez Telegram; czas startu liczy się od uruchomienia Pythona do chwili, gdy biblioteka zgłosi tę odpowiedź, więc obejmuje jedno zapytanie do Telegrama i z powrotem. 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, nic w pamięci podręcznej. 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. Rozmiar po instalacji obejmuje obie biblioteki HTTP, od których zależy pyTelegramBotAPI, requests i aiohttp, nawet jeśli używasz tylko zwykłego TeleBot.
Minimalny bot pyTelegramBotAPI
Odpowiada na /start, czyta token, który daje mu panel, i drukuje linię gotowości. Wpisz bibliotekę do requirements.txt:
pyTelegramBotAPI>=4,<5
A kod do bot.py:
import os
import telebot
bot = telebot.TeleBot(os.environ["TELEGRAM_BOT_TOKEN"])
@bot.message_handler(commands=["start"])
def start(message):
bot.reply_to(message, "Hello! I am running on PlayNHost.")
bot.delete_webhook()
print(f"Logged in as @{bot.user.username}")
bot.infinity_polling()
Dwa wywołania przed pollingiem mają znaczenie na hostingu. delete_webhook() usuwa webhook pozostawiony przez innego hosta, a bot.user pyta Telegram, kim jest bot, więc Logged in as @your_bot pojawia się tylko przy tokenie, który Telegram akceptuje. Panel czyta tę linię, aby pokazać Online w Telegramie. Oba wywołania zatrzymują też bota od razu z jasnym błędem, gdy token jest zły, zamiast pozwalać pollingowi ponawiać to w tle. Panel przekazuje token twojemu kodowi jako TELEGRAM_BOT_TOKEN, a także jako BOT_TOKEN, TOKEN i TELEGRAM_TOKEN.
Jeśli token jest zły
W naszym teście, z tokenem odrzuconym przez Telegram, nasz testowy bot wypisał:
ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized
W pełnym tracebacku klasa nazywa się telebot.apihelper.ApiTelegramException. Z botem powyżej pierwsze wywołanie kończy się błędem, a bot zatrzymuje się z kodem wyjścia 1; w PlayNHost panel pokazuje Telegram nie przyjął tokena twojego bota nad konsolą, z przyciskiem Zastąp token. 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.
Bot, który od razu wywołuje infinity_polling(), jak robi to większość przykładów, zachowuje się inaczej: nie zatrzymuje się. Polling najpierw pyta Telegram, kim jest bot; przy odrzuconym tokenie to się nie udaje, a bot loguje Infinity polling exception: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized i ponawia co 3 sekundy, tak długo jak działa proces. Token unieważniony, gdy bot już prowadzi polling, daje zamiast tego Threaded polling exception: z tym samym komunikatem, ponawiany po czasie oczekiwania, który za każdym razem się podwaja, do minuty. W obu przypadkach bot wygląda na działającego, a nic nie odpowiada. Panel rozpoznaje obie linie i pokazuje ten sam baner.
Co host powinien wiedzieć o pyTelegramBotAPI
- Nazwy pakietu i importu: instalujesz
pyTelegramBotAPI, a importujesztelebot. Pakiet PyPI o nazwietelebotto inny, mały projekt; wpiszpyTelegramBotAPIdorequirements.txt. - Wersja Pythona: pyTelegramBotAPI 4.37.1 wymaga Pythona 3.11 lub nowszego. Na Pythonie 3.10 pip nie zgłasza błędu: instaluje 4.37.0, ostatnie wydanie, które dopuszczało 3.10. Ustaw Runtime w panelu Kod na 3.11 lub nowszy (3.12 jest oznaczony jako zalecany), aby dostać aktualne wydanie.
infinity_polling()czypolling(): używajinfinity_polling(). Zwykłepolling()zatrzymuje się przy pierwszym błędzie od Telegrama, a kończy je też wyjątek w jednym z twoich handlerów, więc bot się zamyka. Przyinfinity_polling()błędy od Telegrama są ponawiane, a każdy inny wyjątek w handlerze jest logowany jakoInfinity polling exception: ..., zanim polling ruszy ponownie 3 sekundy później.- Logowanie: pyTelegramBotAPI ma własny logger,
TeleBot, ustawiony naERROR, więc nic nie drukuje przy starcie; dlatego bot powyżej drukuje własną linię gotowości. Błędy pojawiają się jako jedna linia bez tracebacku. Aby zobaczyć, gdzie handler zawiódł, uruchom zbot.infinity_polling(logger_level=logging.DEBUG)(iimport logging), co dodaje traceback. Te linie ukrywają tajną część twojego tokena. - Webhook pozostawiony przez innego hosta: polling go nie usuwa, a Telegram odrzuca polling, dopóki jest ustawiony. Zostaw
bot.delete_webhook()jak wyżej albo kliknij Usuń webhook na stronie Bot, w panelu Telegram. - Wątki czy asyncio:
TeleBotużywa requests i domyślnie uruchamia handlery w dwóch wątkach roboczych (num_threads=2); wolny handler blokuje jeden z nich.AsyncTeleBotztelebot.async_telebotużywa aiohttp i działa zasyncio.run(bot.polling()). Oba działają w panelu tak samo. - Druga kopia: gdy inna kopia prowadzi polling z tym samym tokenem, Telegram odpowiada
409 Conflict, ainfinity_polling()ponawia próby, dopóki działa. Panel pokazuje Twój bot działa też gdzie indziej. Zobacz Jak naprawić błąd 409 Conflict bota Telegram.
Hostowanie samodzielnie na VPS z Linuksem
W Debianie lub Ubuntu zainstaluj Pythona, utwórz użytkownika dla bota i zainstaluj bibliotekę w środowisku wirtualnym. Najpierw sprawdź python3 --version: poniżej 3.11 pip instaluje starsze pyTelegramBotAPI.
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 (pyTelegramBotAPI)
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 blokami, więc bez tego Logged in as może utknąć w buforze zamiast trafić do dziennika. Restart=always uruchamia też bota ponownie 5 sekund po zatrzymaniu przez zły token, więc sprawdź dziennik, jeśli ciągle się restartuje. Po zmianie kodu uruchom sudo systemctl restart tgbot. Najpierw zatrzymaj każdą kopię na swoim komputerze, bo inaczej Telegram odpowie 409 Conflict.
Samodzielny hosting czy plan dla botów
- Na VPS, którym zarządzasz sam: aktualizacje systemu, wersja Pythona, środowisko wirtualne, ponowna instalacja pakietów, plik jednostki, czytanie dziennika i zauważanie, kiedy bot przestaje odpowiadać. W zamian masz roota i możesz uruchomić webhook, jeśli dodasz domenę i HTTPS.
- W planie dla botów panel robi to za ciebie: instaluje
requirements.txt, gdy się zmienia, 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 tokena i webhooka. Nasze plany dla botów nie zawierają jeszcze publicznego adresu HTTPS, więc boty używają tam long pollingu, a to właśnie robiinfinity_polling().
Pytania, które zadają ludzie
Dlaczego mój bot telebot działa, ale nigdy nie odpowiada?
Bo infinity_polling() ponawia każdy błąd od Telegrama bez zatrzymywania się: odrzucony token, inna kopia używająca tego samego tokena, webhook pozostawiony na bocie. Szukaj linii z Infinity polling exception (token odrzucony przy starcie) lub Threaded polling exception (gdy polling już działa) w Console; panel zamienia każdą z tych trzech przyczyn w baner, który ją nazywa.
Dostaję ModuleNotFoundError: No module named 'telebot'. Czego brakuje?
Pakietu. Dodaj pyTelegramBotAPI do requirements.txt i uruchom bota ponownie: plik z wymaganiami się zmienił, więc pip zainstaluje go przy tym starcie. Import pozostaje import telebot.
Czy pyTelegramBotAPI potrzebuje webhooka, żeby pozostać online?
Nie. infinity_polling() stale pyta Telegram o nowe wiadomości, więc bot odpowiada, dopóki działa proces. Przenoszenie bota, który używał webhooka: Jak przenieść bota Telegram do PlayNHost.
Użyć TeleBot czy AsyncTeleBot?
Oba działają w planie dla botów. Użyj tego, którego używa twój kod lub poradnik: w TeleBot handlery to zwykłe funkcje, w AsyncTeleBot to funkcje async def, które wywołują metody bota przez await. Nasz pomiar powyżej dotyczy zwykłego TeleBot.
pyTelegramBotAPI działa w każdym planie dla botów PlayNHost, od STARTER (0,5 GB) wzwyż. Porównaj plany i kliknij Utwórz serwer w hostingu botów Telegram.



