Om een Telegram.Bot-bot (.NET) 24/7 te hosten, laat je hem draaien op een machine die altijd aan staat: een Linux-VPS met een systemd-service die hem opnieuw start als hij stopt, of een botabonnement bij PlayNHost Telegram-bothosting (vanaf US$1.99 per maand), waar je je C#-project uploadt, het token van @BotFather plakt en op Start drukt. In onze test gebruikte een bot met Telegram.Bot 22.10.3.3 ongeveer 61 MB geheugen onder .NET 8. Telegram.Bot ontvangt berichten via long polling, en dat is wat onze abonnementen nodig hebben: ze hebben nog geen openbaar HTTPS-adres voor een webhook. De stappen bij PlayNHost:
- Klik op de pagina Telegram-bothosting bij een abonnement op Server aanmaken. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies C# (.NET).
- 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 .NET Bot. te zeggen.
- Plak bij Verbinden met Telegram het token onder Plak je bottoken, klik op Verbinden, controleer de getoonde botnaam en klik op Ja, doorgaan.
- Klik bij Je code op Bestanden uploaden en upload
Bot.csprojenProgram.csnaar de hoofdmap, zonder de mappenbinenobj, of klik op Git koppelen. - Laat op de pagina Bot, in het deel Code, Runtime op .NET 8 (recommended) staan en laat Startbestand leeg.
- Klik op Bot starten en open Console. De server bouwt je project, daarna print je bot
Logged in as @your_boten de chip op Overzicht verandert in Online in Telegram. - Klik op de pagina Bot, in het deel Telegram, op Openen in Telegram en stuur je bot
/start.
Hoe je de bot aanmaakt in @BotFather en wat de stappen in het paneel zijn, lees je in Een Telegram-bot hosten, en het .NET-bottype in het algemeen (beide uploadmanieren, buildfouten) in Een C# (.NET) Discord-bot hosten. Deze pagina gaat over Telegram.Bot zelf: wat het op een server gebruikt en wat je moet weten voordat je het host.
Wat we gemeten hebben
| Bibliotheek | Versie | Geheugen zonder belasting | Start tot het antwoord van Telegram, met de build | Programmastart tot het antwoord van Telegram |
|---|---|---|---|---|
| Telegram.Bot | 22.10.3.3 | 61 MB | 1,5 s | 0,3 s |
| .NET 8 alleen, zonder bibliotheek | geen | 24 MB | 1,3 s (build en start, geen aanroep) | geen |
Hoe: op onze eigen node, in een wegwerpcontainer die was ingesteld als een botabonnement van 1 GB (het .NET 8-image en het startcommando van ons .NET-bottype, dat bij elke start dotnet publish uitvoert), riep de bot Telegrams getMe aan met een nep-token, wat Telegram weigerde. Het geheugen is het resident geheugen 15 seconden na dat antwoord, de eerste tijdskolom loopt van het begin van de build tot het antwoord, de tweede vanaf de programmastart, en elk getal is de mediaan van run 2 tot 4. De allereerste build, die ook het pakket downloadt, duurde 5 seconden.
Dit zijn ondergrenzen: nog geen chats, geen data en nog geen polling. Je eigen code, wat die in het geheugen houdt en het aantal chats komen erbovenop. Om de build bij elke start over te slaan, kun je in plaats van het project de bestanden uploaden die je op je eigen computer hebt gepubliceerd (zie de hierboven gelinkte C#-gids). Vergelijk de cijfers met de abonnementen op Telegram-bothosting en kies op basis van wat je bot doet.
Een minimale Telegram.Bot-bot
Hij antwoordt op /start, leest het token uit TELEGRAM_BOT_TOKEN (het paneel geeft het aan je code onder die naam en ook als BOT_TOKEN, TOKEN, TELEGRAM_TOKEN en TELOXIDE_TOKEN) en print een gereedregel. Twee bestanden in de hoofdmap:
Bot.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Telegram.Bot" Version="22.10.3.3" />
</ItemGroup>
</Project>
Program.cs
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Types;
const string TokenRefused = "Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart.";
string? token = Environment.GetEnvironmentVariable("TELEGRAM_BOT_TOKEN");
if (string.IsNullOrWhiteSpace(token))
{
Console.WriteLine("No TELEGRAM_BOT_TOKEN found. Paste your bot token on the Bot page, then restart.");
return 1;
}
var bot = new TelegramBotClient(token);
User me;
try
{
me = await bot.GetMe();
}
catch (ApiRequestException e) when (e.ErrorCode == 401)
{
Console.WriteLine(TokenRefused);
return 1;
}
// Long polling only: remove a webhook left on the bot. Messages that wait are kept.
await bot.DeleteWebhook();
// Without an OnError handler, polling errors never reach the console. Set it before OnMessage.
bot.OnError += async (exception, source) =>
{
if (exception is ApiRequestException { ErrorCode: 401 })
{
Console.WriteLine(TokenRefused);
Environment.Exit(1);
}
Console.WriteLine($"Polling error ({source}): {exception.Message}");
await Task.Delay(TimeSpan.FromSeconds(5));
};
// Setting OnMessage starts polling in the background.
bot.OnMessage += async (message, type) =>
{
if (message.Text?.StartsWith("/start") == true)
{
await bot.SendMessage(message.Chat, "Hello! I am running on PlayNHost.");
}
};
Console.WriteLine($"Logged in as @{me.Username}");
await Task.Delay(Timeout.Infinite);
return 0;
Bij elke start voert de server dotnet publish uit op Bot.csproj en start Bot.dll. De console toont [PlayNHost] Building your bot (the first build downloads packages and can take a minute), dan [PlayNHost] Starting your bot, dan Logged in as @your_bot, de regel waardoor de chip op Online in Telegram springt. Stop eerst elke kopie die je op je computer met het echte token draait, anders krijgen de twee kopieën 409 Conflict-fouten van Telegram.
Als het token fout is
In onze test faalde GetMe() van Telegram.Bot met een nep-token met deze fout:
ApiRequestException: Unauthorized
De bot hierboven vangt die weigering (foutcode 401) op, vóór het pollen en tijdens het pollen, en print in plaats daarvan Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart., waarna hij stopt met exitcode 1. Het paneel leest die regel en toont de banner Telegram heeft je bottoken niet geaccepteerd boven Console. Om het te herstellen stuur je in @BotFather /mybots, kies je je bot, dan API Token, en kopieer je het token opnieuw. Klik op de pagina Bot, in het deel Telegram, op Token vervangen, plak het, klik op Token opslaan en daarna op Nu herstarten.
Wat je moet weten over Telegram.Bot op een server
- Versies: Telegram.Bot 22.10.3.3 verscheen op 9 okt. 2026. Het richt zich op .NET Standard 2.0 en .NET 6, en de README raadt .NET 8 of nieuwer aan, dus elke Runtime die het paneel aanbiedt (.NET 6, 8, 9 of 10) bouwt het; .NET 8 (recommended) komt overeen met
net8.0hierboven. - De methodenamen verloren
Asyncin versie 22. Het is nuGetMe()enSendMessage(); tutorials metGetMeAsyncofSendTextMessageAsynczijn geschreven voor oudere versies, die namen bestaan niet in 22.10.3.3 en hun code bouwt niet. De buildfout staat net boven[PlayNHost] The build failed. Read the errors above, fix them and press Start.in Console. - Het instellen van
OnMessagestart het pollen. Zodra je een handler toevoegt aanOnMessage(ofOnUpdate), vraagt de client Telegram op de achtergrond om updates, en wel van elk updatetype. Voeg eerst deOnError-handler toe, zoals hierboven. - Zonder
OnErrorzijn fouten onzichtbaar. Als een poll mislukt, geeft Telegram.Bot de fout door aanOnError; zonder handler schrijft het die naar de traceoutput van .NET, die niet in de console komt. Een bot waarvan het token is ingetrokken, of die een andere kopie wegdrukt met409 Conflict, lijkt dan te draaien en antwoordt niets. De handler hierboven print elke fout en omdat Telegrams eigen tekst in het bericht staat, kan het paneel Je bot draait ook ergens anders of Er is een webhook ingesteld op je bot tonen. - Vertraag na een fout. De pollinglus vraagt direct opnieuw na een mislukt verzoek; hij wacht alleen zo lang als je
OnError-handler duurt. DeTask.Delayvan 5 seconden hierboven voorkomt dat een blijvende fout een stroom verzoeken wordt. Telegrams eigen429 Too Many Requests-antwoorden worden voor je herhaald als Telegram vraagt maximaal 60 seconden te wachten: standaard wordt een verzoek in totaal tot 3 keer geprobeerd. - Een webhook wordt niet voor je verwijderd. Pollen met een ingestelde webhook mislukt met
409 Conflict:can't use getUpdates method while webhook is active. De bot hierboven roeptDeleteWebhook()aan vóór het pollen, waardoor wachtende berichten bewaard blijven; je kunt ook op Webhook verwijderen klikken in het deel Telegram. Een eigen webhook heeft een openbaar HTTPS-adres nodig, dat onze abonnementen nog niet bevatten. Verhuizen van een webhook-host: Een Telegram-bot verhuizen naar PlayNHost. - Wacht niet met
Console.ReadLine(). De eerste bot in de gids van de bibliotheek blijft draaien tot je op Enter drukt. Op een server drukt niemand op Enter, en onder systemd is de invoer van het programma standaard leeg, dusReadLine()keert meteen terug en de bot eindigt. Wacht metawait Task.Delay(Timeout.Infinite), zoals hierboven. - Crashes: als de bot stopt, zoals de bot hierboven doet bij een geweigerd token, start het paneel hem direct opnieuw, en bouwt hem eerst opnieuw. Stopt hij binnen een minuut daarna weer, dan blijft hij gestopt en zegt Console waarom. Zie Telegram-bot 409 Conflict oplossen voor de twee soorten 409.
Zelf hosten op een Linux-VPS
Bouw de bot op een VPS op je eigen computer en laat alleen het resultaat op de server draaien. Publiceer hem met de .NET 8 SDK:
dotnet publish Bot.csproj -c Release -o publish
Op Ubuntu 24.04 zit de .NET 8-runtime in de eigen pakketten van Ubuntu:
sudo apt update
sudo apt install dotnet-runtime-8.0
dotnet --list-runtimes
Maak een gebruiker voor de bot en kopieer de map publish naar de server (bijvoorbeeld met scp -r), en dan naar de map van de bot:
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp -r publish/. /opt/mybot/
sudo chown -R mybot: /opt/mybot
Houd het token buiten je code, in een bestand dat alleen root kan lezen:
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env
Maak /etc/systemd/system/mybot.service aan:
[Unit]
Description=Telegram.Bot Telegram bot
Wants=network-online.target
After=network-online.target
[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/dotnet /opt/mybot/Bot.dll
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 mybot
sudo journalctl -u mybot -f
Restart=always start de bot 5 seconden nadat hij is gestopt of gecrasht opnieuw, maar niet nadat je hem met systemctl stop hebt gestopt. Publiceer om te updaten opnieuw, kopieer de nieuwe bestanden over de oude en voer sudo systemctl restart mybot uit. Op Debian zit .NET niet in de eigen pakketten van de distributie; de installatie-instructies van Microsoft behandelen dat.
Zelf hosten of een botabonnement
Op een VPS die je zelf beheert, regel je:
- Updates en beveiliging van het besturingssysteem, en upgrades van de .NET-runtime.
- Het publiceren en kopiëren van elke nieuwe build, het servicebestand, het tokenbestand en de rechten daarvan.
- Het lezen van
journalctlom te achterhalen waarom de bot is gestopt of niet meer antwoordt. - Back-ups van alles wat je bot opslaat.
In ruil daarvoor draait er op een VPS alles, en je kunt er een domein met HTTPS aan geven voor een webhook.
In een PlayNHost-botabonnement doet het paneel dit voor je:
- .NET 6, 8, 9 of 10 uit een keuzelijst, en de build: upload het project en druk op Start.
- Het token, bij Telegram gecontroleerd voordat het wordt opgeslagen, versleuteld bewaard en onder vijf namen aan je code gegeven.
- De bot opnieuw starten na een crash. Crasht hij binnen een minuut opnieuw, dan blijft hij gestopt en zegt Console waarom.
- Een knop Webhook verwijderen in het deel Telegram, en banners boven Console die de oorzaak noemen als een regel een geweigerd token, een andere kopie of een webhook toont.
- Upload, Git-deploys en back-ups vanuit het paneel.
Veelgestelde vragen
Mijn Telegram.Bot-bot draait maar antwoordt nooit. Waarom?
Meestal mislukt het pollen en meldt niets dat: zonder OnError-handler gaan de fouten naar de traceoutput van .NET, niet naar de console. Voeg de handler uit de bot hierboven toe en herstart. De gebruikelijke oorzaken zijn een andere kopie die met hetzelfde token pollt (409 Conflict), een webhook die nog op de bot staat, of een token dat in @BotFather is ingetrokken.
Kan ik Telegram.Bot hier met een webhook gebruiken?
Nog niet op onze abonnementen: een webhook heeft een openbaar HTTPS-adres nodig, dat ze niet bevatten. Pollen heeft er geen nodig, omdat de bot Telegram om nieuwe berichten vraagt, en dat is wat OnMessage doet.
Vertraagt de build bij elke start mijn bot?
Alleen de start: in onze test duurde de start 1,5 seconden met de build tegen 0,3 seconden voor het programma alleen. Als hij eenmaal draait, is de bot hetzelfde. Om de build over te slaan, publiceer je op je computer en upload je de bestanden uit de map publish in plaats van het project.
Welke .NET-versie moet ik kiezen?
.NET 8, de aanbevolen versie, met net8.0 in je project zoals hierboven. Telegram.Bot bouwt ook op .NET 6, 9 en 10; stel dezelfde versie in bij TargetFramework en bij Runtime. Een project voor een nieuwer .NET dan de Runtime stopt de build met NETSDK1045; een project voor een ouder .NET bouwt wel maar start niet, omdat dat .NET niet in het image is geïnstalleerd.
Klaar om je Telegram.Bot-bot de klok rond te laten draaien? Bekijk de abonnementen op Telegram-bothosting.



