NEU 📢 Begrenztes Startangebot: bis zu 70 % Rabatt auf deinen ersten Monat, für jedes Spiel!Tarife ansehen

python-telegram-bot-Bot 24/7 hosten

Telegram-Bot-HostingUpdated Nov 6, 202610 min read

Um einen python-telegram-bot-Bot 24/7 zu hosten, lass ihn auf einem Rechner laufen, der immer an ist, statt auf deinem PC: auf einem Linux-VPS mit einem systemd-Dienst, der ihn nach einem Absturz oder Neustart wieder startet, oder mit einem PlayNHost-Bot-Tarif (ab 1,99 US$ im Monat, siehe Telegram-Bot-Hosting), bei dem du deinen Code hochlädst, den Token einfügst und auf Start klickst. In unserem Test brauchte ein python-telegram-bot-22.8-Bot ohne Last etwa 44 MB Arbeitsspeicher; unser kleinster Bot-Tarif, STARTER, hat 0,5 GB. Beide Wege nutzen Long Polling: run_polling() fragt Telegram nach neuen Nachrichten, der Bot braucht also keine öffentliche Adresse. Die Schritte bei PlayNHost:

  1. Schick in Telegram /newbot an @BotFather und kopiere den Token, den du bekommst.
  2. Klicke auf Telegram-Bot-Hosting bei einem Tarif auf Server erstellen. Beantworte im Bestellfenster Wofür ist dein Bot? mit Telegram und wähle Python.
  3. Öffne deinen Server im Panel. Die Karte Deinen Bot einrichten auf der Seite Übersicht öffnet sich bei Mit Telegram verbinden; der erste Schritt, Was läuft, sollte Dieser Bot führt Python Bot aus. anzeigen.
  4. Füge bei Mit Telegram verbinden den Token ein und klicke auf Verbinden. Prüfe den angezeigten Bot-Namen und klicke auf Ja, weiter.
  5. Klicke bei Dein Code auf Dateien hochladen, um Files zu öffnen und bot.py und requirements.txt hochzuladen, oder klicke auf Git verbinden. Noch kein Code? Starter-Bot erstellen schreibt dir einen python-telegram-bot-22-Bot.
  6. Prüfe auf der Seite Bot im Bereich Code, dass Startdatei die Datei ist, die run_polling() aufruft (standardmäßig bot.py).
  7. Klicke auf Bot starten, öffne Console und warte auf Logged in as @your_bot. Der Chip auf Übersicht wechselt zu Online in Telegram. Schick deinem Bot /start.

Der erste Start dauert länger, weil pip python-telegram-bot installiert. Danach wird nur dann neu installiert, wenn sich deine Requirements-Datei, die zusätzlichen Pakete oder die Python-Version ändern, oder einmal am Tag. Schritt für Schritt mit Screenshots: So hostest du einen Telegram-Bot.

Was wir gemessen haben

Wir haben die drei Python-Telegram-Bibliotheken auf einem unserer eigenen Server in Wegwerf-Containern laufen lassen, eingerichtet so, wie das Panel einen Python-Bot ausführt: Python 3.12 (die als empfohlen markierte Laufzeitumgebung), Pakete mit demselben pip-Befehl installiert, ein Speicherlimit von 1 GB und ein CPU-Kern.

BibliothekVersionSpeicher ohne LastStart bis zur Antwort von TelegramInstallationsgröße mit Abhängigkeiten
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
Python 3.12 allein9 MB

Jeder Bot lud die Bibliothek und fragte Telegram mit einem gefälschten Token, wer er ist (python-telegram-bot: Application.initialize()). Der Speicher ist das, was die Prozesse des Bots 15 Sekunden nach der Ablehnung des Tokens durch Telegram belegten; die Startzeit läuft vom Start von Python bis zu dem Moment, in dem die Bibliothek diese Antwort meldet, enthält also einen Round Trip zu Telegram. Beide Werte sind der Median aus drei Läufen nach einem Aufwärmlauf.

Diese Zahlen sind das Minimum der Bibliothek: keine Chats, keine arbeitenden Handler, nichts im Cache. Dein eigener Code, die Daten, die er im Speicher hält, und die Zahl der Chats, die er bedient, kommen noch dazu. Wähle den Tarif also danach, was dein Bot tut. Unsere ältere Seite python-telegram-bot vs aiogram bei PlayNHost hat ein anderes Setup gemessen (Python 3.13, ein fertig gebauter, startbereiter Bot), ihre Zahlen sind also nicht mit diesen vergleichbar.

