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

python-telegram-bot botu 24/7 nasıl barındırılır

Telegram botlarıUpdated Nov 6, 20269 min read

Bir python-telegram-bot botunu 24/7 barındırmak için onu kendi bilgisayarınızda değil, hep açık kalan bir makinede çalıştırın: çökme veya yeniden başlatma sonrası botu tekrar başlatan bir systemd servisi olan bir Linux VPS ya da PlayNHost bot planı (ayda US$1,99’dan başlayan fiyatlarla, bkz. Telegram bot barındırma); kodunuzu yükler, token’ı yapıştırır ve Start’a basarsınız. Testimizde bir python-telegram-bot 22.8 botu yük yokken yaklaşık 44 MB bellek kullandı; en küçük bot planımız STARTER 0,5 GB’a sahip. İki yol da long polling kullanır: run_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 şunu göstermelidir: Bu bot Python Bot çalıştırır.
  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. Henüz kodunuz yok mu? Başlangıç botu oluştur sizin için bir python-telegram-bot 22 botu yazar.
  6. Bot sayfasında, Kod bölümünde, Giriş dosyası alanının run_polling() çağıran dosya olduğunu kontrol edin (varsayılan olarak bot.py).
  7. Botu başlat düğmesine tıklayın, Console sayfasını açın ve Logged in as @your_bot satırını bekleyin. Genel bakış sayfasındaki rozet Telegram’da çevrimiçi olarak değişir. Botunuza /start gönderin.

İlk başlatma, pip python-telegram-bot’u kurarken daha uzun sürer. Bundan sonra yalnızca requirements 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ığı şekilde 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ştaki bellekBaşlangıçtan Telegram’ın yanıtınaBağımlılıklarla kurulu boyut
python-telegram-bot22.844 MB0,9 sn12,3 MB
aiogram3.31.0173 MB4,3 sn33,9 MB
pyTelegramBotAPI4.37.140 MB0,7 sn21,9 MB
Yalnızca Python 3.129 MB

Her bot kütüphaneyi yükledi ve sahte bir token ile Telegram’a kim olduğunu sordu (python-telegram-bot: Application.initialize()). Bellek, Telegram token’ı reddettikten 15 saniye sonra botun süreçlerinin tuttuğu miktardır; başlangıç süresi Python’un başlatılmasından kütüphanenin bu yanıtı bildirmesine kadar sürer, bu yüzden Telegram’a bir gidiş dönüşü de 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, çalışan handler yok, önbellekte hiçbir şey yok. Kendi kodunuz, belleğinde tuttuğu veriler ve hizmet verdiği sohbet sayısı bunların üzerine eklenir, bu yüzden planı botunuzun yaptığı işe göre seçin. Daha eski sayfamız PlayNHost’ta python-telegram-bot ve aiogram karşılaştırması farklı bir kurulumu ölçtü (Python 3.13, derlenmiş ve başlatılmaya hazır bir bot), bu yüzden rakamları bunlarla karşılaştırılamaz.

Minimal bir python-telegram-bot 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:

python-telegram-bot>=22,<23

Kodu da bot.py dosyasına yazın:

import os

from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.effective_message.reply_text("Hello! I am running on PlayNHost.")


async def post_init(application: Application) -> None:
    print(f"Logged in as @{application.bot.username}")


def main() -> None:
    application = (
        Application.builder()
        .token(os.environ["TELEGRAM_BOT_TOKEN"])
        .post_init(post_init)
        .build()
    )
    application.add_handler(CommandHandler("start", start))
    application.run_polling(allowed_updates=Update.ALL_TYPES)


if __name__ == "__main__":
    main()

post_init, uygulama başlatıldıktan sonra çalışır; python-telegram-bot token’ı Telegram ile tam bu sırada doğrular, bu yüzden Logged in as @your_bot satırı yalnızca Telegram token’ı kabul ettikten sonra görünür. Panel Telegram’da çevrimiçi durumunu göstermek için bu satırı okur. Panel token’ı kodunuza TELEGRAM_BOT_TOKEN olarak, ayrıca BOT_TOKEN, TOKEN ve TELEGRAM_TOKEN olarak da verir; bu yüzden kütüphanenin örneklerinden başlıyorsanız os.environ["TOKEN"] de çalışır; örnekler bir "TOKEN" yer tutucusu kullanır.

