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

Een python-telegram-bot-bot 24/7 hosten

Telegram-bothostingUpdated Nov 6, 202610 min read

Om een python-telegram-bot-bot 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, de token plakt en op Start drukt. In onze test gebruikte een python-telegram-bot 22.8-bot ongeveer 44 MB geheugen in rust; ons kleinste botabonnement, STARTER, heeft 0.5 GB. Beide wegen gebruiken long polling: run_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 de token die je krijgt.
  2. Klik op Telegram-bothosting bij een abonnement op Server aanmaken. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies Python.
  3. Open je server in het paneel. 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 de 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. Nog geen code? Starterbot maken schrijft een python-telegram-bot 22-bot voor je.
  6. Controleer op de pagina Bot, deelvenster Code, dat Startbestand het bestand is dat run_polling() aanroept (bot.py standaard).
  7. Klik op Bot starten, open Console en wacht op Logged in as @your_bot. De chip op Overzicht wordt Online in Telegram. Stuur je bot /start.

De eerste start duurt langer omdat pip python-telegram-bot installeert. Daarna installeert het alleen opnieuw als je requirements-bestand, de extra pakketten of de Python-versie veranderen, of eens per dag. Stap voor stap met screenshots: Een Telegram-bot hosten.

Wat we hebben gemeten

We lieten de drie Python-Telegram-bibliotheken draaien op een van onze eigen servers, in wegwerpcontainers die zo zijn ingesteld als het paneel een Python-bot uitvoert: 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
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 alleen9 MB

Elke bot laadde de bibliotheek en vroeg Telegram met een nep-token wie hij is (python-telegram-bot: Application.initialize()). Het geheugen is wat de processen van de bot 15 seconden nadat Telegram de token had geweigerd in gebruik hadden; de starttijd loopt van het starten van Python tot de bibliotheek dat antwoord meldt, en bevat dus éé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 data die hij in het geheugen houdt en het aantal chats dat hij bedient komen daar bovenop, dus kies het abonnement op basis van wat je bot doet. Onze oudere pagina python-telegram-bot vs aiogram op PlayNHost mat een andere opzet (Python 3.13, een kant-en-klare bot die klaar was om te starten), dus die cijfers zijn niet vergelijkbaar met deze.

Een minimale python-telegram-bot-bot

Hij antwoordt op /start, leest de token die het paneel hem geeft en print een klaar-regel. Zet de bibliotheek in requirements.txt:

python-telegram-bot>=22,<23

En de 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 draait nadat de applicatie is geïnitialiseerd, en dat is het moment waarop python-telegram-bot de token bij Telegram controleert, dus Logged in as @your_bot verschijnt pas als Telegram hem heeft geaccepteerd. Het paneel leest die regel om Online in Telegram te tonen. Het paneel geeft de token aan je code als TELEGRAM_BOT_TOKEN, en ook als BOT_TOKEN, TOKEN en TELEGRAM_TOKEN, dus os.environ["TOKEN"] werkt ook als je begint met de voorbeelden van de bibliotheek, die een plaatshouder "TOKEN" gebruiken.

Als de token fout is

In onze test, met een token die Telegram weigert, printte onze testbot:

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

python-telegram-bot controleert de token voordat het pollen begint, dus de bot hierboven stopt meteen met exitcode 1. De console toont eerst Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. met een traceback, daarna de traceback van de fout zelf, waarvan de laatste regel luidt telegram.error.InvalidToken: The token `...` was rejected by the server. Bij PlayNHost toont het paneel boven de console Telegram heeft je bottoken niet geaccepteerd, met Token vervangen. Let op: beide tracebacks bevatten de token zelf, plak die console-uitvoer dus nergens openbaar.

Om het op te lossen kopieer je de token opnieuw: stuur in @BotFather /mybots, kies je bot en dan API Token. Plak hem op de pagina Bot, deelvenster Telegram, onder Token, en start de bot opnieuw. Als de token wordt ingetrokken terwijl de bot al aan het pollen is, logt python-telegram-bot Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. en stopt het pollen, maar het proces blijft draaien, dus de bot lijkt te draaien terwijl niets antwoordt. Het paneel toont dezelfde banner.

