Um einen pyTelegramBotAPI-Bot (telebot) 24/7 zu hosten, lass ihn auf einem Rechner laufen, der immer an bleibt, statt auf deinem PC: auf einem Linux-VPS mit einem systemd-Dienst, der ihn nach einem Absturz oder Neustart wieder startet, oder bei einem PlayNHost-Bot-Tarif (ab 1,99 US$ im Monat, siehe Telegram-Bot-Hosting), wo du deinen Code hochlädst, den Token einfügst und auf Start klickst. In unserem Test belegte ein Bot mit pyTelegramBotAPI 4.37.1 ohne Last etwa 40 MB Speicher; unser kleinster Bot-Tarif, STARTER, hat 0,5 GB. Beide Wege nutzen Long Polling: bot.infinity_polling() fragt Telegram nach neuen Nachrichten, deshalb braucht der Bot keine öffentliche Adresse. Die Schritte bei PlayNHost:
- Sende in Telegram
/newbotan @BotFather und kopiere den Token, den du bekommst. - Klicke bei Telegram-Bot-Hosting bei einem Tarif auf Server erstellen. Beantworte im Bestellfenster Wofür ist dein Bot? mit Telegram und wähle Python.
- Ö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.
- Füge bei Mit Telegram verbinden den Token ein und klicke auf Verbinden. Prüfe den angezeigten Bot-Namen und klicke auf Ja, weiter.
- Klicke bei Dein Code auf Dateien hochladen, um Files zu öffnen, und lade
bot.pyundrequirements.txthoch, oder klicke auf Git verbinden. Inrequirements.txtheißt das PaketpyTelegramBotAPI, nichttelebot. - Prüfe auf der Seite Bot im Bereich Code, dass Startdatei die Datei ist, die
infinity_polling()aufruft (standardmäßigbot.py), und dass Laufzeitumgebung auf Python 3.11 oder neuer steht. - Klicke auf Bot starten, öffne Console und warte auf
Logged in as @your_bot. Der Chip auf der Seite Übersicht wechselt zu Online in Telegram. Sende deinem Bot/start.
Der erste Start dauert länger, weil pip pyTelegramBotAPI installiert. Danach wird nur 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.
| Bibliothek | Version | Speicher ohne Last | Start bis zur Antwort von Telegram | Installationsgröße mit Abhängigkeiten |
|---|---|---|---|---|
| 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 |
| Python 3.12 allein | 9 MB |
Jeder Bot lud die Bibliothek und fragte Telegram mit einem falschen Token, wer er ist (pyTelegramBotAPI: bot.get_me() beim einfachen TeleBot). 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 Roundtrip zu Telegram. Beides ist der Median aus drei Läufen nach einem Aufwärmlauf.
Diese Werte sind die Untergrenze 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 obendrauf, wähle den Tarif also nach dem, was dein Bot tut. Die Installationsgröße enthält beide HTTP-Bibliotheken, von denen pyTelegramBotAPI abhängt, requests und aiohttp, auch wenn du nur den einfachen TeleBot nutzt.
Ein minimaler pyTelegramBotAPI-Bot
Er antwortet auf /start, liest den Token, den das Panel ihm gibt, und gibt eine Bereitschaftszeile aus. Trage die Bibliothek in requirements.txt ein:
pyTelegramBotAPI>=4,<5
Und den Code in 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()
Die zwei Aufrufe vor dem Polling sind auf einem Host wichtig. delete_webhook() entfernt einen Webhook, der von einem anderen Host übrig geblieben ist, und bot.user fragt Telegram, wer der Bot ist, sodass Logged in as @your_bot nur mit einem Token erscheint, den Telegram akzeptiert. Das Panel liest diese Zeile, um Online in Telegram anzuzeigen. Beide Aufrufe stoppen den Bot bei einem falschen Token sofort mit einer klaren Fehlermeldung, statt das Polling es im Hintergrund wiederholen zu lassen. Das Panel gibt den Token als TELEGRAM_BOT_TOKEN an deinen Code weiter, außerdem als BOT_TOKEN, TOKEN und TELEGRAM_TOKEN.
Wenn der Token falsch ist
Bei einem Token, den Telegram ablehnt, gab unser Test-Bot in unserem Test Folgendes aus:
ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized
In einem vollständigen Traceback lautet die Klasse telebot.apihelper.ApiTelegramException. Mit dem obigen Bot schlägt der erste Aufruf fehl und der Bot endet mit Exit-Code 1; bei PlayNHost zeigt das Panel Telegram hat deinen Bot-Token nicht akzeptiert über der Konsole an, mit Token ersetzen. Zum Beheben kopierst du den Token erneut: Sende @BotFather /mybots, wähle deinen Bot und dann API Token. Füge ihn auf der Seite Bot im Bereich Telegram unter Token ein und starte den Bot erneut.
Ein Bot, der wie in den meisten Beispielen sofort infinity_polling() aufruft, verhält sich anders: Er stoppt nicht. Das Polling fragt zuerst Telegram, wer der Bot ist; bei einem abgelehnten Token schlägt das fehl, und der Bot protokolliert Infinity polling exception: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized und versucht es alle 3 Sekunden erneut, solange der Prozess läuft. Ein Token, der widerrufen wird, während der Bot schon pollt, erzeugt stattdessen Threaded polling exception: mit derselben Meldung, wiederholt nach einer Wartezeit, die sich jedes Mal verdoppelt, bis zu einer Minute. In beiden Fällen sieht der Bot aus, als würde er laufen, während nichts antwortet. Das Panel erkennt beide Zeilen und zeigt dasselbe Banner.
Was ein Host über pyTelegramBotAPI wissen sollte
- Paket- und Importnamen: Du installierst
pyTelegramBotAPIund importiersttelebot. Das PyPI-Paket namenstelebotist ein anderes, kleines Projekt; tragepyTelegramBotAPIinrequirements.txtein. - Python-Version: pyTelegramBotAPI 4.37.1 braucht Python 3.11 oder neuer. Unter Python 3.10 schlägt pip nicht fehl: Es installiert 4.37.0, die letzte Version, die 3.10 erlaubte. Lass Laufzeitumgebung im Bereich Code auf 3.11 oder neuer (3.12 ist als empfohlen markiert), um die aktuelle Version zu bekommen.
infinity_polling()oderpolling(): Nutzeinfinity_polling(). Das einfachepolling()stoppt beim ersten Fehler von Telegram, und auch eine Exception in einem deiner Handler beendet es, der Bot beendet sich also. Mitinfinity_polling()werden Fehler von Telegram wiederholt, und jede andere Exception in einem Handler wird alsInfinity polling exception: ...protokolliert, bevor das Polling 3 Sekunden später neu startet.- Logging: pyTelegramBotAPI hat einen eigenen Logger,
TeleBot, aufERRORgestellt, er gibt beim Start also nichts aus; deshalb gibt der obige Bot seine eigene Bereitschaftszeile aus. Fehler erscheinen als eine Zeile ohne Traceback. Um zu sehen, wo ein Handler fehlgeschlagen ist, starte mitbot.infinity_polling(logger_level=logging.DEBUG)(undimport logging), was den Traceback hinzufügt. Diese Zeilen verbergen den geheimen Teil deines Tokens. - Ein Webhook von einem anderen Host: Das Polling entfernt ihn nicht, und Telegram lehnt Polling ab, solange einer gesetzt ist. Behalte
bot.delete_webhook()wie oben bei, oder klicke auf der Seite Bot im Bereich Telegram auf Webhook entfernen. - Threads oder asyncio:
TeleBotnutzt requests und führt Handler standardmäßig in zwei Worker-Threads aus (num_threads=2); ein langsamer Handler blockiert einen davon.AsyncTeleBotaustelebot.async_telebotnutzt aiohttp und läuft mitasyncio.run(bot.polling()). Beide laufen im Panel gleich. - Eine zweite Kopie: Wenn eine andere Kopie mit demselben Token pollt, antwortet Telegram mit
409 Conflict, undinfinity_polling()wiederholt es, solange es läuft. Das Panel zeigt Dein Bot läuft auch noch woanders. Siehe Telegram-Bot-Fehler 409 Conflict beheben.
Auf einem Linux-VPS selbst 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 zuerst python3 --version: Unter 3.11 installiert pip ein älteres 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
Lege den Token in einer Datei ab, 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 (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
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 in ein Terminal geht, wird sie blockweise gepuffert, sodass Logged in as ohne diese Einstellung in einem Puffer hängen bleiben kann, statt das Journal zu erreichen. Restart=always startet den Bot auch 5 Sekunden nach einem Stopp wegen eines falschen Tokens wieder, prüfe also das Journal, wenn er ständig neu startet. Führe nach einer Codeänderung sudo systemctl restart tgbot aus. Stoppe 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 sie sich ä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, deshalb nutzen Bots dort Long Polling, wasinfinity_polling()tut.
Fragen, die Leute stellen
Warum läuft mein telebot-Bot, antwortet aber nie?
Weil infinity_polling() jeden Fehler von Telegram wiederholt, ohne zu stoppen: ein abgelehnter Token, eine andere Kopie mit demselben Token, ein am Bot gebliebener Webhook. Suche nach Zeilen mit Infinity polling exception (ein beim Start abgelehnter Token) oder Threaded polling exception (sobald das Polling läuft) in der Console; das Panel macht aus jeder der drei Ursachen ein Banner, das sie nennt.
Ich bekomme ModuleNotFoundError: No module named 'telebot'. Was fehlt?
Das Paket. Trage pyTelegramBotAPI in requirements.txt ein und starte den Bot erneut: Die Requirements-Datei hat sich geändert, also installiert pip es bei diesem Start. Der Import bleibt import telebot.
Braucht pyTelegramBotAPI einen Webhook, um online zu bleiben?
Nein. infinity_polling() fragt Telegram weiter nach neuen Nachrichten, der Bot antwortet also, solange der Prozess läuft. Zum Umzug eines Bots, der einen Webhook nutzte: So ziehst du einen Telegram-Bot zu PlayNHost um.
Sollte ich TeleBot oder AsyncTeleBot nutzen?
Beide laufen in einem Bot-Tarif. Nimm das, was dein Code oder dein Tutorial nutzt: Bei TeleBot sind die Handler normale Funktionen, bei AsyncTeleBot sind es async def-Funktionen, die die Methoden des Bots mit await aufrufen. Unsere Messung oben gilt für den einfachen TeleBot.
pyTelegramBotAPI läuft in jedem PlayNHost-Bot-Tarif, ab STARTER (0,5 GB). Vergleiche die Tarife und klicke auf Server erstellen bei Telegram-Bot-Hosting.



