Bir pyTelegramBotAPI (telebot) botunu 24/7 barındırmak için onu bilgisayarınızda değil, her zaman açık kalan bir makinede çalıştırın: bir çökme veya yeniden başlatmadan sonra botu tekrar başlatan bir systemd servisi olan Linux VPS ya da kodunuzu yüklediğiniz, token'ı yapıştırdığınız ve Başlat'a bastığınız bir PlayNHost bot planı (ayda US$1,99'dan başlayan fiyatlarla, bkz. Telegram bot barındırma). Testimizde pyTelegramBotAPI 4.37.1 kullanan bir bot yük yokken yaklaşık 40 MB bellek kullandı; en küçük bot planımız STARTER 0,5 GB'a sahip. Her iki yol da long polling kullanır: bot.infinity_polling() Telegram'dan yeni mesajları ister, bu yüzden botun herkese açık bir adrese ihtiyacı yoktur. PlayNHost adımları:
- Telegram'da @BotFather'a
/newbotgönderin ve verdiği token'ı kopyalayın. - Telegram bot barındırma sayfasında bir planda Sunucu oluştur düğmesine tıklayın. Sipariş penceresinde Botunuz hangi platform için? sorusunu Telegram ile yanıtlayın ve Python'u 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, Bu bot Python Bot çalıştırır. demelidir.
- Telegram’a bağlan adımında token'ı yapıştırın ve Bağlan düğmesine tıklayın. Gösterilen bot adını kontrol edin ve Evet, devam düğmesine tıklayın.
- Kodunuz adımında Dosya yükle düğmesine tıklayıp Files sayfasını açın ve
bot.pyilerequirements.txtdosyalarını yükleyin ya da Git’i bağla düğmesine tıklayın.requirements.txtiçinde paketpyTelegramBotAPIolur,telebotdeğil. - Bot sayfasında, Kod bölümünde, Giriş dosyasının
infinity_polling()çağıran dosya olduğunu (varsayılan olarakbot.py) ve Çalışma ortamının Python 3.11 veya daha yeni olduğunu kontrol edin. - Botu başlat düğmesine tıklayın, Console'u açın ve
Logged in as @your_botsatırını bekleyin. Genel bakış sayfasındaki etiket Telegram’da çevrimiçi olarak değişir. Botunuza/startgönderin.
İlk başlatma, pip pyTelegramBotAPI'yi kurarken daha uzun sürer. Sonrasında yalnızca gereksinim dosyanız, ek paketler veya Python sürümü değiştiğinde ya da günde bir kez yeniden kurar. Ekran görüntüleriyle adım adım: Telegram botu nasıl barındırılır.
Ne ölçtük
Üç Python Telegram kütüphanesini kendi sunucularımızdan birinde, panelin bir Python botunu çalıştırdığı gibi kurulmuş tek kullanımlık konteynerlerde çalıştırdık: Python 3.12 (önerilen olarak işaretli Çalışma ortamı), aynı pip komutuyla kurulan paketler, 1 GB bellek sınırı ve bir CPU çekirdeği.
| Kütüphane | Sürüm | Boşta bellek | Başlangıçtan Telegram'ın yanıtına | Kurulu boyut, bağımlılıklarla |
|---|---|---|---|---|
| pyTelegramBotAPI (TeleBot) | 4.37.1 | 40 MB | 0,7 sn | 21,9 MB |
| python-telegram-bot | 22.8 | 44 MB | 0,9 sn | 12,3 MB |
| aiogram | 3.31.0 | 173 MB | 4,3 sn | 33,9 MB |
| Yalnızca Python 3.12 | 9 MB |
Her bot kütüphaneyi yükledi ve Telegram'a sahte bir token ile kim olduğunu sordu (pyTelegramBotAPI: bot.get_me(), düz TeleBot üzerinde). Bellek, Telegram token'ı reddettikten 15 saniye sonra botun süreçlerinin tuttuğu miktardır; başlangıç süresi Python'u başlatmaktan kütüphanenin bu yanıtı bildirmesine kadar sürer, dolayısıyla Telegram'a bir gidiş geliş içerir. İkisi de bir ısınma çalıştırmasından sonraki üç çalıştırmanın medyanıdır.
Bu rakamlar kütüphanenin tabanıdır: sohbet yok, iş yapan işleyici yok, önbellekte hiçbir şey yok. Kendi kodunuz, belleğinde tuttuğu veriler ve hizmet verdiği sohbet sayısı bunların üstüne eklenir, bu yüzden planı botunuzun yaptığı işe göre seçin. Kurulu boyut, yalnızca düz TeleBot kullansanız bile pyTelegramBotAPI'nin bağlı olduğu iki HTTP kütüphanesini, requests ve aiohttp'yi de içerir.
Minimal bir pyTelegramBotAPI botu
/start komutuna yanıt verir, panelin verdiği token'ı okur ve bir hazır satırı yazdırır. Kütüphaneyi requirements.txt dosyasına koyun:
pyTelegramBotAPI>=4,<5
Kodu da bot.py dosyasına:
import os
import telebot
bot = telebot.TeleBot(os.environ["TELEGRAM_BOT_TOKEN"])
@bot.message_handler(commands=["start"])
def start(message):
bot.reply_to(message, "Hello! I am running on PlayNHost.")
bot.delete_webhook()
print(f"Logged in as @{bot.user.username}")
bot.infinity_polling()
Polling'den önceki iki çağrı bir barındırmada önemlidir. delete_webhook() başka bir barındırmadan kalan webhook'u kaldırır, bot.user ise Telegram'a botun kim olduğunu sorar; böylece Logged in as @your_bot yalnızca Telegram'ın kabul ettiği bir token ile görünür. Panel bu satırı Telegram’da çevrimiçi göstermek için okur. Her iki çağrı da token yanlış olduğunda botu, polling'in arka planda yeniden denemesine izin vermek yerine, net bir hatayla hemen durdurur. Panel token'ı koda TELEGRAM_BOT_TOKEN olarak, ayrıca BOT_TOKEN, TOKEN ve TELEGRAM_TOKEN olarak verir.
Token yanlışsa
Testimizde, Telegram'ın reddettiği bir token ile test botumuz şunu yazdırdı:
ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized
Tam bir traceback'te sınıf telebot.apihelper.ApiTelegramException olarak görünür. Yukarıdaki botla ilk çağrı başarısız olur ve bot çıkış koduyla 1 ile durur; PlayNHost'ta panel konsolun üstünde Telegram bot token’ınızı kabul etmedi uyarısını Token’ı değiştir düğmesiyle gösterir. Düzeltmek için token'ı yeniden kopyalayın: @BotFather'da /mybots gönderin, botunuzu seçin, sonra API Token seçeneğini seçin. Bunu Bot sayfasında, Telegram bölümünde, Jeton altına yapıştırın ve botu yeniden başlatın.
Çoğu örnekte olduğu gibi hemen infinity_polling() çağıran bir bot farklı davranır: durmaz. Polling önce Telegram'a botun kim olduğunu sorar; reddedilen bir token ile bu başarısız olur ve bot Infinity polling exception: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized kaydını yazar ve süreç çalıştığı sürece her 3 saniyede bir yeniden dener. Bot zaten polling yaparken iptal edilen bir token ise bunun yerine aynı mesajla Threaded polling exception: verir; her seferinde ikiye katlanan, en fazla bir dakikaya kadar çıkan bir beklemeden sonra yeniden denenir. Her iki durumda da hiçbir şey yanıt vermezken bot çalışıyor gibi görünür. Panel iki satırı da tanır ve aynı uyarıyı gösterir.
Bir barındırmanın pyTelegramBotAPI hakkında bilmesi gerekenler
- Paket ve import adları:
pyTelegramBotAPIkurarsınız vetelebotimport edersiniz. PyPI'dakitelebotadlı paket başka, küçük bir projedir;pyTelegramBotAPIpaketinirequirements.txtiçine yazın. - Python sürümü: pyTelegramBotAPI 4.37.1, Python 3.11 veya daha yenisini gerektirir. Python 3.10'da pip hata vermez: 3.10'a izin veren son sürüm olan 4.37.0'ı kurar. Güncel sürümü almak için Kod bölümündeki Çalışma ortamını 3.11 veya daha yeni tutun (3.12 önerilen olarak işaretlidir).
infinity_polling()veyapolling():infinity_polling()kullanın. Düzpolling()Telegram'dan gelen ilk hatada durur ve işleyicilerinizden birindeki bir exception de onu sonlandırır, yani bot çıkar.infinity_polling()ile Telegram'dan gelen hatalar yeniden denenir ve bir işleyicideki diğer her exception, polling 3 saniye sonra yeniden başlamadan önceInfinity polling exception: ...olarak kaydedilir.- Günlük kaydı: pyTelegramBotAPI'nin kendi logger'ı vardır,
TeleBot,ERRORdüzeyine ayarlıdır; bu yüzden başlarken hiçbir şey yazdırmaz; yukarıdaki botun kendi hazır satırını yazdırmasının nedeni budur. Hatalar traceback olmadan tek satır olarak görünür. Bir işleyicinin nerede başarısız olduğunu görmek içinbot.infinity_polling(logger_level=logging.DEBUG)ile başlatın (veimport loggingekleyin); bu traceback'i ekler. Bu satırlar token'ınızın gizli kısmını gizler. - Başka bir barındırmadan kalan webhook: polling onu kaldırmaz ve biri ayarlıyken Telegram polling'i reddeder.
bot.delete_webhook()satırını yukarıdaki gibi tutun ya da Bot sayfasında, Telegram bölümünde Webhook’u kaldır düğmesine tıklayın. - Thread'ler veya asyncio:
TeleBotrequests kullanır ve işleyicileri varsayılan olarak iki worker thread'inde çalıştırır (num_threads=2); yavaş bir işleyici bunlardan birini tutar.AsyncTeleBot(telebot.async_telebotiçinden) aiohttp kullanır veasyncio.run(bot.polling())ile çalışır. İkisi de panelde aynı şekilde çalışır. - İkinci bir kopya: başka bir kopya aynı token ile polling yaptığında Telegram
409 Conflictyanıtı verir veinfinity_polling()çalıştığı sürece yeniden dener. Panel Botunuz başka bir yerde de çalışıyor uyarısını gösterir. Bkz. Telegram botu 409 Conflict hatasını düzeltin.
Linux VPS üzerinde kendiniz barındırın
Debian veya Ubuntu'da Python'u kurun, bot için bir kullanıcı oluşturun ve kütüphaneyi bir sanal ortama kurun. Önce python3 --version komutunu kontrol edin: 3.11'in altında pip daha eski bir pyTelegramBotAPI kurar.
sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt
Token'ı yalnızca root'un okuyabildiği bir dosyaya koyun. Dosyayı sudo nano /etc/tgbot.env ile açın, tek bir satır yazın, kaydedin, sonra sudo chmod 600 /etc/tgbot.env çalıştırın:
TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather
/etc/systemd/system/tgbot.service dosyasını oluşturun:
[Unit]
Description=Telegram bot (pyTelegramBotAPI)
Wants=network-online.target
After=network-online.target
[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
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 tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 burada önemlidir: Python'un çıktısı bir terminale gitmediğinde blok olarak tamponlanır, bu yüzden bu olmadan Logged in as journal'a ulaşmak yerine bir tamponda kalabilir. Restart=always, bot yanlış bir token yüzünden durduktan 5 saniye sonra onu yeniden başlatır, bu yüzden sürekli yeniden başlıyorsa journal'a bakın. Kodu değiştirdikten sonra sudo systemctl restart tgbot çalıştırın. Önce bilgisayarınızdaki her kopyayı durdurun, yoksa Telegram 409 Conflict yanıtı verir.
Kendi barındırmanız veya bot planı
- Yönettiğiniz bir VPS'te: sistem güncellemeleri, Python sürümü, sanal ortam, paketleri yeniden kurma, unit dosyası, journal'ı okuma ve botun yanıt vermeyi bıraktığını fark etme sizdedir. Karşılığında root erişiminiz olur ve bir alan adı ile HTTPS eklerseniz webhook çalıştırabilirsiniz.
- Bir bot planında panel şunları yapar:
requirements.txtdeğiştiğinde onu kurar, bir çökmeden sonra botu yeniden başlatır, token'ı kaydetmeden önce Telegram ile kontrol eder, koda beş adla verir, konsolu okur ve bot yanıt vermeyi bıraktığında nedeni söyler (reddedilen bir token, ikinci bir kopya, bir webhook); token ve webhook için bir düğme sunar. Bot planlarımız henüz herkese açık bir HTTPS adresi içermez, bu yüzden oradaki botlar long polling kullanır;infinity_polling()de tam olarak bunu yapar.
İnsanların sorduğu sorular
telebot botum çalışıyor ama neden hiç yanıt vermiyor?
Çünkü infinity_polling() Telegram'dan gelen her hatayı durmadan yeniden dener: reddedilen bir token, aynı token'ı kullanan başka bir kopya, botta kalmış bir webhook. Infinity polling exception (başlangıçta reddedilen token) veya Threaded polling exception (polling çalışmaya başladıktan sonra) içeren satırları Console'da arayın; panel bu üç nedenin her birini onu adlandıran bir uyarıya dönüştürür.
ModuleNotFoundError: No module named 'telebot' hatası alıyorum. Ne eksik?
Paket. pyTelegramBotAPI paketini requirements.txt dosyasına ekleyin ve botu yeniden başlatın: gereksinim dosyası değiştiği için pip onu bu başlatmada kurar. Import import telebot olarak kalır.
pyTelegramBotAPI çevrimiçi kalmak için webhook'a ihtiyaç duyar mı?
Hayır. infinity_polling() Telegram'dan yeni mesajları istemeye devam eder, bu yüzden bot süreç çalıştığı sürece yanıt verir. Webhook kullanan bir botu taşımak için: Telegram botunuzu PlayNHost’a nasıl taşırsınız.
TeleBot mu AsyncTeleBot mu kullanmalıyım?
İkisi de bir bot planında çalışır. Kodunuzun veya öğreticinizin kullandığını kullanın: TeleBot ile işleyiciler düz fonksiyonlardır, AsyncTeleBot ile async def fonksiyonlarıdır ve botun metotlarını await ile bekler. Yukarıdaki ölçümümüz düz TeleBot içindir.
pyTelegramBotAPI, STARTER'dan (0,5 GB) başlayarak her PlayNHost bot planında çalışır. Planları karşılaştırın ve Sunucu oluştur düğmesine Telegram bot barındırma sayfasında tıklayın.



