Om een TelegramBots-bot (Java) 24/7 te hosten, draai je hem op een machine die altijd aan blijft: een Linux-VPS met een systemd-service die hem opnieuw start als hij stopt, of een botplan bij PlayNHost Telegram-bothosting (vanaf 1,99 US$ per maand), waar je één uitvoerbare jar uploadt, het token van @BotFather plakt en op Start drukt. In onze test gebruikte een bot op TelegramBots 10.3.0, de Java-bibliotheek van rubenlagus, ongeveer 91 MB geheugen op Java 21 en kreeg hij het antwoord van Telegram 1,5 seconde na het starten. Gebruik de long-pollingmodule: onze plannen hebben nog geen openbaar HTTPS-adres voor een webhook. De stappen bij PlayNHost:
- Klik op de pagina Telegram-bothosting bij een plan op Server aanmaken. Beantwoord in het bestelvenster Voor welk platform is je bot? met Telegram en kies Java.
- Bouw de bot op je computer met de
pom.xmlhieronder:mvn packageschrijfttarget/bot.jar, met TelegramBots erin. - 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 Java 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.jarnaar de hoofdmap. - Controleer op de pagina Bot, paneel Code, of Startbestand
bot.jaris en Runtime Java 21 (recommended), of Java 17 of 25. Als je Startbestand wijzigt, klik je ernaast op Opslaan; een nieuwe Runtime wordt opgeslagen zodra je hem kiest. - Klik op Bot starten en open Console. Wanneer je bot
Logged in as @your_botafdrukt, springt de chip op Overzicht naar Online in Telegram. - Klik op de pagina Bot, paneel Telegram, op Openen in Telegram en stuur je bot
/start.
Het maken van de bot in @BotFather en de paneelstappen worden uitgelegd in Een Telegram-bot hosten. Deze pagina gaat over TelegramBots zelf: wat het op een server gebruikt en wat je moet weten voordat je het host.
Wat we hebben gemeten
| Bibliotheek | Versie | Geheugen zonder belasting | Start tot antwoord van Telegram | Jar-grootte |
|---|---|---|---|---|
| TelegramBots (rubenlagus) | 10.3.0 | 91 MB | 1,5 s | 9,6 MB |
| Alleen Java 21, geen bibliotheek | 21.0.12.1 | 38 MB | geen | 0,0 MB |
Hoe: op onze eigen node, in een wegwerpcontainer ingesteld als een botplan van 1 GB (de Java 21-image en het exacte java-commando van ons Java-bottype), riep de bot getMe van Telegram aan met een nep-token, dat Telegram weigerde; het geheugen is het resident geheugen 15 seconden na dat antwoord, de starttijd loopt van de start tot het antwoord en elke waarde is de mediaan van de runs 2 tot 4.
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, en het startscript laat de Java-heap groeien tot 80 procent van het plan (zie hieronder). Vergelijk de cijfers met de plannen op Telegram-bothosting en kies op basis van wat je bot doet.
Een minimale TelegramBots-bot
Hij antwoordt op /start, leest het token uit TELEGRAM_BOT_TOKEN (het paneel geeft het onder die naam aan je code en ook als BOT_TOKEN, TOKEN, TELEGRAM_TOKEN en TELOXIDE_TOKEN) en drukt een klaar-regel af. Twee bestanden:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>bot</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-longpolling</artifactId>
<version>10.3.0</version>
</dependency>
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-client</artifactId>
<version>10.3.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
<build>
<finalName>bot</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.7.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>Bot</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
src/main/java/Bot.java
import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient;
import org.telegram.telegrambots.longpolling.TelegramBotsLongPollingApplication;
import org.telegram.telegrambots.longpolling.util.DefaultLongPollingUpdateConsumer;
import org.telegram.telegrambots.meta.api.methods.GetMe;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.User;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException;
import org.telegram.telegrambots.meta.generics.TelegramClient;
public class Bot extends DefaultLongPollingUpdateConsumer {
private final TelegramClient client;
Bot(TelegramClient client) {
this.client = client;
}
@Override
public void consume(Update update) {
if (update.hasMessage() && update.getMessage().hasText()
&& update.getMessage().getText().startsWith("/start")) {
SendMessage reply = SendMessage.builder()
.chatId(update.getMessage().getChatId())
.text("Hello! I am running on PlayNHost.")
.build();
try {
client.execute(reply);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
String token = System.getenv("TELEGRAM_BOT_TOKEN");
if (token == null || token.isBlank()) {
System.out.println("No TELEGRAM_BOT_TOKEN found. Paste your bot token on the Bot page, then restart.");
System.exit(1);
}
TelegramClient client = new OkHttpTelegramClient(token);
User me = null;
try {
me = client.execute(new GetMe());
} catch (TelegramApiRequestException e) {
if (e.getErrorCode() != null && e.getErrorCode() == 401) {
System.out.println("Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart.");
System.exit(1);
}
throw e;
}
try (TelegramBotsLongPollingApplication app = new TelegramBotsLongPollingApplication()) {
// Long polling: registerBot removes a webhook left on the bot, then asks Telegram for messages.
app.registerBot(token, new Bot(client));
System.out.println("Logged in as @" + me.getUserName());
Thread.currentThread().join();
}
}
}
Bouw hem met Maven 3.9 en een JDK 17 of nieuwer en test de jar op je computer:
mvn package
java -jar target/bot.jar
Zonder token drukt hij No TELEGRAM_BOT_TOKEN found. af en stopt, wat bewijst dat de jar start en zijn hoofdklasse vindt. Upload target/bot.jar. Stop elke kopie die je op je computer met het echte token draait voordat je die op de server start, anders krijgen beide kopieën 409 Conflict-fouten van Telegram.
De aanroep getMe controleert het token voordat het polling begint en geeft de gebruikersnaam van de bot voor de klaar-regel. Logged in as @your_bot is de regel die de chip naar Online in Telegram zet.
Als het token fout is
In onze test faalde de getMe-aanroep van TelegramBots met een nep-token met deze fout:
TelegramApiRequestException: Error executing org.telegram.telegrambots.meta.api.methods.GetMe query: [401] Unauthorized
De bot hierboven vangt die weigering op (foutcode 401) en drukt in plaats daarvan Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. af. 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, paneel Telegram, op Token vervangen, plak het, klik op Token opslaan en dan op Nu herstarten.
Wat je moet weten over TelegramBots op een server
- Versies: TelegramBots 10.3.0 verscheen op 7 sep 2026 en ondersteunt Telegrams Bot API 10.3. Het heeft Java 17 of nieuwer nodig, dus elke Runtime die het paneel aanbiedt (Java 17, 21 of 25) draait het.
- Twee pakketten, anders dan in oudere tutorials. Sinds versie 7.0.0 (maart 2024) bestaat de bibliotheek uit
telegrambots-longpolling, dat berichten ontvangt, entelegrambots-client, dat ze verstuurt. Tutorials dieTelegramLongPollingBotuitbreiden, zijn geschreven voor het oude pakkettelegrambots, voor het laatst uitgebracht als 6.9.7.1; die klasse zit niet in 10.3.0, dus hun code compileert er niet mee. - Gebruik long polling. De bibliotheek heeft ook een webhookmodule, maar een webhook heeft een openbaar HTTPS-adres nodig, dat onze plannen nog niet bevatten.
registerBotin de long-pollingmodule roeptdeleteWebhookaan voordat het start, dus een webhook die van een oude host is blijven staan wordt verwijderd en de wachtende berichten blijven bewaard. Verhuizen van een webhook-host: Een Telegram-bot verhuizen naar PlayNHost. - Voeg een logbibliotheek toe, anders blijft de bibliotheek stil. TelegramBots logt via SLF4J. Zonder SLF4J-provider in je jar drukt SLF4J één keer een waarschuwing af en gooit daarna elke logregel van de bibliotheek weg, ook de fouten van het polling. De
pom.xmlhierboven voegtslf4j-simpletoe, dat de regels van de bibliotheek vanaf INFO naar standard error schrijft, zodat ze in Console verschijnen. - Pollingfouten worden opnieuw geprobeerd, niet gegooid. Als een
getUpdates-aanroep mislukt, logt TelegramBotsError received from Telegram GetUpdates Request, retrying in ... millisen probeert het opnieuw, dus het proces blijft draaien. De wachttijd begint bij ongeveer een halve seconde en groeit elke keer met de helft tot ongeveer een minuut (met een willekeurige spreiding, tot 90 seconden); als er 15 minuten zijn verstreken zonder succesvolle aanroep, wacht het 15 minuten tussen de pogingen. Start de bot dus opnieuw nadat je de oorzaak hebt verholpen, in plaats van te wachten. Alleen de HTTP-statuscode, in de regelCaused byvan de stacktrace eronder, zegt wat er misging; Telegrams eigen foutbeschrijving wordt niet afgedrukt. OmdatregisterBotal elke webhook heeft verwijderd, betekent een 409 daar meestal dat een andere kopie van de bot met hetzelfde token pollt: stop die. Zie Telegram-bot 409 Conflict oplossen. - De officiële les, bijgewerkt: die implementeert
LongPollingSingleThreadUpdateConsumer, dat 10.3.0 als verouderd markeert ten gunste van de klasseDefaultLongPollingUpdateConsumerdie hierboven wordt gebruikt; beide verwerken updates één voor één op een achtergrondthread. De klaar-regelMyAmazingBot successfully started!zet de chip niet naar Online in Telegram: druk een regel af die begint metLogged in as, zoals hierboven. - Laat
main()wachten. Het polling draait op de eigen threads van de bibliotheek; de les eindigtmain()metThread.currentThread().join()zodat het programma niet afloopt, en de bot hierboven doet hetzelfde. - Geheugenlimiet: het startscript draait Java met
-XX:MaxRAMPercentage=80.0en de G1-garbage collector, dus de heap kan tot 80 procent van het geheugen van je plan gebruiken. Als die vol raakt, drukt Javajava.lang.OutOfMemoryErroraf en toont het paneel Je bot had geen geheugen meer. - Eén jar, niets geïnstalleerd op de server. Het Java-bottype start
java -jarop je Startbestand en heeft geen veld Packages, dus alles moet in de jar zitten. Upload een nieuwe jar om de bot bij te werken.
Zelf hosten op een Linux-VPS
Een VPS heeft alleen een Java-runtime nodig, omdat je de jar op je eigen computer bouwt. Installeer op Debian 13 of Ubuntu 24.04 Java 21; Debian 12 levert Java 17, dat de jar hierboven ook draait:
sudo apt update
sudo apt install openjdk-21-jre-headless
java -version
Maak een gebruiker voor de bot en kopieer de jar naar de server (bijvoorbeeld met scp), dan naar zijn map:
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp bot.jar /opt/mybot/
sudo chown -R mybot: /opt/mybot
Houd het token uit 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=TelegramBots Telegram bot
Wants=network-online.target
After=network-online.target
[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/java -XX:MaxRAMPercentage=80.0 -jar /opt/mybot/bot.jar
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 stopt of crasht opnieuw, maar niet nadat je hem met systemctl stop stopt. Op een VPS is -XX:MaxRAMPercentage een deel van het geheugen van de hele machine, dus verlaag het als er andere programma's draaien. Om bij te werken kopieer je de nieuwe jar over de oude en voer je sudo systemctl restart mybot uit.
Zelf hosten of een botplan
Op een VPS die je zelf beheert, regel je:
- Updates en beveiliging van het besturingssysteem, en Java-upgrades.
- Het kopiëren van elke nieuwe jar, het servicebestand, het tokenbestand en de rechten ervan.
- Het lezen van
journalctlom te achterhalen waarom de bot stopte of niet meer antwoordt. - Back-ups van alles wat je bot opslaat.
In ruil daarvoor draait een VPS alles en kun je hem een domein met HTTPS geven voor een webhook.
Op een PlayNHost-botplan doet het paneel dit voor je:
- Java 17, 21 of 25 uit een keuzelijst, met de heaplimiet en garbage collector al ingesteld.
- 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. Als hij binnen een minuut opnieuw crasht, blijft hij gestopt en zegt Console waarom.
- Een knop Webhook verwijderen in het paneel Telegram en banners boven Console die de oorzaak noemen, zoals een geweigerd token of een tekort aan geheugen.
- Uploaden vanuit de browser en back-ups vanuit het paneel.
Veelgestelde vragen
Mijn TelegramBots-bot draait maar antwoordt niets en drukt niets af. Waarom?
Meestal heeft de jar geen SLF4J-provider, dus de eigen foutregels van de bibliotheek worden weggegooid terwijl ze blijft herproberen. Voeg slf4j-simple toe zoals in de pom.xml hierboven, bouw opnieuw en kijk in Console. Een herhaalde 409 betekent dat een andere kopie van de bot met hetzelfde token pollt; een herhaalde 401 betekent dat het token in @BotFather is ingetrokken. Start de bot na het herstel opnieuw: de wachttijd van TelegramBots tussen pogingen kan oplopen tot 15 minuten.
Kan ik de webhookmodule van TelegramBots gebruiken?
Nog niet op onze plannen: een webhook heeft een openbaar HTTPS-adres nodig, dat ze niet bevatten. Long polling heeft er geen nodig, omdat de bot Telegram zelf om nieuwe berichten vraagt. Gebruik telegrambots-longpolling zoals op deze pagina.
Heeft TelegramBots een groter plan nodig dan een Python- of Node.js-bot?
Niet vanwege de bibliotheek zelf. In dezelfde test, op dezelfde manier uitgevoerd, gebruikte TelegramBots 91 MB, python-telegram-bot 22.8 gebruikte 44 MB, grammY 1.46.0 gebruikte 60 MB en aiogram 3.31.0 gebruikte 173 MB, allemaal ruim onder de 0,5 GB van het kleinste plan. Wat je bot in het geheugen houdt, bepaalt de rest. Bij Java hangt het geheugen ook van de heap af: het startscript laat die groeien tot 80 procent van het plan, en de garbage collector bepaalt hoeveel daarvan wordt gebruikt.
Welke Java-versie moet ik kiezen?
Java 21, de aanbevolen versie, tenzij je eigen code 25 nodig heeft. TelegramBots 10.3.0 heeft Java 17 of nieuwer nodig. Bouw met een release die niet nieuwer is dan de Runtime die je kiest: een jar gebouwd voor een nieuwere Java stopt met UnsupportedClassVersionError.
Klaar om je TelegramBots-bot dag en nacht te laten draaien? Bekijk de plannen op Telegram-bothosting.