Wat een host moet weten over python-telegram-bot

  • Pakket- en importnamen: je installeert python-telegram-bot en importeert telegram en telegram.ext.
  • Python-versie: python-telegram-bot 22.8 heeft Python 3.10 of nieuwer nodig. De Runtime in het deelvenster Code biedt 3.10 tot 3.14, met 3.12 als aanbevolen gemarkeerd, dus elke keuze voldoet.
  • Een webhook van een andere host: voordat het begint met pollen, verwijdert run_polling() elke webhook die op de bot staat, dus een bot die van een webhook-host komt werkt zonder extra code. Berichten die bij Telegram wachten blijven bewaard, tenzij je drop_pending_updates=True meegeeft.
  • Logging: python-telegram-bot logt zijn start op niveau INFO, dat Python pas toont als je logging instelt, dus de bot hierboven print zijn eigen klaar-regel. Met logging.basicConfig(level=logging.INFO) logt hij INFO:telegram.ext.Application:Application started, wat het paneel ook als klaar leest. Als je dat doet, voeg dan ook logging.getLogger("httpx").setLevel(logging.WARNING) toe, zoals de eigen voorbeelden van de bibliotheek doen: op niveau INFO logt de HTTP-bibliotheek elke aanvraag-URL, en de aanvraag-URL's van Telegram bevatten je token.
  • Geplande taken: de JobQueue heeft een extra nodig. Schrijf python-telegram-bot[job-queue]>=22,<23 in requirements.txt; zonder dat is application.job_queue gelijk aan None en waarschuwt de bibliotheek No `JobQueue` set up.
  • Een tweede kopie: als een andere kopie met dezelfde token pollt, antwoordt Telegram 409 Conflict. python-telegram-bot logt Exception happened while polling for updates. en blijft het opnieuw proberen, dus de bot lijkt te draaien maar mist berichten. Het paneel 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 en installeer de bibliotheek in een virtuele omgeving. Controleer dat python3 --version 3.10 of nieuwer zegt.

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 de 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 (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

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 de journal te bereiken. systemctl stop tgbot stuurt SIGTERM, wat run_polling() afhandelt door netjes af te sluiten. Voer na het wijzigen van de code sudo systemctl restart tgbot uit. Stop eerst elke kopie op je pc, anders antwoordt Telegram 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, de journal lezen en merken wanneer de bot niet meer antwoordt. In ruil heb je root en kun je een webhook draaien als je een domein en HTTPS toevoegt.
  • Bij een botabonnement doet het paneel: requirements.txt installeren wanneer het verandert, de bot opnieuw starten na een crash, de token bij Telegram controleren voordat hij wordt opgeslagen, hem onder vijf namen aan je code geven, de console lezen en de oorzaak benoemen wanneer de bot niet meer antwoordt (een geweigerde token, een tweede kopie, een webhook), met een knop voor de token en de webhook. Onze botabonnementen bevatten nog geen openbaar HTTPS-adres, dus bots daar gebruiken long polling, en dat is wat run_polling() doet.

Zie ook Een MySQL-database gebruiken met een python-telegram-bot-bot (aiomysql).

Veelgestelde vragen

Heb ik een webhook nodig om een python-telegram-bot-bot online te houden?

Nee. run_polling() houdt een verbinding met Telegram open en vraagt om nieuwe berichten, dus de bot antwoordt zolang het proces draait. Een webhook heeft een openbaar HTTPS-adres nodig, dat onze botabonnementen nog niet bevatten. Een bot verhuizen die er een gebruikte: Een Telegram-bot verhuizen naar PlayNHost.

Waarom verscheen mijn token in de console?

Hij verschijnt op twee veelvoorkomende plekken: de melding InvalidToken wanneer Telegram de token weigert, en de aanvraagregels van de HTTP-bibliotheek wanneer logging op INFO staat. Zet de httpx-logger op WARNING, zoals hierboven getoond. Onze starterbot vangt ook InvalidToken af en print in plaats daarvan een gewone regel.

Kan ik run_repeating en andere geplande taken gebruiken?

Ja, met het extra job-queue in requirements.txt. Het extra installeert APScheduler bij de volgende start, omdat het requirements-bestand is gewijzigd. Taken draaien binnen het botproces, dus ze blijven draaien zolang de bot draait.

Gebruikt de starterbot python-telegram-bot?

Ja. Op een Python-server schrijft Starterbot maken bot.py en een requirements.txt met python-telegram-bot 22. Hij antwoordt op /start, print Logged in as @your_bot en houdt de token uit zijn logregels. Pas hem aan zoals je wilt en start dan opnieuw.

python-telegram-bot 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