Pour héberger un bot TelegramBots (Java) 24/7, vous le faites tourner sur une machine toujours allumée : un VPS Linux avec un service systemd qui le relance quand il s’arrête, ou un forfait bot sur l’hébergement de bots Telegram PlayNHost (à partir de 1,99 $US par mois), où vous téléversez un jar exécutable, collez le token de @BotFather et appuyez sur Start. Lors de notre test, un bot sous TelegramBots 10.3.0, la bibliothèque Java de rubenlagus, a utilisé environ 91 Mo de mémoire sous Java 21 et a obtenu la réponse de Telegram 1,5 seconde après son lancement. Utilisez son module de long polling : nos forfaits n’ont pas encore d’adresse HTTPS publique pour un webhook. Les étapes sur PlayNHost :
- Sur la page Hébergement de bots Telegram, cliquez sur Créer un serveur pour un forfait. Dans la fenêtre de commande, répondez à Pour quelle plateforme est votre bot ? par Telegram et choisissez Java.
- Sur votre ordinateur, compilez le bot avec le
pom.xmlci-dessous :mvn packageécrittarget/bot.jar, avec TelegramBots à l’intérieur. - Ouvrez votre serveur dans le panel. La carte Configurer votre bot de la page Aperçu s’ouvre sur Connexion à Telegram ; sa première étape, Ce qui tourne, doit indiquer Ce bot fait tourner Java Bot.
- Sous Connexion à Telegram, collez le token sous Collez le token de votre bot, cliquez sur Connexion, vérifiez le nom du bot affiché et cliquez sur Oui, continuer.
- Sous Votre code, cliquez sur Téléverser des fichiers et téléversez
bot.jardans le dossier principal. - Sur la page Bot, volet Code, vérifiez que Fichier d’entrée est
bot.jaret que Runtime est Java 21 (recommended), ou Java 17 ou 25. Si vous modifiez Fichier d’entrée, cliquez sur Enregistrer à côté ; un nouveau Runtime est enregistré dès que vous le choisissez. - Cliquez sur Démarrer le bot et ouvrez Console. Quand votre bot affiche
Logged in as @your_bot, la pastille sur Aperçu passe à En ligne sur Telegram. - Sur la page Bot, volet Telegram, cliquez sur Ouvrir dans Telegram et envoyez
/startà votre bot.
La création du bot dans @BotFather et les étapes du panel sont expliquées dans Comment héberger un bot Telegram. Cette page parle de TelegramBots lui-même : ce qu’il consomme sur un serveur et ce qu’il faut savoir avant de l’héberger.
Ce que nous avons mesuré
| Bibliothèque | Version | Mémoire sans charge | Du lancement à la réponse de Telegram | Taille du jar |
|---|---|---|---|---|
| TelegramBots (rubenlagus) | 10.3.0 | 91 Mo | 1,5 s | 9,6 Mo |
| Java 21 seul, sans bibliothèque | 21.0.12.1 | 38 Mo | aucune | 0,0 Mo |
Méthode : sur notre propre nœud, dans un conteneur jetable configuré comme un forfait bot de 1 Go (l’image Java 21 et la commande java exacte de notre type de bot Java), le bot a appelé getMe de Telegram avec un faux token, que Telegram a refusé ; la mémoire est la mémoire résidente 15 secondes après cette réponse, le temps de démarrage va du lancement à la réponse, et chaque valeur est la médiane des exécutions 2 à 4.
Ce sont des planchers : pas encore de discussions, pas de données et pas encore de polling. Votre propre code, ce qu’il garde en mémoire et le nombre de discussions s’y ajoutent, et le script de démarrage laisse le tas Java grandir jusqu’à 80 pour cent du forfait (voir plus bas). Comparez ces chiffres avec les forfaits de l’hébergement de bots Telegram et choisissez selon ce que fait votre bot.
Un bot TelegramBots minimal
Il répond à /start, lit le token dans TELEGRAM_BOT_TOKEN (le panel le donne à votre code sous ce nom et aussi sous BOT_TOKEN, TOKEN, TELEGRAM_TOKEN et TELOXIDE_TOKEN) et affiche une ligne de démarrage. Deux fichiers :
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();
}
}
}
Compilez-le avec Maven 3.9 et un JDK 17 ou plus récent, et testez le jar sur votre ordinateur :
mvn package
java -jar target/bot.jar
Sans token, il affiche No TELEGRAM_BOT_TOKEN found. et s’arrête, ce qui prouve que le jar démarre et trouve sa classe principale. Téléversez target/bot.jar. Arrêtez toute copie lancée sur votre ordinateur avec le vrai token avant de démarrer celle du serveur, sinon les deux copies reçoivent des erreurs 409 Conflict de Telegram.
L’appel getMe vérifie le token avant le début du polling et fournit le nom d’utilisateur du bot pour la ligne de démarrage. Logged in as @your_bot est la ligne qui fait passer la pastille à En ligne sur Telegram.
Si le token est incorrect
Lors de notre test, avec un faux token, l’appel getMe de TelegramBots a échoué avec cette erreur :
TelegramApiRequestException: Error executing org.telegram.telegrambots.meta.api.methods.GetMe query: [401] Unauthorized
Le bot ci-dessus intercepte ce refus (code d’erreur 401) et affiche à la place Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. Le panel lit cette ligne et affiche la bannière Telegram n’a pas accepté le token de votre bot au-dessus de Console. Pour corriger, envoyez /mybots dans @BotFather, choisissez votre bot, puis API Token, et copiez de nouveau le token. Sur la page Bot, volet Telegram, cliquez sur Remplacer le token, collez-le, cliquez sur Enregistrer le token, puis sur Redémarrer maintenant.
Ce qu’il faut savoir sur TelegramBots sur un serveur
- Versions : TelegramBots 10.3.0 est sorti le 7 sept. 2026 et prend en charge la Bot API 10.3 de Telegram. Il demande Java 17 ou plus récent, donc chaque Runtime proposé par le panel (Java 17, 21 ou 25) l’exécute.
- Deux paquets, contrairement aux anciens tutoriels. Depuis la version 7.0.0 (mars 2024), la bibliothèque se compose de
telegrambots-longpolling, qui reçoit les messages, et detelegrambots-client, qui les envoie. Les tutoriels qui étendentTelegramLongPollingBotont été écrits pour l’ancien paquettelegrambots, dont la dernière version est 6.9.7.1 ; cette classe n’existe pas dans 10.3.0, leur code ne compile donc pas avec elle. - Utilisez le long polling. La bibliothèque a aussi un module webhook, mais un webhook demande une adresse HTTPS publique, que nos forfaits n’incluent pas encore.
registerBotdu module de long polling appelledeleteWebhookavant de démarrer, donc un webhook resté d’un ancien hébergeur est supprimé et les messages en attente sont conservés. Pour quitter un hébergeur à webhook : Comment déplacer un bot Telegram vers PlayNHost. - Ajoutez une bibliothèque de logs, sinon la bibliothèque reste muette. TelegramBots journalise via SLF4J. Sans fournisseur SLF4J dans votre jar, SLF4J affiche un avertissement une fois, puis jette chaque ligne de log de la bibliothèque, y compris les erreurs du polling. Le
pom.xmlci-dessus ajouteslf4j-simple, qui écrit les lignes de la bibliothèque au niveau INFO et au-dessus sur la sortie d’erreur standard, donc elles apparaissent dans Console. - Les erreurs de polling sont retentées, pas levées. Quand un appel
getUpdateséchoue, TelegramBots journaliseError received from Telegram GetUpdates Request, retrying in ... milliset réessaie, donc le processus continue de tourner. L’attente commence à environ une demi-seconde et augmente de moitié à chaque fois jusqu’à environ une minute (avec une dispersion aléatoire, jusqu’à 90 secondes) ; quand 15 minutes se sont écoulées sans appel réussi, il attend 15 minutes entre les essais. Après avoir corrigé la cause, redémarrez donc le bot au lieu d’attendre. Seul le code de statut HTTP, dans la ligneCaused byde la stack trace en dessous, dit ce qui a échoué ; la description d’erreur de Telegram n’est pas affichée. CommeregisterBota déjà supprimé tout webhook, un 409 à cet endroit signifie le plus souvent qu’une autre copie du bot fait du polling avec le même token : arrêtez-la. Voir Corriger l’erreur 409 Conflict d’un bot Telegram. - Le tutoriel officiel, mis à jour : il implémente
LongPollingSingleThreadUpdateConsumer, que la version 10.3.0 déclare obsolète au profit de la classeDefaultLongPollingUpdateConsumerutilisée plus haut ; les deux traitent les mises à jour une par une sur un thread d’arrière-plan. Sa ligne de démarrage,MyAmazingBot successfully started!, ne fait pas passer la pastille à En ligne sur Telegram : affichez une ligne qui commence parLogged in as, comme ci-dessus. - Gardez
main()en attente. Le polling tourne sur les threads propres de la bibliothèque ; le tutoriel terminemain()parThread.currentThread().join()pour que le programme ne se termine pas, et le bot ci-dessus fait de même. - Limite de mémoire : le script de démarrage lance Java avec
-XX:MaxRAMPercentage=80.0et le ramasse-miettes G1, donc le tas peut utiliser jusqu’à 80 pour cent de la mémoire de votre forfait. S’il se remplit, Java affichejava.lang.OutOfMemoryErroret le panel affiche Votre bot a manqué de mémoire. - Un seul jar, rien d’installé sur le serveur. Le type de bot Java lance
java -jarsur votre Fichier d’entrée et n’a pas de champ Paquets, donc tout doit être dans le jar. Téléversez un nouveau jar pour mettre le bot à jour.
L’héberger vous-même sur un VPS Linux
Un VPS n’a besoin que d’un environnement Java, car vous compilez le jar sur votre propre ordinateur. Sur Debian 13 ou Ubuntu 24.04, installez Java 21 ; Debian 12 fournit Java 17, qui exécute aussi le jar ci-dessus :
sudo apt update
sudo apt install openjdk-21-jre-headless
java -version
Créez un utilisateur pour le bot et copiez le jar sur le serveur (par exemple avec scp), puis dans son dossier :
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp bot.jar /opt/mybot/
sudo chown -R mybot: /opt/mybot
Gardez le token hors de votre code, dans un fichier que seul root peut lire :
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env
Créez /etc/systemd/system/mybot.service :
[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
Démarrez-le maintenant et à chaque démarrage de la machine, puis suivez sa sortie :
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
Restart=always relance le bot 5 secondes après qu’il se termine ou plante, mais pas si vous l’arrêtez avec systemctl stop. Sur un VPS, -XX:MaxRAMPercentage est une part de la mémoire de toute la machine ; baissez-la si d’autres programmes y tournent. Pour mettre à jour, copiez le nouveau jar sur l’ancien et lancez sudo systemctl restart mybot.
Auto-hébergement ou forfait bot
Sur un VPS que vous gérez vous-même, vous vous occupez de :
- Les mises à jour et la sécurité du système, et les mises à niveau de Java.
- La copie de chaque nouveau jar, le fichier de service, le fichier du token et ses permissions.
- La lecture de
journalctlpour savoir pourquoi le bot s’est arrêté ou ne répond plus. - Les sauvegardes de tout ce que votre bot stocke.
En échange, un VPS exécute n’importe quoi et vous pouvez lui donner un domaine avec HTTPS pour un webhook.
Sur un forfait bot PlayNHost, le panel s’en charge pour vous :
- Java 17, 21 ou 25 depuis un sélecteur, avec la limite de tas et le ramasse-miettes déjà réglés.
- Le token, vérifié auprès de Telegram avant d’être enregistré, stocké chiffré et donné à votre code sous cinq noms.
- Le redémarrage du bot après un plantage. S’il replante dans la minute, il reste arrêté et Console en donne la raison.
- Un bouton Retirer le webhook dans le volet Telegram, et des bannières au-dessus de Console qui nomment la cause, comme un token refusé ou un manque de mémoire.
- Le téléversement depuis le navigateur et les sauvegardes depuis le panel.
Questions fréquentes
Mon bot TelegramBots tourne mais ne répond à rien et n’affiche rien. Pourquoi ?
Le plus souvent, le jar n’a pas de fournisseur SLF4J, donc les lignes d’erreur de la bibliothèque sont jetées pendant qu’elle réessaie. Ajoutez slf4j-simple comme dans le pom.xml ci-dessus, recompilez et regardez Console. Un 409 répété signifie qu’une autre copie du bot fait du polling avec le même token ; un 401 répété signifie que le token a été révoqué dans @BotFather. Après la correction, redémarrez le bot : l’attente de TelegramBots entre deux essais peut atteindre 15 minutes.
Puis-je utiliser le module webhook de TelegramBots ?
Pas encore sur nos forfaits : un webhook demande une adresse HTTPS publique, qu’ils n’incluent pas. Le long polling n’en demande aucune, car le bot demande lui-même les nouveaux messages à Telegram. Utilisez telegrambots-longpolling comme sur cette page.
TelegramBots demande-t-il un forfait plus gros qu’un bot Python ou Node.js ?
Pas à cause de la bibliothèque elle-même. Dans le même test, exécuté de la même façon, TelegramBots a utilisé 91 Mo, python-telegram-bot 22.8 a utilisé 44 Mo, grammY 1.46.0 a utilisé 60 Mo et aiogram 3.31.0 a utilisé 173 Mo, tous bien en dessous des 0,5 Go du plus petit forfait. Ce que votre bot garde en mémoire décide du reste. Sur Java, la mémoire dépend aussi du tas : le script de démarrage le laisse grandir jusqu’à 80 pour cent du forfait, et le ramasse-miettes décide de la part utilisée.
Quelle version de Java choisir ?
Java 21, la recommandée, sauf si votre propre code a besoin de 25. TelegramBots 10.3.0 demande Java 17 ou plus récent. Compilez avec un release au plus égal au Runtime choisi : un jar compilé pour un Java plus récent s’arrête avec UnsupportedClassVersionError.
Prêt à faire tourner votre bot TelegramBots jour et nuit ? Consultez les forfaits sur l’hébergement de bots Telegram.



