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

pyTelegramBotAPI botu 24/7 nasıl barındırılır

Telegram botlarıUpdated Nov 6, 20269 min read

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ı:

  1. Telegram'da @BotFather'a /newbot gönderin ve verdiği token'ı kopyalayın.
  2. 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.
  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, Bu bot Python Bot çalıştırır. demelidir.
  4. 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.
  5. Kodunuz adımında Dosya yükle düğmesine tıklayıp Files sayfasını açın ve bot.py ile requirements.txt dosyalarını yükleyin ya da Git’i bağla düğmesine tıklayın. requirements.txt içinde paket pyTelegramBotAPI olur, telebot değil.
  6. Bot sayfasında, Kod bölümünde, Giriş dosyasının infinity_polling() çağıran dosya olduğunu (varsayılan olarak bot.py) ve Çalışma ortamının Python 3.11 veya daha yeni olduğunu kontrol edin.
  7. Botu başlat düğmesine tıklayın, Console'u açın ve Logged in as @your_bot satırını bekleyin. Genel bakış sayfasındaki etiket Telegram’da çevrimiçi olarak değişir. Botunuza /start gö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üphaneSürümBoşta bellekBaşlangıçtan Telegram'ın yanıtınaKurulu boyut, bağımlılıklarla
pyTelegramBotAPI (TeleBot)4.37.140 MB0,7 sn21,9 MB
python-telegram-bot22.844 MB0,9 sn12,3 MB
aiogram3.31.0173 MB4,3 sn33,9 MB
Yalnızca Python 3.129 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ı: pyTelegramBotAPI kurarsınız ve telebot import edersiniz. PyPI'daki telebot adlı paket başka, küçük bir projedir; pyTelegramBotAPI paketini requirements.txt iç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() veya polling(): infinity_polling() kullanın. Düz polling() 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 önce Infinity polling exception: ... olarak kaydedilir.
  • Günlük kaydı: pyTelegramBotAPI'nin kendi logger'ı vardır, TeleBot, ERROR dü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çin bot.infinity_polling(logger_level=logging.DEBUG) ile başlatın (ve import logging ekleyin); 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: TeleBot requests 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_telebot içinden) aiohttp kullanır ve asyncio.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 Conflict yanıtı verir ve infinity_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.txt değ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.

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

EN YENİ BLOG YAZILARIMIZ