Ein minimaler python-telegram-bot-Bot

Er antwortet auf /start, liest den Token, den ihm das Panel gibt, und gibt eine Bereitschaftszeile aus. Trage die Bibliothek in requirements.txt ein:

python-telegram-bot>=22,<23

Und den Code 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 läuft, nachdem die Anwendung initialisiert wurde. Genau dann prüft python-telegram-bot den Token bei Telegram, daher erscheint Logged in as @your_bot erst, wenn Telegram ihn akzeptiert hat. Das Panel liest diese Zeile, um Online in Telegram anzuzeigen. Das Panel gibt den Token als TELEGRAM_BOT_TOKEN an deinen Code weiter, außerdem als BOT_TOKEN, TOKEN und TELEGRAM_TOKEN, sodass auch os.environ["TOKEN"] funktioniert, wenn du mit den Beispielen der Bibliothek anfängst, die einen Platzhalter "TOKEN" verwenden.

Wenn der Token falsch ist

In unserem Test, mit einem Token, den Telegram ablehnt, gab unser Test-Bot Folgendes aus:

InvalidToken: The token `1000000000:AAFakeTokenForAMemoryTestNotReal00000` was rejected by the server.

python-telegram-bot prüft den Token, bevor das Polling beginnt, daher bricht der Bot oben sofort mit Exit-Code 1 ab. Die Konsole zeigt zuerst Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. mit einem Traceback, dann den Traceback des Fehlers selbst, dessen letzte Zeile lautet telegram.error.InvalidToken: The token `...` was rejected by the server. Bei PlayNHost zeigt das Panel über der Konsole Telegram hat deinen Bot-Token nicht akzeptiert mit Token ersetzen. Beachte, dass beide Tracebacks den Token selbst enthalten: Füge diese Konsolenausgabe nirgendwo öffentlich ein.

So behebst du es: Kopiere den Token erneut, indem du in @BotFather /mybots sendest, deinen Bot wählst und dann API Token. Füge ihn auf der Seite Bot im Bereich Telegram unter Token ein und starte den Bot erneut. Wird der Token widerrufen, während der Bot schon pollt, protokolliert python-telegram-bot Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. und beendet das Polling, aber der Prozess läuft weiter, sodass der Bot zwar läuft, aber nichts antwortet. Das Panel zeigt dasselbe Banner.

Was ein Host über python-telegram-bot wissen sollte

  • Paket- und Importnamen: Du installierst python-telegram-bot und importierst telegram und telegram.ext.
  • Python-Version: python-telegram-bot 22.8 braucht Python 3.10 oder neuer. Die Laufzeitumgebung im Bereich Code bietet 3.10 bis 3.14, wobei 3.12 als empfohlen markiert ist, jede Auswahl erfüllt das also.
  • Ein Webhook von einem anderen Host: Bevor es mit dem Polling beginnt, löscht run_polling() jeden für den Bot gesetzten Webhook, sodass ein Bot, der von einem Webhook-Host umzieht, ohne zusätzlichen Code funktioniert. Auf Telegram wartende Nachrichten bleiben erhalten, außer du übergibst drop_pending_updates=True.
  • Logging: python-telegram-bot protokolliert seinen Start auf Level INFO, den Python erst anzeigt, wenn du Logging einrichtest, daher gibt der Bot oben seine eigene Bereitschaftszeile aus. Mit logging.basicConfig(level=logging.INFO) protokolliert er INFO:telegram.ext.Application:Application started, was das Panel ebenfalls als bereit liest. Wenn du das tust, füge auch logging.getLogger("httpx").setLevel(logging.WARNING) hinzu, wie es die Beispiele der Bibliothek tun: Bei INFO protokolliert die HTTP-Bibliothek jede Anfrage-URL, und die Anfrage-URLs von Telegram enthalten deinen Token.
  • Geplante Jobs: Die JobQueue braucht ein Extra. Schreibe python-telegram-bot[job-queue]>=22,<23 in requirements.txt; ohne es ist application.job_queue gleich None und die Bibliothek warnt No `JobQueue` set up.
  • Eine zweite Kopie: Wenn eine andere Kopie mit demselben Token pollt, antwortet Telegram mit 409 Conflict. python-telegram-bot protokolliert Exception happened while polling for updates. und versucht es weiter, sodass der Bot zu laufen scheint, aber Nachrichten verpasst. Das Panel zeigt Dein Bot läuft auch noch woanders. Siehe Telegram-Bot-Fehler 409 Conflict beheben.

