YENİ 📢 Sınırlı lansman teklifi: Tüm oyunlarda ilk aya %70'e varan indirim!Paketleri görün

TelegramBots (Java) botu 24/7 nasıl barındırılır

Telegram botlarıUpdated Nov 6, 202611 min read

Bir TelegramBots (Java) botunu 24/7 barındırmak için onu hep açık kalan bir makinede çalıştırırsınız: durduğunda yeniden başlatan bir systemd hizmetiyle bir Linux VPS'te ya da PlayNHost Telegram bot barındırma hizmetinde bir bot planında (ayda 1,99 US$ ile başlayan fiyatlarla). Orada çalıştırılabilir tek bir jar yükler, @BotFather'dan aldığınız token'ı yapıştırır ve Start'a basarsınız. Testimizde, rubenlagus'un Java kütüphanesi olan TelegramBots 10.3.0 ile çalışan bir bot, Java 21'de yaklaşık 91 MB bellek kullandı ve Telegram'ın yanıtını başlatıldıktan 1,5 saniye sonra aldı. Long polling modülünü kullanın: planlarımızda henüz webhook için herkese açık bir HTTPS adresi yok. PlayNHost'taki adımlar:

  1. Telegram bot barındırma sayfasında bir planın Sunucu oluştur düğmesine tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusunu Telegram ile yanıtlayın ve Java'yı seçin.
  2. Bilgisayarınızda botu aşağıdaki pom.xml ile derleyin: mvn package, içinde TelegramBots bulunan target/bot.jar dosyasını yazar.
  3. Sunucunuzu panelde açın. Genel bakış sayfasındaki Botunuzu kurun kartı Telegram’a bağlan adımında açılır; ilk adımı olan Ne çalışır şunu göstermelidir: Bu bot Java Bot çalıştırır.
  4. Telegram’a bağlan adımında token'ı Bot token’ınızı yapıştırın alanının altına yapıştırın, Bağlan düğmesine tıklayın, görünen bot adını kontrol edin ve Evet, devam düğmesine tıklayın.
  5. Kodunuz adımında Dosya yükle düğmesine tıklayın ve bot.jar dosyasını ana klasöre yükleyin.
  6. Bot sayfasında Kod bölmesinde, Giriş dosyası değerinin bot.jar ve Çalışma ortamı değerinin Java 21 (recommended), ya da Java 17 veya 25 olduğunu kontrol edin. Giriş dosyası değerini değiştirirseniz yanındaki Kaydet düğmesine tıklayın; yeni bir Çalışma ortamı seçtiğiniz anda kaydedilir.
  7. Botu başlat düğmesine tıklayın ve Console bölümünü açın. Botunuz Logged in as @your_bot yazdığında Genel bakış sayfasındaki rozet Telegram’da çevrimiçi durumuna geçer.
  8. Bot sayfasında Telegram bölmesinde Telegram’da aç düğmesine tıklayın ve botunuza /start gönderin.

Botu @BotFather'da oluşturma ve panel adımları Telegram botu nasıl barındırılır yazısında anlatılıyor. Bu sayfa TelegramBots'un kendisini ele alır: bir sunucuda neyi kullandığını ve barındırmadan önce bilmeniz gerekenleri.

Ne ölçtük

KütüphaneSürümYük yokken bellekBaşlatmadan Telegram'ın yanıtınaJar boyutu
TelegramBots (rubenlagus)10.3.091 MB1,5 sn9,6 MB
Yalnızca Java 21, kütüphanesiz21.0.12.138 MByok0,0 MB

Nasıl: kendi node'umuzda, 1 GB'lık bir bot planı gibi kurulmuş tek kullanımlık bir konteynerde (Java 21 imajı ve Java bot türümüzün tam java komutu), bot Telegram'ın getMe yöntemini sahte bir token ile çağırdı ve Telegram bunu reddetti; bellek, bu yanıttan 15 saniye sonraki rezident bellektir, başlangıç süresi başlatmadan yanıta kadar geçen süredir ve her değer 2 ile 4 arasındaki çalıştırmaların medyanıdır.

