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

pyTelegramBotAPI-Bot 24/7 hosten

Telegram-Bot-HostingUpdated Nov 6, 202611 min read

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:

  1. Sende in Telegram /newbot an @BotFather und kopiere den Token, den du bekommst.
  2. 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.
  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 lade bot.py und requirements.txt hoch, oder klicke auf Git verbinden. In requirements.txt heißt das Paket pyTelegramBotAPI, nicht telebot.
  6. Prüfe auf der Seite Bot im Bereich Code, dass Startdatei die Datei ist, die infinity_polling() aufruft (standardmäßig bot.py), und dass Laufzeitumgebung auf Python 3.11 oder neuer steht.
  7. 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.

BibliothekVersionSpeicher ohne LastStart bis zur Antwort von TelegramInstallationsgröße mit Abhängigkeiten
pyTelegramBotAPI (TeleBot)4.37.140 MB0,7 s21,9 MB
python-telegram-bot22.844 MB0,9 s12,3 MB
aiogram3.31.0173 MB4,3 s33,9 MB
Python 3.12 allein9 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 pyTelegramBotAPI und importierst telebot. Das PyPI-Paket namens telebot ist ein anderes, kleines Projekt; trage pyTelegramBotAPI in requirements.txt ein.
  • 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() oder polling(): Nutze infinity_polling(). Das einfache polling() stoppt beim ersten Fehler von Telegram, und auch eine Exception in einem deiner Handler beendet es, der Bot beendet sich also. Mit infinity_polling() werden Fehler von Telegram wiederholt, und jede andere Exception in einem Handler wird als Infinity polling exception: ... protokolliert, bevor das Polling 3 Sekunden später neu startet.
  • Logging: pyTelegramBotAPI hat einen eigenen Logger, TeleBot, auf ERROR gestellt, 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 mit bot.infinity_polling(logger_level=logging.DEBUG) (und import 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: TeleBot nutzt requests und führt Handler standardmäßig in zwei Worker-Threads aus (num_threads=2); ein langsamer Handler blockiert einen davon. AsyncTeleBot aus telebot.async_telebot nutzt aiohttp und läuft mit asyncio.run(bot.polling()). Beide laufen im Panel gleich.
  • Eine zweite Kopie: Wenn eine andere Kopie mit demselben Token pollt, antwortet Telegram mit 409 Conflict, und infinity_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, was infinity_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.

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

UNSERE NEUESTEN BLOGS