Token yanlışsa

Testimizde, Telegram’ın reddettiği bir token ile test botumuz şunu yazdırdı:

InvalidToken: The token `1000000000:AAFakeTokenForAMemoryTestNotReal00000` was rejected by the server.

python-telegram-bot, polling başlamadan önce token’ı doğrular, bu yüzden yukarıdaki bot 1 çıkış koduyla hemen durur. Konsol önce bir traceback ile Network Retry Loop (Bootstrap Initialize Application): Invalid token. Aborting retry loop. satırını, ardından hatanın kendi traceback’ini gösterir; bunun son satırı şudur: telegram.error.InvalidToken: The token `...` was rejected by the server. PlayNHost’ta panel, konsolun üstünde Telegram bot token’ınızı kabul etmedi iletisini ve Token’ı değiştir düğmesini gösterir. Her iki traceback’in de token’ın kendisini içerdiğini unutmayın: bu konsol çıktısını herkese açık hiçbir yere yapıştırmayın.

Düzeltmek için token’ı yeniden kopyalayın: @BotFather’da /mybots gönderin, botunuzu seçin, ardından API Token seçeneğini seçin. Onu Bot sayfasında, Telegram bölümünde, Jeton altına yapıştırın ve botu yeniden başlatın. Bot zaten polling yaparken token iptal edilirse, python-telegram-bot Network Retry Loop (Polling Updates): Invalid token. Aborting retry loop. kaydeder ve polling’i durdurur, ancak süreç çalışmaya devam eder; bu yüzden hiçbir şey yanıt vermezken bot çalışıyor gibi görünür. Panel aynı bannerı gösterir.

Bir barındırıcının python-telegram-bot hakkında bilmesi gerekenler

  • Paket ve import adları: python-telegram-bot kurarsınız ve telegram ile telegram.ext import edersiniz.
  • Python sürümü: python-telegram-bot 22.8, Python 3.10 veya daha yenisini gerektirir. Kod bölümündeki Çalışma ortamı 3.10’dan 3.14’e kadar sunar ve 3.12 önerilen olarak işaretlidir, bu yüzden her seçim bunu karşılar.
  • Başka bir barındırıcıdan kalan webhook: polling’e başlamadan önce run_polling() bot için ayarlanmış tüm webhook’ları siler, bu yüzden bir webhook barındırıcısından taşınan bot ek kod olmadan çalışır. Telegram’da bekleyen mesajlar, drop_pending_updates=True geçmediğiniz sürece saklanır.
  • Loglama: python-telegram-bot başlangıcını INFO düzeyinde kaydeder; Python loglamayı kurana kadar bunu göstermez, bu yüzden yukarıdaki bot kendi hazır satırını yazdırır. logging.basicConfig(level=logging.INFO) ile INFO:telegram.ext.Application:Application started kaydeder, bunu panel de hazır olarak okur. Bunu yaparsanız kütüphanenin kendi örneklerinin yaptığı gibi logging.getLogger("httpx").setLevel(logging.WARNING) satırını da ekleyin: INFO düzeyinde HTTP kütüphanesi her istek URL’sini kaydeder ve Telegram’ın istek URL’leri token’ınızı içerir.
  • Zamanlanmış işler: JobQueue bir ek gerektirir. python-telegram-bot[job-queue]>=22,<23 satırını requirements.txt dosyasına yazın; bu olmadan application.job_queue değeri None olur ve kütüphane şunu uyarır: No `JobQueue` set up.
  • İkinci bir kopya: başka bir kopya aynı token ile polling yaptığında Telegram 409 Conflict yanıtını verir. python-telegram-bot Exception happened while polling for updates. kaydeder ve denemeye devam eder, bu yüzden bot çalışıyor gibi görünür ama mesajları kaçırır. Panel Botunuz başka bir yerde de çalışıyor iletisini gösterir. Bkz. Telegram botu 409 Conflict hatasını düzeltin.

