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

Een aiogram-bot 24/7 hosten met een botabonnement of Linux-VPS

Telegram-bothostingUpdated Nov 6, 202611 min read

Om een aiogram-bot 24/7 te hosten, draai je hem 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 aiogram 3.31.0-bot zo'n 173 MB geheugen in rust; ons kleinste botabonnement, STARTER, heeft 0,5 GB. Beide routes gebruiken long polling: dp.start_polling(bot) 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 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 melden.
  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.
  6. Controleer op de pagina Bot, in het deel Code, dat het Startbestand het bestand is dat asyncio.run(main()) uitvoert (standaard bot.py).
  7. Klik op Bot starten, open de Console en wacht op de regel van aiogram Run polling for bot @your_bot. De chip op Overzicht springt naar Online in Telegram. Stuur je bot /start.

De eerste start duurt langer omdat pip aiogram en de afhankelijkheden 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 draaiden de drie Python-Telegrambibliotheken op een van onze eigen servers, in wegwerpcontainers ingesteld zoals het paneel een Python-bot draait: Python 3.12 (de Runtime die als aanbevolen is gemarkeerd), pakketten geïnstalleerd met hetzelfde pip-commando, een geheugenlimiet van 1 GB en één CPU-kern.

BibliotheekVersieGeheugen in rustVan start tot antwoord van TelegramGeïnstalleerde grootte, met afhankelijkheden
aiogram3.31.0173 MB4,3 s33,9 MB
python-telegram-bot22.844 MB0,9 s12,3 MB
pyTelegramBotAPI4.37.140 MB0,7 s21,9 MB
Alleen Python 3.129 MB

Elke bot laadde de bibliotheek en vroeg Telegram met een nep-token wie hij is (aiogram: bot.get_me()). Het geheugen is wat de processen van de bot 15 seconden nadat Telegram het token weigerde 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 warming-uprun.

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 (bijvoorbeeld gespreksstatussen in de geheugenopslag van aiogram) en het aantal chats dat hij bedient komen erbovenop, dus kies het abonnement op basis van wat je bot doet. Onze oudere pagina python-telegram-bot vs aiogram op PlayNHost mat een andere opstelling (Python 3.13, een kant-en-klare bot die klaarstond om te starten), dus de cijfers daar zijn niet vergelijkbaar met deze.

Een minimale aiogram-bot

Hij antwoordt op /start, leest het token dat het paneel hem geeft en logt een gereedregel. Zet de bibliotheek in requirements.txt:

aiogram>=3,<4

En de code in bot.py:

import asyncio
import logging
import os
import sys

from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

dp = Dispatcher()


@dp.message(CommandStart())
async def start(message: Message) -> None:
    await message.answer("Hello! I am running on PlayNHost.")


async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"])
    async with bot.context():
        await bot.delete_webhook()
        await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Hij leest BOT_TOKEN, de naam die de eigen voorbeelden van aiogram gebruiken; het paneel geeft je code het token onder die naam en ook als TELEGRAM_BOT_TOKEN, TOKEN en TELEGRAM_TOKEN. Loggen op INFO zorgt dat aiogram een regel afdrukt die begint met INFO:aiogram.dispatcher:Run polling for bot @your_bot zodra Telegram het token heeft geaccepteerd, en het paneel leest die regel om Online in Telegram te tonen, dus je hebt geen eigen print nodig. delete_webhook() verwijdert een webhook die van een andere host is overgebleven voordat het polling begint. async with bot.context() sluit de verbinding van de bot met Telegram als main() eindigt, ook als het met een fout eindigt.

Als het token fout is

In onze test, met een token dat Telegram weigert, drukte onze testbot dit af:

TelegramUnauthorizedError: Telegram server says - Unauthorized

In een volledige traceback heet de klasse aiogram.exceptions.TelegramUnauthorizedError. De eerste aanroep naar Telegram mislukt (in de bot hierboven delete_webhook(); zonder die aanroep de getMe die start_polling doet), dus de bot stopt meteen met exitcode 1. Bij PlayNHost toont het paneel Telegram heeft je bottoken niet geaccepteerd boven de console, met Token vervangen.

Kopieer het token opnieuw om het te herstellen: 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.

Twee andere gevallen zien er anders uit. Een token met een spatie, of zonder het nummer van de bot en een dubbele punt voor het geheim, mislukt vóór enig verzoek: Bot() controleert de vorm en geeft TokenValidationError met een bericht dat begint met Token is invalid!. Een token dat wordt ingetrokken terwijl de bot al pollt, stopt hem niet: aiogram logt Failed to fetch updates - TelegramUnauthorizedError en probeert het om de paar seconden opnieuw, dus het proces lijkt te draaien terwijl niets antwoordt. De banner in het paneel is hoe je het merkt.

