Żeby hostować bota TelegramBots (Java) 24/7, uruchamiasz go na maszynie, która zawsze działa: na VPS z Linuksem z usługą systemd, która uruchamia go ponownie, gdy się zatrzyma, albo w planie dla botów w hostingu botów Telegram PlayNHost (od 1,99 USD miesięcznie), gdzie wgrywasz jeden uruchamialny jar, wklejasz token z @BotFather i naciskasz Start. W naszym teście bot na TelegramBots 10.3.0, bibliotece Java autorstwa rubenlagus, zużył ok. 91 MB pamięci na Javie 21 i dostał odpowiedź Telegrama 1,5 sekundy po uruchomieniu. Użyj jego modułu long polling: nasze plany nie mają jeszcze publicznego adresu HTTPS dla webhooka. Kroki w PlayNHost:
- Na stronie Hosting botów Telegram kliknij Utwórz serwer przy wybranym planie. W oknie zamówienia odpowiedz na Na jaką platformę jest Twój bot? wybierając Telegram i wybierz Java.
- Na swoim komputerze zbuduj bota z
pom.xmlponiżej:mvn packagezapisujetarget/bot.jarz TelegramBots w środku. - Otwórz swój serwer w panelu. Karta Skonfiguruj swojego bota na stronie Przegląd otwiera się na Połącz z Telegramem; jej pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Java Bot.
- W Połącz z Telegramem wklej token w polu Wklej token swojego bota, kliknij Połączenie, sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
- W Twój kod kliknij Prześlij pliki i wgraj
bot.jardo głównego folderu. - Na stronie Bot, w okienku Kod, sprawdź, czy Plik startowy to
bot.jar, a Runtime to Java 21 (recommended), albo Java 17 lub 25. Jeśli zmienisz Plik startowy, kliknij obok Zapisz; nowy Runtime zapisuje się od razu po wybraniu. - Kliknij Uruchom bota i otwórz Console. Gdy twój bot wypisze
Logged in as @your_bot, znacznik w sekcji Przegląd zmieni się na Online w Telegramie. - Na stronie Bot, w okienku Telegram, kliknij Otwórz w Telegramie i wyślij swojemu botowi
/start.
Tworzenie bota w @BotFather i kroki w panelu opisuje Jak hostować bota Telegram. Ta strona dotyczy samego TelegramBots: czego używa na serwerze i co warto wiedzieć przed hostowaniem.
Co zmierzyliśmy
| Biblioteka | Wersja | Pamięć bez obciążenia | Od uruchomienia do odpowiedzi Telegrama | Rozmiar jara |
|---|---|---|---|---|
| TelegramBots (rubenlagus) | 10.3.0 | 91 MB | 1,5 s | 9,6 MB |
| Sama Java 21, bez biblioteki | 21.0.12.1 | 38 MB | brak | 0,0 MB |
Jak: na naszym własnym węźle, w jednorazowym kontenerze ustawionym jak plan dla botów z 1 GB (obraz Java 21 i dokładne polecenie java naszego typu bota Java) bot wywołał getMe Telegrama z fałszywym tokenem, który Telegram odrzucił; pamięć to pamięć rezydentna 15 sekund po tej odpowiedzi, czas startu liczymy od uruchomienia do odpowiedzi, a każda wartość to mediana uruchomień od 2 do 4.
To wartości minimalne: jeszcze bez czatów, bez danych i bez pollingu. Dochodzą do nich twój kod, to, co trzyma w pamięci, i liczba czatów, a skrypt startowy pozwala stercie Javy urosnąć do 80 procent planu (patrz niżej). Porównaj liczby z planami w hostingu botów Telegram i wybierz według tego, co robi twój bot.
Minimalny bot TelegramBots
Odpowiada na /start, czyta token z TELEGRAM_BOT_TOKEN (panel przekazuje go twojemu kodowi pod tą nazwą, a także jako BOT_TOKEN, TOKEN, TELEGRAM_TOKEN i TELOXIDE_TOKEN) i wypisuje linię gotowości. Dwa pliki:
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();
}
}
}
Zbuduj go z Mavenem 3.9 i JDK 17 lub nowszym i przetestuj jar na swoim komputerze:
mvn package
java -jar target/bot.jar
Bez tokena wypisuje No TELEGRAM_BOT_TOKEN found. i się zatrzymuje, co dowodzi, że jar startuje i znajduje swoją klasę główną. Wgraj target/bot.jar. Zatrzymaj każdą kopię uruchomioną na komputerze z prawdziwym tokenem, zanim uruchomisz tę na serwerze, bo inaczej obie kopie dostaną od Telegrama błędy 409 Conflict.
Wywołanie getMe sprawdza token, zanim zacznie się polling, i daje nazwę użytkownika bota do linii gotowości. Logged in as @your_bot to linia, która zmienia znacznik na Online w Telegramie.
Gdy token jest zły
W naszym teście, z fałszywym tokenem, wywołanie getMe w TelegramBots zakończyło się takim błędem:
TelegramApiRequestException: Error executing org.telegram.telegrambots.meta.api.methods.GetMe query: [401] Unauthorized
Bot powyżej przechwytuje to odrzucenie (kod błędu 401) i zamiast tego wypisuje Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. Panel czyta tę linię i pokazuje baner Telegram nie przyjął tokena twojego bota nad Console. Aby to naprawić, wyślij w @BotFather /mybots, wybierz swojego bota, potem API Token i skopiuj token jeszcze raz. Na stronie Bot, w okienku Telegram, kliknij Zastąp token, wklej go, kliknij Zapisz token, a potem Zrestartuj teraz.
Co warto wiedzieć o TelegramBots na serwerze
- Wersje: TelegramBots 10.3.0 wyszedł 7 wrz 2026 i obsługuje Bot API 10.3 Telegrama. Wymaga Javy 17 lub nowszej, więc działa na każdym Runtime, który oferuje panel (Java 17, 21 lub 25).
- Dwa pakiety, inaczej niż w starszych poradnikach. Od wersji 7.0.0 (marzec 2024) biblioteka składa się z
telegrambots-longpolling, który odbiera wiadomości, itelegrambots-client, który je wysyła. Poradniki rozszerzająceTelegramLongPollingBotpowstały dla starego pakietutelegrambots, wydanego ostatnio jako 6.9.7.1; tej klasy nie ma w 10.3.0, więc ich kod się z nią nie skompiluje. - Używaj long pollingu. Biblioteka ma też moduł webhooka, ale webhook wymaga publicznego adresu HTTPS, którego nasze plany jeszcze nie zawierają.
registerBotw module long polling wywołujedeleteWebhookprzed startem, więc webhook pozostawiony przez dawnego hosta jest usuwany, a oczekujące wiadomości zostają. Przeprowadzka z hosta z webhookiem: Jak przenieść bota Telegram do PlayNHost. - Dodaj bibliotekę logowania, bo inaczej biblioteka milczy. TelegramBots loguje przez SLF4J. Bez dostawcy SLF4J w twoim jarze SLF4J raz wypisuje ostrzeżenie, a potem wyrzuca każdą linię logu biblioteki, także błędy z pollingu.
pom.xmlpowyżej dodajeslf4j-simple, który zapisuje linie biblioteki od poziomu INFO w górę na standardowe wyjście błędów, więc widać je w Console. - Błędy pollingu są ponawiane, a nie zgłaszane. Gdy wywołanie
getUpdateszawiedzie, TelegramBots logujeError received from Telegram GetUpdates Request, retrying in ... millisi próbuje ponownie, więc proces dalej działa. Czekanie zaczyna się od ok. pół sekundy i rośnie za każdym razem o połowę do ok. minuty (z losowym rozrzutem, do 90 sekund); gdy minie 15 minut bez udanego wywołania, czeka 15 minut między próbami. Dlatego po usunięciu przyczyny zrestartuj bota zamiast czekać. Tylko kod statusu HTTP, w liniiCaused byśladu stosu pod spodem, mówi, co poszło nie tak; własny opis błędu Telegrama nie jest wypisywany. SkororegisterBotjuż usunął webhook, 409 w tym miejscu najpewniej oznacza, że inna kopia bota robi polling z tym samym tokenem: zatrzymaj ją. Zobacz Jak naprawić błąd 409 Conflict bota Telegram. - Oficjalna lekcja, po aktualizacji: implementuje
LongPollingSingleThreadUpdateConsumer, który wersja 10.3.0 oznacza jako przestarzały na rzecz klasyDefaultLongPollingUpdateConsumerużytej powyżej; obie przetwarzają aktualizacje po jednej w wątku w tle. Jej linia gotowości,MyAmazingBot successfully started!, nie zmienia znacznika na Online w Telegramie: wypisz linię zaczynającą się odLogged in as, jak wyżej. - Niech
main()czeka. Polling działa na własnych wątkach biblioteki; lekcja kończymain()wywołaniemThread.currentThread().join(), żeby program się nie zakończył, a bot powyżej robi to samo. - Limit pamięci: skrypt startowy uruchamia Javę z
-XX:MaxRAMPercentage=80.0i odśmiecaczem G1, więc sterta może zająć do 80 procent pamięci planu. Gdy się zapełni, Java wypisujejava.lang.OutOfMemoryError, a panel pokazuje Twojemu botowi zabrakło pamięci. - Jeden jar, nic nie instaluje się na serwerze. Typ bota Java uruchamia
java -jarna twoim Plik startowy i nie ma pola Pakiety, więc wszystko musi być w jarze. Aby zaktualizować bota, wgraj nowy jar.
Hostuj go sam na VPS z Linuksem
VPS potrzebuje tylko środowiska Java, bo jar budujesz na własnym komputerze. Na Debianie 13 lub Ubuntu 24.04 zainstaluj Javę 21; Debian 12 ma Javę 17, która też uruchomi jar powyżej:
sudo apt update
sudo apt install openjdk-21-jre-headless
java -version
Utwórz użytkownika dla bota i skopiuj jar na serwer (na przykład przez scp), potem do jego folderu:
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp bot.jar /opt/mybot/
sudo chown -R mybot: /opt/mybot
Trzymaj token poza kodem, w pliku czytelnym tylko dla roota:
sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env
Utwórz /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
Uruchom go teraz i przy każdym starcie systemu, a potem śledź jego wyjście:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
Restart=always uruchamia bota ponownie 5 sekund po jego zakończeniu lub awarii, ale nie po zatrzymaniu go przez systemctl stop. Na VPS -XX:MaxRAMPercentage to część pamięci całej maszyny, więc zmniejsz go, jeśli działają tam inne programy. Aby zaktualizować, skopiuj nowy jar na stary i uruchom sudo systemctl restart mybot.
Własny serwer czy plan dla botów
Na VPS, którym zarządzasz sam, zajmujesz się:
- Aktualizacjami i bezpieczeństwem systemu oraz aktualizacjami Javy.
- Kopiowaniem każdego nowego jara, plikiem usługi, plikiem z tokenem i jego uprawnieniami.
- Czytaniem
journalctl, żeby dowiedzieć się, dlaczego bot się zatrzymał albo przestał odpowiadać. - Kopiami zapasowymi wszystkiego, co przechowuje twój bot.
W zamian VPS uruchomi wszystko i możesz mu nadać domenę z HTTPS dla webhooka.
W planie dla botów PlayNHost robi to za ciebie panel:
- Java 17, 21 lub 25 z listy wyboru, z ustawionym limitem sterty i odśmiecaczem.
- Token, sprawdzony w Telegramie przed zapisem, przechowywany w postaci zaszyfrowanej i przekazywany twojemu kodowi pod pięcioma nazwami.
- Ponowne uruchomienie bota po awarii. Jeśli awaria powtórzy się w ciągu minuty, bot zostaje zatrzymany, a Console podaje powód.
- Przycisk Usuń webhook w okienku Telegram i banery nad Console nazywające przyczynę, na przykład odrzucony token lub brak pamięci.
- Wgrywanie z przeglądarki i kopie zapasowe z panelu.
Pytania, które ludzie zadają
Mój bot TelegramBots działa, ale nic nie odpowiada i nic nie wypisuje. Dlaczego?
Najczęściej jar nie ma dostawcy SLF4J, więc własne linie błędów biblioteki są wyrzucane, podczas gdy ona dalej ponawia próby. Dodaj slf4j-simple jak w pom.xml powyżej, zbuduj ponownie i zajrzyj do Console. Powtarzające się 409 oznacza, że inna kopia bota robi polling z tym samym tokenem; powtarzające się 401 oznacza, że token został unieważniony w @BotFather. Po naprawie zrestartuj bota: czekanie TelegramBots między próbami może sięgnąć 15 minut.
Czy mogę użyć modułu webhooka TelegramBots?
Jeszcze nie w naszych planach: webhook wymaga publicznego adresu HTTPS, którego nie zawierają. Long polling go nie potrzebuje, bo bot sam pyta Telegram o nowe wiadomości. Użyj telegrambots-longpolling tak jak na tej stronie.
Czy TelegramBots potrzebuje większego planu niż bot w Pythonie lub Node.js?
Nie z powodu samej biblioteki. W tym samym teście, uruchomionym tak samo, TelegramBots zużył 91 MB, python-telegram-bot 22.8 zużył 44 MB, grammY 1.46.0 zużył 60 MB, a aiogram 3.31.0 zużył 173 MB, wszystkie znacznie poniżej 0,5 GB najmniejszego planu. Resztę rozstrzyga to, co twój bot trzyma w pamięci. W Javie pamięć zależy też od sterty: skrypt startowy pozwala jej urosnąć do 80 procent planu, a odśmiecacz decyduje, ile z tego zajmie.
Którą wersję Javy wybrać?
Javę 21, zalecaną, chyba że twój kod potrzebuje 25. TelegramBots 10.3.0 wymaga Javy 17 lub nowszej. Buduj z release nie nowszym niż wybrany Runtime: jar zbudowany dla nowszej Javy zatrzymuje się z UnsupportedClassVersionError.
Gotowy, by twój bot TelegramBots działał całą dobę? Zobacz plany w hostingu botów Telegram.