Bir Linux VPS üzerinde kendiniz barındırın

Debian veya Ubuntu üzerinde Python’u kurun, bot için bir kullanıcı oluşturun ve kütüphaneyi bir sanal ortama kurun. python3 --version çıktısının 3.10 veya daha yeni olduğunu kontrol edin.

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, bir satır yazın, kaydedin, ardından 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 (python-telegram-bot)
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

Servisi şimdi ve her açılışta başlatın, ardından çı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 halinde tamponlanır, bu yüzden bu olmadan Logged in as satırı journal’a ulaşmak yerine bir tamponda bekleyebilir. systemctl stop tgbot, SIGTERM gönderir ve run_polling() bunu temiz bir şekilde kapanarak işler. Kodu değiştirdikten sonra sudo systemctl restart tgbot çalıştırın. Önce bilgisayarınızdaki tüm kopyaları durdurun, yoksa Telegram 409 Conflict yanıtını verir.

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

  • Yönettiğiniz bir VPS’te: sistem güncellemeleri, Python sürümü, sanal ortam, paketlerin yeniden kurulması, unit dosyası, journal’ın okunması ve botun yanıt vermeyi bıraktığının fark edilmesi size aittir. Karşılığında root yetkiniz vardır ve bir alan adı ile HTTPS eklerseniz webhook çalıştırabilirsiniz.
  • Bir bot planında panel şunları yapar: requirements.txt dosyasını değiştiğinde kurar, bir çökmeden sonra botu yeniden başlatır, token’ı kaydetmeden önce Telegram ile doğrular, onu kodunuza beş adla verir, konsolu okur ve bot yanıt vermeyi bıraktığında nedeni adlandırır (reddedilen bir token, ikinci bir kopya, bir webhook); token ve webhook için bir düğme de sunar. Bot planlarımız henüz herkese açık bir HTTPS adresi içermez, bu yüzden oradaki botlar long polling kullanır ve run_polling() tam olarak bunu yapar.

Ayrıca bkz. python-telegram-bot botunda MySQL veritabanı kullanma (aiomysql).

Sık sorulan sorular

Bir python-telegram-bot botunu çevrimiçi tutmak için webhook gerekir mi?

Hayır. run_polling() Telegram’a açık bir bağlantı tutar ve yeni mesajları ister, bu yüzden bot, süreç çalıştığı sürece yanıt verir. Webhook herkese açık bir HTTPS adresi gerektirir ve bot planlarımız bunu henüz içermez. Webhook kullanan bir botu taşımak için: Telegram botunuzu PlayNHost’a nasıl taşırsınız.

Token’ım konsolda neden göründü?

İki yaygın yerde görünür: Telegram token’ı reddettiğinde InvalidToken iletisi ve loglama INFO düzeyindeyken HTTP kütüphanesinin istek satırları. Yukarıda gösterildiği gibi httpx logger’ını WARNING olarak ayarlayın. Başlangıç botumuz da InvalidToken yakalar ve onun yerine düz bir satır yazdırır.

run_repeating ve diğer zamanlanmış işleri kullanabilir miyim?

Evet, job-queue ekiyle; bunu requirements.txt dosyasına yazın. Ek, requirements dosyası değiştiği için APScheduler’ı bir sonraki başlatmada kurar. İşler bot sürecinin içinde çalışır, bu yüzden bot çalıştığı sürece çalışmaya devam eder.

Başlangıç botu python-telegram-bot kullanıyor mu?

Evet. Bir Python sunucusunda Başlangıç botu oluştur bot.py dosyasını ve python-telegram-bot 22 içeren bir requirements.txt dosyasını yazar. /start komutuna yanıt verir, Logged in as @your_bot yazdırır ve token’ı log satırlarının dışında tutar. İstediğiniz gibi değiştirin, ardından yeniden başlatın.

python-telegram-bot her PlayNHost bot planında çalışır, STARTER (0,5 GB) ve üzeri. Planları karşılaştırın ve Sunucu oluştur düğmesine Telegram bot barındırma sayfasından tıklayın.

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

EN YENİ BLOG YAZILARIMIZ