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

Telegram.Bot (.NET) botu 24/7 nasıl barındırılır: VPS veya bot planı

Telegram botlarıUpdated Nov 6, 202611 min read

Bir Telegram.Bot (.NET) botunu 7/24 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 hizmetine sahip bir Linux VPS'te ya da PlayNHost Telegram bot barındırma sayfasındaki bir bot planında (aylık US$1,99'dan başlayan fiyatla). Orada C# projenizi yükler, @BotFather'dan aldığınız token'ı yapıştırır ve Start'a basarsınız. Testimizde Telegram.Bot 22.10.3.3 kullanan bir bot, .NET 8 üzerinde yaklaşık 61 MB bellek kullandı. Telegram.Bot mesajları long polling ile alır ve planlarımızın ihtiyacı olan da budur: planlarımızda henüz bir webhook için herkese açık HTTPS adresi yok. PlayNHost'taki adımlar:

  1. Telegram bot barındırma sayfasında bir planın üzerinde Sunucu oluştur'a tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusunu Telegram ile yanıtlayın ve C# (.NET) seçin.
  2. 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 .NET Bot çalıştırır.
  3. Telegram’a bağlan adımında token'ı Bot token’ınızı yapıştırın alanına yapıştırın, Bağlan'a tıklayın, gösterilen bot adını kontrol edin ve Evet, devam'a tıklayın.
  4. Kodunuz adımında Dosya yükle'ye tıklayın ve Bot.csproj ile Program.cs dosyalarını ana klasöre, bin ve obj klasörleri olmadan yükleyin ya da Git’i bağla'ya tıklayın.
  5. Bot sayfasında, Kod bölümünde, Çalışma ortamı ayarını .NET 8 (recommended) olarak bırakın ve Giriş dosyası alanını boş bırakın.
  6. Botu başlat'a tıklayın ve Console'u açın. Sunucu projenizi derler, ardından botunuz Logged in as @your_bot satırını yazdırır ve Genel bakış sayfasındaki rozet Telegram’da çevrimiçi olur.
  7. Bot sayfasında, Telegram bölümünde, Telegram’da aç'a 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, genel olarak .NET bot türü (iki yükleme yolu, derleme hataları) ise C# (.NET) Discord botu nasıl barındırılır yazısında anlatılıyor. Bu sayfa Telegram.Bot'un kendisiyle ilgilidir: bir sunucuda neyi kullandığı ve barındırmadan önce bilmeniz gerekenler.

Neyi ölçtük

KütüphaneSürümYüksüz bellekBaşlatmadan Telegram'ın yanıtına, derleme dahilProgramın çalışmasından Telegram'ın yanıtına
Telegram.Bot22.10.3.361 MB1,5 sn0,3 sn
Yalnızca .NET 8, kütüphanesizyok24 MB1,3 sn (derleme ve başlatma, çağrı yok)yok

Nasıl: kendi node'umuzda, 1 GB'lık bir bot planı gibi kurulmuş tek kullanımlık bir kapsayıcıda (.NET 8 imajı ve .NET bot türümüzün her başlatmada dotnet publish çalıştıran başlatma komutu), bot sahte bir token ile Telegram'ın getMe çağrısını yaptı ve Telegram bunu reddetti. Bellek, o yanıttan 15 saniye sonraki resident bellektir; ilk süre sütunu derlemenin başından yanıta kadar, ikincisi programın çalışmasından itibaren sürer ve her değer 2 ile 4. çalıştırmaların medyanıdır. Paketi de indiren en ilk derleme 5 saniye sürdü.