Bunlar alt sınırlardır: henüz sohbet, veri ve polling yok. Kendi kodunuz, bellekte tuttuğu şeyler ve sohbet sayısı bunlara eklenir, ayrıca başlatma betiği Java heap'inin planın yüzde 80'ine kadar büyümesine izin verir (aşağıya bakın). Rakamları Telegram bot barındırma sayfasındaki planlarla karşılaştırın ve botunuzun yaptığı işe göre seçin.

Minimal bir TelegramBots botu

/start komutuna yanıt verir, token'ı TELEGRAM_BOT_TOKEN değişkeninden okur (panel onu koda bu adla ve ayrıca BOT_TOKEN, TOKEN, TELEGRAM_TOKEN ve TELOXIDE_TOKEN adlarıyla verir) ve bir hazır satırı yazdırır. İki dosya:

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();
        }
    }
}

Maven 3.9 ve JDK 17 veya daha yenisiyle derleyin ve jar'ı bilgisayarınızda deneyin:

mvn package
java -jar target/bot.jar

Token olmadan No TELEGRAM_BOT_TOKEN found. yazdırıp durur; bu, jar'ın başladığını ve ana sınıfını bulduğunu kanıtlar. target/bot.jar dosyasını yükleyin. Sunucudakini başlatmadan önce bilgisayarınızda gerçek token ile çalıştırdığınız kopyayı durdurun, yoksa iki kopya da Telegram'dan 409 Conflict hataları alır.

getMe çağrısı, polling başlamadan önce token'ı kontrol eder ve hazır satırı için botun kullanıcı adını verir. Logged in as @your_bot, rozeti Telegram’da çevrimiçi durumuna getiren satırdır.

Token yanlışsa

Testimizde, sahte bir token ile TelegramBots'un getMe çağrısı şu hatayla başarısız oldu:

TelegramApiRequestException: Error executing org.telegram.telegrambots.meta.api.methods.GetMe query: [401] Unauthorized

Yukarıdaki bot bu reddi (hata kodu 401) yakalar ve bunun yerine Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. yazdırır. Panel bu satırı okur ve Console üzerinde Telegram bot token’ınızı kabul etmedi başlıklı bir uyarı gösterir. Düzeltmek için @BotFather'da /mybots gönderin, botunuzu seçin, ardından API Token seçeneğini seçin ve token'ı yeniden kopyalayın. Bot sayfasında Telegram bölmesinde Token’ı değiştir düğmesine tıklayın, token'ı yapıştırın, Token’ı kaydet düğmesine, ardından Şimdi yeniden başlat düğmesine tıklayın.