Wat een host over aiogram moet weten

  • Pakket- en importnamen: beide zijn aiogram. Het installeert aiohttp, pydantic, magic-filter, aiofiles en certifi mee.
  • Python-versie: aiogram 3.31 heeft Python 3.10 tot 3.14 nodig. De Runtime in het deel Code biedt precies 3.10 tot 3.14, met 3.12 als aanbevolen gemarkeerd.
  • aiogram 2-code draait niet op aiogram 3: de Executor is verwijderd, dus executor.start_polling(dp) wordt await dp.start_polling(bot). Een tutorial waarvan de requirements.txt een 2.x-versie vastzet, zoals aiogram==2.25.2, is code voor versie 2; zie de vraag hieronder.
  • Een webhook die van een andere host is overgebleven: start_polling verwijdert hem niet, en Telegram weigert polling zolang er een is ingesteld, dus aiogram logt TelegramConflictError en probeert het opnieuw. Houd await bot.delete_webhook() zoals hierboven, of klik op de pagina Bot, in het deel Telegram, op Webhook verwijderen.
  • Logging: zonder logging.basicConfig worden de INFO-regels van aiogram, inclusief de gereedregel, niet getoond. Op INFO logt het ook één regel per update (Update id=... is handled); voeg bij een drukke bot logging.getLogger("aiogram.event").setLevel(logging.WARNING) toe, wat de gereedregel behoudt.
  • Welke updates binnenkomen: tenzij je allowed_updates meegeeft, vraagt start_polling Telegram alleen om de updatetypen waarvoor je handlers hebt.
  • Een tweede kopie: als een andere kopie met hetzelfde token pollt, antwoordt Telegram met 409 Conflict en probeert aiogram het opnieuw zolang het draait. 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 aiogram in een virtuele omgeving. Controleer dat python3 --version 3.10 tot 3.14 meldt.

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:

BOT_TOKEN=123456789:your-token-from-botfather

Maak /etc/systemd/system/tgbot.service aan:

[Unit]
Description=Telegram bot (aiogram)
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 de uitvoer:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f

De logregels komen direct in het journal terecht; PYTHONUNBUFFERED=1 doet hetzelfde voor elke print() die je toevoegt en die Python anders in een buffer vasthoudt als hij niet naar een terminal schrijft. systemctl stop tgbot stuurt SIGTERM, wat start_polling afhandelt door het polling te stoppen en de sessie van de bot te sluiten. Voer na het wijzigen van de code 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 heb je root en kun je de webhookmodus van aiogram gebruiken als je een domein en HTTPS toevoegt.
  • Bij een botabonnement doet het paneel dat: het installeert requirements.txt als die verandert, start de bot opnieuw na een crash, 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 is wat start_polling doet.

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

Veelgestelde vragen

Kan ik een aiogram 2-bot draaien?

Port hem naar aiogram 3 als het kan: de migratiegids van aiogram somt de wijzigingen op, te beginnen met de verwijderde Executor. De laatste aiogram 2-release, 2.25.2, kwam uit op 6 oktober 2023. Ze noemt Python 3.7 tot 3.10 als ondersteund en heeft aiohttp ouder dan 3.9 nodig, dat PyPI alleen tot Python 3.11 als kant-en-klare pakketten aanbiedt. Als je de oude code moet laten draaien voordat je hem port, zet dan aiogram==2.25.2 vast in requirements.txt en stel de Runtime in op Python 3.10, de nieuwste versie die ze noemt.

Waarom lijkt mijn aiogram-bot te draaien maar antwoordt hij nooit?

aiogram blijft het proberen zodra het polling is gestart: bij een in @BotFather ingetrokken token, bij een andere kopie met hetzelfde token en bij een webhook die op de bot is blijven staan. Lees de regels die beginnen met Failed to fetch updates in de Console; het paneel maakt van elk van de drie een banner die de oorzaak noemt, met een knop voor het token en de webhook.

Waar leven de FSM-statussen van aiogram?

Bij de standaard geheugenopslag in het botproces: ze gaan verloren als de bot herstart, bijvoorbeeld nadat je de code hebt gewijzigd. Gebruik om ze te bewaren een opslag buiten het proces, zoals de Redis-opslag van aiogram met een Redis-server die je kunt bereiken.

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

Nee. start_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.

aiogram 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