NOWOŚĆ 📢 Ograniczona oferta na start: do 70% zniżki na pierwszy miesiąc, na każdą grę!Zobacz plany

Jak hostować bota python-telegram-bot 24/7

Hosting botów TelegramUpdated Nov 6, 202610 min read

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:

  1. W Telegramie wyślij /newbot do @BotFather i skopiuj token, który dostaniesz.
  2. 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.
  3. 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.
  4. W Połącz z Telegramem wklej token i kliknij Połączenie. Sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
  5. W Twój kod kliknij Prześlij pliki, aby otworzyć Files i prześlij bot.py oraz requirements.txt, albo kliknij Połącz Git. Nie masz jeszcze kodu? Utwórz bota startowego napisze dla ciebie bota z python-telegram-bot 22.
  6. Na stronie Bot, w panelu Kod, sprawdź, czy Plik startowy to plik, który wywołuje run_polling() (domyślnie bot.py).
  7. 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.

BibliotekaWersjaPamięć w spoczynkuOd startu do odpowiedzi TelegramaRozmiar po instalacji, z zależnościami
python-telegram-bot22.844 MB0,9 s12,3 MB
aiogram3.31.0173 MB4,3 s33,9 MB
pyTelegramBotAPI4.37.140 MB0,7 s21,9 MB
Sam Python 3.129 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-bot i importujesz telegram oraz telegram.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żesz drop_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. Z logging.basicConfig(level=logging.INFO) zapisuje INFO: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 poziomie INFO biblioteka HTTP zapisuje każdy adres URL żądania, a adresy URL żądań Telegrama zawierają twój token.
  • Zaplanowane zadania: JobQueue wymaga dodatku. Wpisz python-telegram-bot[job-queue]>=22,<23 w requirements.txt; bez niego application.job_queue to None, a biblioteka ostrzega No `JobQueue` set up.
  • Druga kopia: gdy inna kopia wykonuje polling z tym samym tokenem, Telegram odpowiada 409 Conflict. python-telegram-bot zapisuje Exception 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 robi run_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.

Twój bot działa już gdzie indziej? Przenieś go do nas

NASZE OSTATNIE WPISY