Bir sunucuda TelegramBots hakkında bilmeniz gerekenler

  • Sürümler: TelegramBots 10.3.0, 7 Eyl 2026'da çıktı ve Telegram'ın Bot API 10.3 sürümünü destekler. Java 17 veya daha yenisini gerektirir, bu yüzden panelin sunduğu her Çalışma ortamı (Java 17, 21 veya 25) onu çalıştırır.
  • Eski öğreticilerin aksine iki paket. 7.0.0 sürümünden (Mart 2024) beri kütüphane, mesajları alan telegrambots-longpolling ve mesajları gönderen telegrambots-client olarak gelir. TelegramLongPollingBot sınıfını genişleten öğreticiler, en son 6.9.7.1 olarak yayımlanan eski telegrambots paketi için yazılmıştır; bu sınıf 10.3.0'da yoktur, bu yüzden onların kodu bununla derlenmez.
  • Long polling kullanın. Kütüphanenin bir webhook modülü de var, ancak webhook herkese açık bir HTTPS adresi gerektirir ve planlarımız bunu henüz içermiyor. Long polling modülündeki registerBot, başlamadan önce deleteWebhook çağırır; böylece eski bir barındırıcıdan kalan webhook kaldırılır ve bekleyen mesajlar korunur. Webhook kullanan bir barındırıcıdan taşınmak için: Telegram botunuzu PlayNHost’a nasıl taşırsınız.
  • Bir günlük kütüphanesi ekleyin, yoksa kütüphane sessiz kalır. TelegramBots günlüklerini SLF4J üzerinden yazar. Jar'ınızda SLF4J sağlayıcısı yoksa SLF4J bir kez uyarı yazdırır, sonra polling hataları dahil kütüphanenin her günlük satırını atar. Yukarıdaki pom.xml, kütüphanenin INFO ve üzeri satırlarını standart hataya yazan slf4j-simple ekler, böylece satırlar Console bölümünde görünür.
  • Polling hataları yeniden denenir, fırlatılmaz. Bir getUpdates çağrısı başarısız olduğunda TelegramBots Error received from Telegram GetUpdates Request, retrying in ... millis yazar ve tekrar dener, böylece süreç çalışmaya devam eder. Bekleme yaklaşık yarım saniyeyle başlar ve her seferinde yarı oranında artarak yaklaşık bir dakikaya kadar çıkar (rastgele bir sapmayla en çok 90 saniye); başarılı bir çağrı olmadan 15 dakika geçince denemeler arasında 15 dakika bekler. Bu yüzden nedeni giderdikten sonra beklemek yerine botu yeniden başlatın. Neyin ters gittiğini yalnızca altındaki yığın izinin Caused by satırındaki HTTP durum kodu söyler; Telegram'ın kendi hata açıklaması yazdırılmaz. registerBot zaten webhook'u kaldırdığı için buradaki 409 büyük olasılıkla botun başka bir kopyasının aynı token ile polling yaptığı anlamına gelir: onu durdurun. Bkz. Telegram botu 409 Conflict hatasını düzeltin.
  • Resmi ders, güncellenmiş: LongPollingSingleThreadUpdateConsumer sınıfını uygular; 10.3.0 bunu yukarıda kullanılan DefaultLongPollingUpdateConsumer sınıfı lehine kullanım dışı olarak işaretler; ikisi de güncellemeleri arka plan iş parçacığında birer birer işler. Dersin hazır satırı MyAmazingBot successfully started!, rozeti Telegram’da çevrimiçi durumuna getirmez: yukarıdaki gibi Logged in as ile başlayan bir satır yazdırın.
  • main() beklemeye devam etsin. Polling kütüphanenin kendi iş parçacıklarında çalışır; ders, program bitmesin diye main() metodunu Thread.currentThread().join() ile bitirir ve yukarıdaki bot da aynısını yapar.
  • Bellek sınırı: başlatma betiği Java'yı -XX:MaxRAMPercentage=80.0 ve G1 çöp toplayıcıyla çalıştırır, bu yüzden heap planınızın belleğinin yüzde 80'ine kadar kullanabilir. Dolarsa Java java.lang.OutOfMemoryError yazdırır ve panel Botunuzun belleği yetmedi mesajını gösterir.
  • Tek jar, sunucuya hiçbir şey kurulmaz. Java bot türü, java -jar komutunu Giriş dosyası üzerinde çalıştırır ve Paketler alanı yoktur, bu yüzden her şey jar'ın içinde olmalıdır. Botu güncellemek için yeni bir jar yükleyin.

Kendiniz bir Linux VPS'te barındırın

Jar'ı kendi bilgisayarınızda derlediğiniz için bir VPS'in yalnızca bir Java çalışma ortamına ihtiyacı vardır. Debian 13 veya Ubuntu 24.04'te Java 21'i kurun; Debian 12 ile Java 17 gelir ve o da yukarıdaki jar'ı çalıştırır:

sudo apt update
sudo apt install openjdk-21-jre-headless
java -version

Bot için bir kullanıcı oluşturun ve jar'ı sunucuya kopyalayın (örneğin scp ile), sonra onun klasörüne:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp bot.jar /opt/mybot/
sudo chown -R mybot: /opt/mybot

Token'ı kodunuzun dışında, yalnızca root'un okuyabildiği bir dosyada tutun:

sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

/etc/systemd/system/mybot.service dosyasını oluşturun:

[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

Şimdi ve her açılışta başlatın, sonra çıktısını izleyin:

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

Restart=always, bot çıktıktan veya çöktükten 5 saniye sonra onu yeniden başlatır, ancak systemctl stop ile durdurduktan sonra başlatmaz. Bir VPS'te -XX:MaxRAMPercentage, makinenin tüm belleğinin bir payıdır, bu yüzden orada başka programlar da çalışıyorsa düşürün. Güncellemek için yeni jar'ı eskisinin üzerine kopyalayın ve sudo systemctl restart mybot komutunu çalıştırın.

Kendi barındırma mı, bot planı mı

Kendiniz yönettiğiniz bir VPS'te şunlarla ilgilenirsiniz:

  • İşletim sistemi güncellemeleri ve güvenliği ile Java yükseltmeleri.
  • Her yeni jar'ı, hizmet dosyasını, token dosyasını ve izinlerini kopyalamak.
  • Botun neden durduğunu veya yanıt vermeyi bıraktığını öğrenmek için journalctl okumak.
  • Botunuzun sakladığı her şeyin yedekleri.

Karşılığında bir VPS her şeyi çalıştırır ve ona bir webhook için HTTPS'li bir alan adı verebilirsiniz.

PlayNHost bot planında bunu panel sizin için yapar:

  • Bir seçiciden Java 17, 21 veya 25; heap sınırı ve çöp toplayıcı ayarlanmış halde.
  • Kaydedilmeden önce Telegram ile doğrulanan, şifreli saklanan ve koda beş adla verilen token.
  • Bir çökmeden sonra botun yeniden başlatılması. Bir dakika içinde yeniden çökerse durmuş halde kalır ve Console nedenini söyler.
  • Telegram bölmesinde bir Webhook’u kaldır düğmesi ve Console üzerinde reddedilen token veya bellek yetersizliği gibi nedeni adlandıran uyarılar.
  • Tarayıcıdan yükleme ve panelden yedekler.

Sık sorulan sorular

TelegramBots botum çalışıyor ama hiçbir şeye yanıt vermiyor ve hiçbir şey yazdırmıyor. Neden?

Çoğunlukla jar'da SLF4J sağlayıcısı yoktur, bu yüzden kütüphane yeniden denemeye devam ederken kendi hata satırları atılır. Yukarıdaki slf4j-simple'deki gibi pom.xml ekleyin, yeniden derleyin ve Console bölümüne bakın. Tekrarlanan bir 409, botun başka bir kopyasının aynı token ile polling yaptığı anlamına gelir; tekrarlanan bir 401, token'ın @BotFather'da iptal edildiği anlamına gelir. Düzelttikten sonra botu yeniden başlatın: TelegramBots'un denemeler arasındaki beklemesi 15 dakikaya ulaşabilir.

TelegramBots webhook modülünü kullanabilir miyim?

Planlarımızda henüz değil: webhook herkese açık bir HTTPS adresi gerektirir ve planlar bunu içermez. Long polling'in buna ihtiyacı yoktur, çünkü bot yeni mesajları Telegram'dan kendisi ister. Bu sayfadaki gibi telegrambots-longpolling kullanın.

TelegramBots, bir Python veya Node.js botundan daha büyük bir plan gerektirir mi?

Kütüphanenin kendisi yüzünden hayır. Aynı testte, aynı şekilde çalıştırıldığında TelegramBots 91 MB, python-telegram-bot 22.8 44 MB, grammY 1.46.0 60 MB ve aiogram 3.31.0 173 MB kullandı; hepsi en küçük planın 0,5 GB'ının oldukça altında. Gerisini botunuzun bellekte tuttukları belirler. Java'da bellek heap'e de bağlıdır: başlatma betiği onun planın yüzde 80'ine kadar büyümesine izin verir ve bunun ne kadarının kullanılacağını çöp toplayıcı belirler.

Hangi Java sürümünü seçmeliyim?

Önerilen Java 21, kendi kodunuz 25 gerektirmiyorsa. TelegramBots 10.3.0 Java 17 veya daha yenisini gerektirir. Derlerken release değerini seçtiğiniz Çalışma ortamı sürümünden yeni yapmayın: daha yeni bir Java için derlenmiş bir jar UnsupportedClassVersionError ile durur.

TelegramBots botunuzu gece gündüz çalıştırmaya hazır mısınız? Telegram bot barındırma sayfasındaki planlara bakın.

Botun başka bir yerde mi? Bize taşı

EN YENİ BLOG YAZILARIMIZ