Om een pyTelegramBotAPI-bot (telebot) 24/7 te hosten, laat je hem draaien op een machine die aan blijft in plaats van op je pc: een Linux-VPS met een systemd-service die hem na een crash of herstart opnieuw start, of een PlayNHost-botabonnement (vanaf US$1.99 per maand, zie Telegram-bothosting), waar je je code uploadt, het token plakt en op Start drukt. In onze test gebruikte een bot met pyTelegramBotAPI 4.37.1 ongeveer 40 MB geheugen in rust; ons kleinste botabonnement, STARTER, heeft 0,5 GB. Beide routes gebruiken long polling: bot.infinity_polling() vraagt Telegram om nieuwe berichten, dus de bot heeft geen openbaar adres nodig. De stappen bij PlayNHost:
- Stuur in Telegram
/newbotnaar @BotFather en kopieer het token dat je krijgt. - Klik bij Telegram-bothosting op Server aanmaken bij een abonnement. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies Python.
- Open je server in het panel. De kaart Je bot instellen op Overzicht opent bij Verbinden met Telegram; de eerste stap, Wat er draait, hoort Deze bot draait Python Bot. te zeggen.
- Plak bij Verbinden met Telegram het token en klik op Verbinden. Controleer de getoonde botnaam en klik op Ja, doorgaan.
- Klik bij Je code op Bestanden uploaden om Files te openen en upload
bot.pyenrequirements.txt, of klik op Git koppelen. Inrequirements.txtheet het pakketpyTelegramBotAPI, niettelebot. - Controleer op de pagina Bot, in het deel Code, dat Startbestand het bestand is dat
infinity_polling()aanroept (standaardbot.py) en dat Runtime Python 3.11 of nieuwer is. - Klik op Bot starten, open Console en wacht op
Logged in as @your_bot. Het label op Overzicht verandert in Online in Telegram. Stuur je bot/start.
De eerste start duurt langer terwijl pip pyTelegramBotAPI installeert. Daarna installeert hij alleen opnieuw als je requirements-bestand, de extra pakketten of de Python-versie veranderen, of eenmaal per dag. Stap voor stap met screenshots: Een Telegram-bot hosten.
Wat we hebben gemeten
We lieten de drie Python-Telegrambibliotheken draaien op een van onze eigen servers, in wegwerpcontainers die zijn ingesteld zoals het panel een Python-bot draait: Python 3.12 (de als aanbevolen gemarkeerde Runtime), pakketten geïnstalleerd met hetzelfde pip-commando, een geheugenlimiet van 1 GB en één CPU-kern.
| Bibliotheek | Versie | Geheugen in rust | Start tot antwoord van Telegram | Geïnstalleerde grootte, met afhankelijkheden |
|---|---|---|---|---|
| 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 alleen | 9 MB |
Elke bot laadde de bibliotheek en vroeg Telegram met een nep-token wie hij is (pyTelegramBotAPI: bot.get_me() op de gewone TeleBot). Het geheugen is wat de processen van de bot vasthielden 15 seconden nadat Telegram het token weigerde; de starttijd loopt vanaf het starten van Python tot de bibliotheek dat antwoord meldt, dus hij bevat één heen-en-terugreis naar Telegram. Beide zijn de mediaan van drie runs na een opwarmrun.
Deze cijfers zijn de ondergrens van de bibliotheek: geen chats, geen handlers aan het werk, niets in de cache. Je eigen code, de gegevens die hij in het geheugen houdt en het aantal chats dat hij bedient komen erbovenop, dus kies het abonnement op basis van wat je bot doet. De geïnstalleerde grootte omvat beide HTTP-bibliotheken waar pyTelegramBotAPI van afhangt, requests en aiohttp, ook als je alleen de gewone TeleBot gebruikt.
Een minimale pyTelegramBotAPI-bot
Hij antwoordt op /start, leest het token dat het panel hem geeft en print een gereedregel. Zet de bibliotheek in requirements.txt:
pyTelegramBotAPI>=4,<5
En de 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()
De twee aanroepen vóór het pollen zijn belangrijk op een host. delete_webhook() verwijdert een webhook die van een andere host is overgebleven, en bot.user vraagt Telegram wie de bot is, zodat Logged in as @your_bot alleen verschijnt met een token dat Telegram accepteert. Het panel leest die regel om Online in Telegram te tonen. Beide aanroepen stoppen de bot ook meteen met een duidelijke fout als het token verkeerd is, in plaats van het pollen het op de achtergrond te laten herhalen. Het panel geeft het token aan je code als TELEGRAM_BOT_TOKEN, en ook als BOT_TOKEN, TOKEN en TELEGRAM_TOKEN.
Als het token verkeerd is
In onze test, met een token dat Telegram weigert, printte onze testbot:
ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized
In een volledige traceback heet de klasse telebot.apihelper.ApiTelegramException. Met de bot hierboven mislukt de eerste aanroep en stopt de bot met exitcode 1; bij PlayNHost toont het panel Telegram heeft je bottoken niet geaccepteerd boven de console, met Token vervangen. Kopieer het token opnieuw om het op te lossen: stuur in @BotFather /mybots, kies je bot en dan API Token. Plak het op de pagina Bot, in het deel Telegram, onder Token, en start de bot opnieuw.
Een bot die meteen infinity_polling() aanroept, zoals de meeste voorbeelden doen, gedraagt zich anders: hij stopt niet. Het pollen vraagt eerst Telegram wie de bot is; met een geweigerd token mislukt dat, en de bot logt Infinity polling exception: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized en probeert het elke 3 seconden opnieuw, zolang het proces draait. Een token dat wordt ingetrokken terwijl de bot al pollt, geeft in plaats daarvan Threaded polling exception: met hetzelfde bericht, opnieuw geprobeerd na een wachttijd die elke keer verdubbelt, tot een minuut. In beide gevallen lijkt de bot te draaien terwijl niets antwoordt. Het panel herkent beide regels en toont dezelfde banner.
Wat een host moet weten over pyTelegramBotAPI
- Pakket- en importnamen: je installeert
pyTelegramBotAPIen importeerttelebot. Het PyPI-pakket met de naamtelebotis een ander, klein project; zetpyTelegramBotAPIinrequirements.txt. - Python-versie: pyTelegramBotAPI 4.37.1 vereist Python 3.11 of nieuwer. Op Python 3.10 mislukt pip niet: hij installeert 4.37.0, de laatste release die 3.10 toestond. Houd Runtime in het deel Code op 3.11 of nieuwer (3.12 is als aanbevolen gemarkeerd) om de huidige release te krijgen.
infinity_polling()ofpolling(): gebruikinfinity_polling(). Gewonepolling()stopt bij de eerste fout van Telegram, en een exception in een van je handlers beëindigt het ook, dus de bot sluit af. Metinfinity_polling()worden fouten van Telegram opnieuw geprobeerd, en elke andere exception in een handler wordt gelogd alsInfinity polling exception: ...voordat het pollen 3 seconden later opnieuw begint.- Logging: pyTelegramBotAPI heeft een eigen logger,
TeleBot, ingesteld opERROR, dus hij print niets bij het starten; daarom print de bot hierboven zijn eigen gereedregel. Fouten verschijnen als één regel zonder de traceback. Om te zien waar een handler faalde, start je metbot.infinity_polling(logger_level=logging.DEBUG)(enimport logging), wat de traceback toevoegt. Deze regels verbergen het geheime deel van je token. - Een webhook van een andere host: pollen verwijdert hem niet, en Telegram weigert pollen zolang er een is ingesteld. Houd
bot.delete_webhook()zoals hierboven, of klik op Webhook verwijderen op de pagina Bot, in het deel Telegram. - Threads of asyncio:
TeleBotgebruikt requests en draait handlers standaard in twee werkthreads (num_threads=2); een trage handler houdt er een vast.AsyncTeleBotuittelebot.async_telebotgebruikt aiohttp en draait metasyncio.run(bot.polling()). Beide draaien op dezelfde manier in het panel. - Een tweede kopie: als een andere kopie met hetzelfde token pollt, antwoordt Telegram met
409 Conflicten probeertinfinity_polling()het opnieuw zolang het draait. Het panel toont Je bot draait ook ergens anders. Zie Telegram-bot 409 Conflict oplossen.
Zelf hosten op een Linux-VPS
Installeer op Debian of Ubuntu Python, maak een gebruiker voor de bot aan en installeer de bibliotheek in een virtuele omgeving. Controleer eerst python3 --version: onder 3.11 installeert pip een oudere 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
Zet het token in een bestand dat alleen root kan lezen. Open het met sudo nano /etc/tgbot.env, schrijf één regel, sla op en voer dan sudo chmod 600 /etc/tgbot.env uit:
TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather
Maak /etc/systemd/system/tgbot.service aan:
[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
Start hem nu en bij elke boot en volg dan zijn uitvoer:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 is hier belangrijk: als de uitvoer van Python niet naar een terminal gaat, wordt die in blokken gebufferd, dus zonder dit kan Logged in as in een buffer blijven hangen in plaats van het journal te bereiken. Restart=always start de bot ook 5 seconden nadat hij stopt door een verkeerd token opnieuw, controleer dus het journal als hij blijft herstarten. Voer na een codewijziging sudo systemctl restart tgbot uit. Stop eerst elke kopie op je pc, anders antwoordt Telegram met 409 Conflict.
Zelf hosten of een botabonnement
- Op een VPS die je zelf beheert: systeemupdates, de Python-versie, de virtuele omgeving, pakketten opnieuw installeren, het unitbestand, het journal lezen en merken wanneer de bot niet meer antwoordt. In ruil daarvoor heb je root en kun je een webhook draaien als je een domein en HTTPS toevoegt.
- Bij een botabonnement doet het panel: het installeert
requirements.txtals het verandert, start de bot na een crash opnieuw, controleert het token bij Telegram voordat het wordt opgeslagen, geeft het onder vijf namen aan je code, leest de console en noemt de oorzaak als de bot niet meer antwoordt (een geweigerd token, een tweede kopie, een webhook), met een knop voor het token en de webhook. Onze botabonnementen bevatten nog geen openbaar HTTPS-adres, dus bots daar gebruiken long polling, en dat doetinfinity_polling().
Vragen die mensen stellen
Waarom draait mijn telebot-bot maar antwoordt hij nooit?
Omdat infinity_polling() elke fout van Telegram opnieuw probeert zonder te stoppen: een geweigerd token, een andere kopie met hetzelfde token, een webhook die op de bot is blijven staan. Zoek naar regels met Infinity polling exception (een token dat bij het starten is geweigerd) of Threaded polling exception (zodra het pollen draait) in de Console; het panel maakt van elk van de drie oorzaken een banner die haar noemt.
Ik krijg ModuleNotFoundError: No module named 'telebot'. Wat ontbreekt er?
Het pakket. Voeg pyTelegramBotAPI toe aan requirements.txt en start de bot opnieuw: het requirements-bestand is veranderd, dus pip installeert het bij die start. De import blijft import telebot.
Heeft pyTelegramBotAPI een webhook nodig om online te blijven?
Nee. infinity_polling() blijft Telegram om nieuwe berichten vragen, dus de bot antwoordt zolang het proces draait. Een bot verhuizen die een webhook gebruikte: Een Telegram-bot verhuizen naar PlayNHost.
Moet ik TeleBot of AsyncTeleBot gebruiken?
Beide draaien op een botabonnement. Gebruik wat je code of tutorial gebruikt: bij TeleBot zijn de handlers gewone functies, bij AsyncTeleBot zijn het async def-functies die de methoden van de bot awaiten. Onze meting hierboven is voor de gewone TeleBot.
pyTelegramBotAPI draait op elk PlayNHost-botabonnement, vanaf STARTER (0,5 GB). Vergelijk de abonnementen en klik op Server aanmaken bij Telegram-bothosting.