Selbst auf einem Linux-VPS hosten

Installiere unter Debian oder Ubuntu Python, lege einen Benutzer für den Bot an und installiere die Bibliothek in einer virtuellen Umgebung. Prüfe, dass python3 --version 3.10 oder neuer ausgibt.

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

Lege den Token in eine Datei, die nur root lesen kann. Öffne sie mit sudo nano /etc/tgbot.env, schreibe eine Zeile, speichere und führe dann sudo chmod 600 /etc/tgbot.env aus:

TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather

Erstelle /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

Starte ihn jetzt und bei jedem Boot und verfolge dann seine Ausgabe:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f

PYTHONUNBUFFERED=1 ist hier wichtig: Wenn die Ausgabe von Python nicht an ein Terminal geht, wird sie blockweise gepuffert, sodass Logged in as ohne diese Einstellung in einem Puffer hängen bleiben kann, statt im Journal anzukommen. systemctl stop tgbot sendet SIGTERM, was run_polling() durch sauberes Herunterfahren behandelt. Wenn du den Code änderst, führe sudo systemctl restart tgbot aus. Beende zuerst jede Kopie auf deinem PC, sonst antwortet Telegram mit 409 Conflict.

Selbst hosten oder Bot-Tarif

  • Auf einem VPS, den du selbst verwaltest: Systemupdates, die Python-Version, die virtuelle Umgebung, das Neuinstallieren von Paketen, die Unit-Datei, das Lesen des Journals und das Bemerken, wenn der Bot nicht mehr antwortet. Dafür hast du root und kannst einen Webhook betreiben, wenn du eine Domain und HTTPS hinzufügst.
  • Bei einem Bot-Tarif übernimmt das Panel: Es installiert requirements.txt, wenn sich die Datei ändert, startet den Bot nach einem Absturz neu, prüft den Token bei Telegram, bevor es ihn speichert, gibt ihn unter fünf Namen an deinen Code weiter, liest die Konsole und nennt die Ursache, wenn der Bot nicht mehr antwortet (ein abgelehnter Token, eine zweite Kopie, ein Webhook), mit einer Schaltfläche für den Token und den Webhook. Unsere Bot-Tarife enthalten noch keine öffentliche HTTPS-Adresse, daher nutzen Bots dort Long Polling, und genau das macht run_polling().

Siehe auch So nutzt du eine MySQL-Datenbank mit einem python-telegram-bot-Bot (aiomysql).

Häufige Fragen

Brauche ich einen Webhook, um einen python-telegram-bot-Bot online zu halten?

Nein. run_polling() hält eine Verbindung zu Telegram offen und fragt nach neuen Nachrichten, der Bot antwortet also, solange der Prozess läuft. Ein Webhook braucht eine öffentliche HTTPS-Adresse, die unsere Bot-Tarife noch nicht enthalten. So ziehst du einen Bot um, der einen benutzt hat: So ziehst du einen Telegram-Bot zu PlayNHost um.

Warum erschien mein Token in der Konsole?

Er taucht an zwei häufigen Stellen auf: in der Meldung InvalidToken, wenn Telegram den Token ablehnt, und in den Anfragezeilen der HTTP-Bibliothek, wenn das Logging auf INFO steht. Setze den Logger httpx auf WARNING, wie oben gezeigt. Unser Starter-Bot fängt außerdem InvalidToken ab und gibt stattdessen eine einfache Zeile aus.

Kann ich run_repeating und andere geplante Jobs nutzen?

Ja, mit dem Extra job-queue in requirements.txt. Das Extra installiert APScheduler beim nächsten Start, weil sich die Requirements-Datei geändert hat. Jobs laufen im Bot-Prozess, sie laufen also weiter, solange der Bot läuft.

Nutzt der Starter-Bot python-telegram-bot?

Ja. Auf einem Python-Server schreibt Starter-Bot erstellen bot.py und eine requirements.txt mit python-telegram-bot 22. Er antwortet auf /start, gibt Logged in as @your_bot aus und hält den Token aus seinen Logzeilen heraus. Ändere ihn nach Belieben und starte dann neu.

python-telegram-bot läuft in jedem PlayNHost-Bot-Tarif, ab STARTER (0,5 GB). Vergleiche die Tarife und klicke auf Server erstellen bei Telegram-Bot-Hosting.

Läuft dein Bot schon woanders? Zieh ihn zu uns um

UNSERE NEUESTEN BLOGS