Bunlar alt sınırlardır: henüz sohbet, veri ve polling yok. Kendi kodunuz, belleğinde tuttukları ve sohbet sayısı bunlara eklenir. Her başlatmada derlemeyi atlamak için projeniz yerine kendi bilgisayarınızda yayımladığınız dosyaları yükleyebilirsiniz (yukarıda bağlantısı verilen C# rehberine bakın). Sayıları Telegram bot barındırma sayfasındaki planlarla karşılaştırın ve botunuzun ne yaptığına göre seçin.

Minimal bir Telegram.Bot botu

/start komutuna yanıt verir, token'ı TELEGRAM_BOT_TOKEN değişkeninden okur (panel onu kodunuza 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. Ana klasörde iki dosya:

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;

Sunucu her başlatmada dotnet publish komutunu Bot.csproj için çalıştırır ve Bot.dll dosyasını başlatır. Konsol sırasıyla [PlayNHost] Building your bot (the first build downloads packages and can take a minute), [PlayNHost] Starting your bot ve Logged in as @your_bot satırlarını gösterir; sonuncusu rozeti Telegram’da çevrimiçi durumuna getiren satırdır. Önce bilgisayarınızda gerçek token ile çalıştırdığınız kopyaları durdurun, yoksa iki kopya da Telegram'dan 409 Conflict hataları alır.

Token yanlışsa

Testimizde, sahte bir token ile Telegram.Bot'un GetMe() çağrısı şu hatayla başarısız oldu:

ApiRequestException: Unauthorized

Yukarıdaki bot bu reddi (hata kodu 401) polling'den önce ve polling sırasında yakalar, onun yerine Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. satırını yazdırır, sonra 1 çıkış koduyla durur. Panel bu satırı okur ve Console'un üstünde Telegram bot token’ınızı kabul etmedi başlıklı bir uyarı gösterir. Düzeltmek için @BotFather'a /mybots gönderin, botunuzu seçin, sonra API Token'ı seçip token'ı yeniden kopyalayın. Bot sayfasında, Telegram bölümünde Token’ı değiştir'e tıklayın, yapıştırın, Token’ı kaydet'e, sonra Şimdi yeniden başlat'a tıklayın.

Bir sunucuda Telegram.Bot hakkında bilmeniz gerekenler

  • Sürümler: Telegram.Bot 22.10.3.3, 9 Eki 2026'da çıktı. .NET Standard 2.0 ve .NET 6'yı hedefler, README'si .NET 8 veya daha yenisini önerir; bu yüzden panelin sunduğu her Çalışma ortamı (.NET 6, 8, 9 veya 10) onu derler; .NET 8 (recommended) yukarıdaki net8.0 ile eşleşir.
  • Metot adları 22. sürümde Async ekini kaybetti. Artık GetMe() ve SendMessage() var; GetMeAsync veya SendTextMessageAsync kullanan eğitimler eski sürümler için yazılmıştı, bu adlar 22.10.3.3'te yok ve kodları derlenmez. Derleme hatası, [PlayNHost] The build failed. Read the errors above, fix them and press Start. satırının hemen üstünde, Console içindedir.
  • OnMessage atamak polling'i başlatır. OnMessage (veya OnUpdate) olayına bir işleyici eklendiği anda istemci arka planda Telegram'ı yoklar ve her güncelleme türünü ister. Önce OnError işleyicisini ekleyin, yukarıdaki gibi.
  • OnError olmadan hatalar görünmez. Bir yoklama başarısız olduğunda Telegram.Bot hatayı OnError olayına iletir; işleyici yoksa hatayı .NET'in izleme çıktısına yazar ve bu çıktı konsola ulaşmaz. Token'ı iptal edilmiş ya da başka bir kopyanın 409 Conflict ile dışarı ittiği bir bot çalışıyormuş gibi görünür ve hiçbir şeye yanıt vermez. Yukarıdaki işleyici her hatayı yazdırır ve Telegram'ın kendi metni mesajda olduğu için panel Botunuz başka bir yerde de çalışıyor ya da Botunuzda bir webhook ayarlı uyarısını gösterebilir.
  • Bir hatadan sonra yavaşlayın. Polling döngüsü başarısız bir istekten hemen sonra yeniden sorar; yalnızca OnError işleyicinizin harcadığı süre kadar bekler. Yukarıdaki 5 saniyelik Task.Delay, kalıcı bir hatanın istek yağmuruna dönüşmesini engeller. Telegram'ın kendi 429 Too Many Requests yanıtları, Telegram 60 saniye veya daha kısa beklemenizi istediğinde sizin yerinize yeniden denenir: varsayılan olarak bir istek toplam en fazla 3 kez denenir.
  • Bir webhook sizin için kaldırılmaz. Webhook ayarlıyken polling 409 Conflict hatasıyla başarısız olur: can't use getUpdates method while webhook is active. Yukarıdaki bot polling'den önce DeleteWebhook() çağrısını yapar ve bekleyen mesajlar korunur; Telegram bölümünde Webhook’u kaldır'a da tıklayabilirsiniz. Kendi webhook'unuz herkese açık bir HTTPS adresi ister ve planlarımızda henüz yok. Webhook kullanan bir barındırmadan geçiyorsanız: Telegram botunuzu PlayNHost’a nasıl taşırsınız.
  • Console.ReadLine() ile beklemeyin. Kütüphanenin rehberindeki ilk bot siz Enter'a basana kadar çalışır. Bir sunucuda kimse Enter'a basmaz ve systemd altında programın girdisi varsayılan olarak boştur; bu yüzden ReadLine() hemen döner ve bot sona erer. Yukarıdaki gibi await Task.Delay(Timeout.Infinite) ile bekleyin.
  • Çökmeler: bot sona erdiğinde (yukarıdaki botun reddedilen bir token'da yaptığı gibi) panel onu hemen yeniden başlatır ve önce yeniden derler. Bundan sonra bir dakika içinde yine durursa durmuş kalır ve Console nedenini söyler. İki tür 409 için Telegram botu 409 Conflict hatasını düzeltin yazısına bakın.

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

Bir VPS'te botu kendi bilgisayarınızda derleyin ve sunucuda yalnızca sonucu çalıştırın. .NET 8 SDK ile yayımlayın:

dotnet publish Bot.csproj -c Release -o publish

Ubuntu 24.04'te .NET 8 çalışma zamanı Ubuntu'nun kendi paketlerinde bulunur:

sudo apt update
sudo apt install dotnet-runtime-8.0
dotnet --list-runtimes

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

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp -r publish/. /opt/mybot/
sudo chown -R mybot: /opt/mybot

Token'ı kodunuzdan uzak tutun, yalnızca root'un okuyabileceği bir dosyada:

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=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

Ş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 ayarı botu, sona erdikten veya çöktükten 5 saniye sonra yeniden başlatır, ancak onu systemctl stop ile durdurduktan sonra başlatmaz. Güncellemek için yeniden yayımlayın, yeni dosyaları eskilerinin üzerine kopyalayın ve sudo systemctl restart mybot çalıştırın. Debian'da .NET dağıtımın kendi paketlerinde yoktur; Microsoft'un kurulum yönergeleri bunu kapsar.

Kendi barındırmanız mı, bot planı mı

Kendiniz yönettiğiniz bir VPS'te şunlar size aittir:

  • İşletim sistemi güncellemeleri ve güvenlik ile .NET çalışma zamanı yükseltmeleri.
  • Her yeni derlemenin yayımlanması ve kopyalanması, hizmet dosyası, token dosyası ve izinleri.
  • Botun neden durduğunu veya yanıt vermeyi bıraktığını anlamak 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.

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

  • Bir seçiciden .NET 6, 8, 9 veya 10 ve derleme: projeyi yükleyin ve Start'a basın.
  • Kaydedilmeden önce Telegram ile denetlenen, şifrelenmiş olarak saklanan ve kodunuza beş adla verilen token.
  • Çökmeden sonra botun yeniden başlatılması. Bir dakika içinde yine çökerse durmuş kalır ve Console nedenini söyler.
  • Telegram bölümünde bir Webhook’u kaldır düğmesi ve bir satır reddedilen bir token'ı, başka bir kopyayı veya bir webhook'u gösterdiğinde nedeni söyleyen, Console'un üstündeki uyarılar.
  • Panelden yükleme, Git ile dağıtım ve yedekler.

Sık sorulan sorular

Telegram.Bot botum çalışıyor ama hiç yanıt vermiyor. Neden?

Çoğunlukla polling başarısız olur ve bunu hiçbir şey söylemez: OnError işleyicisi olmadan hatalar konsola değil, .NET'in izleme çıktısına gider. Yukarıdaki bottaki işleyiciyi ekleyin ve yeniden başlatın. Olağan nedenler aynı token ile polling yapan başka bir kopya (409 Conflict), botta hâlâ ayarlı bir webhook ya da @BotFather'da iptal edilmiş bir token'dır.

Burada Telegram.Bot'u bir webhook ile kullanabilir miyim?

Planlarımızda henüz hayır: bir webhook herkese açık bir HTTPS adresi ister ve planlarımız bunu içermez. Polling buna ihtiyaç duymaz, çünkü bot yeni mesajları Telegram'dan kendisi ister ve OnMessage tam olarak bunu yapar.

Her başlatmadaki derleme botumu yavaşlatır mı?

Yalnızca başlatmayı: testimizde başlatma derlemeyle 1,5 saniye sürdü, yalnızca program için ise 0,3 saniye. Çalışmaya başladıktan sonra bot aynıdır. Derlemeyi atlamak için bilgisayarınızda yayımlayın ve proje yerine publish klasöründeki dosyaları yükleyin.

Hangi .NET sürümünü seçmeliyim?

Önerilen .NET 8, projenizde yukarıdaki gibi net8.0 ile. Telegram.Bot .NET 6, 9 ve 10'da da derlenir; aynı sürümü TargetFramework içinde ve Çalışma ortamı ayarında belirleyin. Çalışma ortamı ayarından daha yeni bir .NET için hazırlanmış proje derlemeyi NETSDK1045 ile durdurur; daha eski bir .NET için hazırlanmış proje derlenir ama başlamaz, çünkü o .NET imajda kurulu değildir.

Telegram.Bot botunuzu günün her saati ç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