NIEUW 📢 Beperkte lanceeractie: tot 70% korting op je eerste maand, voor elke game!Bekijk pakketten

Een pyTelegramBotAPI-bot 24/7 hosten

Telegram-bothostingUpdated Nov 6, 202611 min read

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:

  1. Stuur in Telegram /newbot naar @BotFather en kopieer het token dat je krijgt.
  2. 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.
  3. 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.
  4. Plak bij Verbinden met Telegram het token en klik op Verbinden. Controleer de getoonde botnaam en klik op Ja, doorgaan.
  5. Klik bij Je code op Bestanden uploaden om Files te openen en upload bot.py en requirements.txt, of klik op Git koppelen. In requirements.txt heet het pakket pyTelegramBotAPI, niet telebot.
  6. Controleer op de pagina Bot, in het deel Code, dat Startbestand het bestand is dat infinity_polling() aanroept (standaard bot.py) en dat Runtime Python 3.11 of nieuwer is.
  7. 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.

BibliotheekVersieGeheugen in rustStart tot antwoord van TelegramGeïnstalleerde grootte, met afhankelijkheden
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 alleen9 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 pyTelegramBotAPI en importeert telebot. Het PyPI-pakket met de naam telebot is een ander, klein project; zet pyTelegramBotAPI in requirements.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() of polling(): gebruik infinity_polling(). Gewone polling() stopt bij de eerste fout van Telegram, en een exception in een van je handlers beëindigt het ook, dus de bot sluit af. Met infinity_polling() worden fouten van Telegram opnieuw geprobeerd, en elke andere exception in een handler wordt gelogd als Infinity polling exception: ... voordat het pollen 3 seconden later opnieuw begint.
  • Logging: pyTelegramBotAPI heeft een eigen logger, TeleBot, ingesteld op ERROR, 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 met bot.infinity_polling(logger_level=logging.DEBUG) (en import 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: TeleBot gebruikt requests en draait handlers standaard in twee werkthreads (num_threads=2); een trage handler houdt er een vast. AsyncTeleBot uit telebot.async_telebot gebruikt aiohttp en draait met asyncio.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 Conflict en probeert infinity_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.txt als 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 doet infinity_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.

Draait je bot al ergens anders? Verhuis hem naar ons

ONZE NIEUWSTE BLOGS