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:
- 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.
- 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.
- 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.
- Kodunuz adımında Dosya yükle'ye tıklayın ve
Bot.csprojileProgram.csdosyalarını ana klasöre,binveobjklasörleri olmadan yükleyin ya da Git’i bağla'ya tıklayın. - 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.
- Botu başlat'a tıklayın ve Console'u açın. Sunucu projenizi derler, ardından botunuz
Logged in as @your_botsatırını yazdırır ve Genel bakış sayfasındaki rozet Telegram’da çevrimiçi olur. - Bot sayfasında, Telegram bölümünde, Telegram’da aç'a tıklayın ve botunuza
/startgö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üphane | Sürüm | Yüksüz bellek | Başlatmadan Telegram'ın yanıtına, derleme dahil | Programın çalışmasından Telegram'ın yanıtına |
|---|---|---|---|---|
| Telegram.Bot | 22.10.3.3 | 61 MB | 1,5 sn | 0,3 sn |
| Yalnızca .NET 8, kütüphanesiz | yok | 24 MB | 1,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.0ile eşleşir. - Metot adları 22. sürümde
Asyncekini kaybetti. ArtıkGetMe()veSendMessage()var;GetMeAsyncveyaSendTextMessageAsynckullanan 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. OnMessageatamak polling'i başlatır.OnMessage(veyaOnUpdate) olayına bir işleyici eklendiği anda istemci arka planda Telegram'ı yoklar ve her güncelleme türünü ister. ÖnceOnErrorişleyicisini ekleyin, yukarıdaki gibi.OnErrorolmadan hatalar görünmez. Bir yoklama başarısız olduğunda Telegram.Bot hatayıOnErrorolayı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ın409 Conflictile 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
OnErrorişleyicinizin harcadığı süre kadar bekler. Yukarıdaki 5 saniyelikTask.Delay, kalıcı bir hatanın istek yağmuruna dönüşmesini engeller. Telegram'ın kendi429 Too Many Requestsyanı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 Conflicthatasıyla başarısız olur:can't use getUpdates method while webhook is active. Yukarıdaki bot polling'den önceDeleteWebhook()ç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üzdenReadLine()hemen döner ve bot sona erer. Yukarıdaki gibiawait 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
journalctlokumak. - 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.



