Perbedaan Script Bot Telegram: Webhook dan Polling dengan Python + pytelegrambotapi

Bot Telegram dengan Python dapat dijalankan dengan dua cara menerima pesan, yaitu polling dan webhook. Pada dasarnya keduanya menjalankan logika yang sama — handler perintah dan balasan teks — namun berbeda dalam bagaimana pesan diterima dari server Telegram. Artikel ini membandingkan keduanya secara detail menggunakan Python dan library python-telegram-bot, lengkap dengan contoh script, cara pasang virtual environment (venv), serta penjelasan kapan sebaiknya memakai salah satu metode.

Pengertian

Polling

Polling adalah metode di mana bot secara berkala mengirim permintaan (getUpdates) ke server Telegram untuk mengecek apakah ada pesan baru. Bot menanyakan "ada pesan belum?" secara berulang dalam interval singkat, lalu langsung memproses jika ada pesan masuk.

Webhook

Webhook adalah metode di mana bot memberi tahu server Telegram alamat URL (endpoint) yang harus dituju setiap kali ada pesan masuk. Alih-alih mengecek sendiri, Telegram mengirimkan pesan secara push ke URL yang sudah ditentukan. Bot hanya perlu menyediakan server HTTP yang mendengarkan di URL tersebut.

Perbandingan Detail

AspekPollingWebhook
Cara kerjaBot mengecek pesan secara berkala via getUpdates.Telegram mengirim pesan secara otomatis ke URL bot.
KoneksiBot ke server Telegram (outgoing).Server Telegram ke bot (incoming).
Kebutuhan serverServer publik tidak wajib (bisa di localhost).Server publik dengan URL/HTTPS wajib.
LatensiSedang (tergantung interval poll).Rendah (pesan diterima langsung).
Konsumsi resourceLebih tinggi karena polling terus-menerus.Lebih hemat (hanya aktif saat ada pesan).
Kemudahan setupSangat mudah, tanpa domain.Perlu domain dan HTTPS.
SkalaCocok untuk bot skala kecil-menengah.Cocok untuk bot dengan banyak pengguna.

Cara Kerja

Polling berjalan dalam loop: bot meminta daftar update ke server Telegram, memprosesnya, lalu meminta lagi. Jika tidak ada pesan, bot menunggu hingga interval berikutnya. Pada python-telegram-bot, metode app.run_polling() menjalankan polling secara otomatis.

Webhook bekerja secara terbalik. Bot mendaftarkan URL ke server Telegram melalui bot.set_webhook(). Ketika pengguna mengirim pesan, Telegram mengirimkan payload JSON ke URL bot, dan bot memprosesnya. Pada python-telegram-bot, metode app.run_webhook() menyiapkan server HTTP sekaligus mendaftarkan webhook.

Prasyarat

  • Python 3.10+ terpasang. Sangat disarankan memakai virtual environment, ikuti bagian cara pasang di bawah.
  • Token bot dari @BotFather: kirim /newbot, lalu salin token seperti 123456789:ABCdef....
  • URL HTTPS publik yang menunjuk ke server Anda (domain sendiri atau tunnel ngrok/cloudflared), wajib untuk webhook.
Webhook wajib HTTPS dan dapat diakses dari internet. http://localhost tidak akan menerima update.

Cara Pasang Virtual Environment (venv)

Virtual environment mengisolasi dependensi Python bot agar tidak saling bentrok dengan proyek lain maupun paket sistem. Ikuti langkah berikut:

Buat direktori proyek dan environment:

bash
mkdir bot-telegram-python
cd bot-telegram-python
python3 -m venv venv

Aktifkan environment:

bash
source venv/bin/activate

Setelah aktif, prompt shell akan menampilkan (venv) di awal baris. Pasang dependensi:

bash
pip install --upgrade pip
pip install python-telegram-bot==20.7 python-dotenv==1.0.1

Buat berkas requirements.txt untuk mencatat dependensi:

bash
pip freeze > requirements.txt

Nonaktifkan virtual environment:

bash
deactivate
Catatan: di Windows, aktifkan environment dengan venv\Scripts\activate.

Contoh Script: Polling dengan python-telegram-bot

Buat berkas main.py:

python
# main.py
import os
from dotenv import load_dotenv
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters

load_dotenv()

TOKEN = os.environ.get("BOT_TOKEN")


async def start(update: Update, context):
    await update.message.reply_text("Halo! Selamat datang. Ketik pesan apa saja untuk direspons.")


async def echo(update: Update, context):
    await update.message.reply_text(f"Anda mengetik: {update.message.text}")


def main():
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
    app.run_polling()


if __name__ == "__main__":
    main()

Buat berkas .env:

text
BOT_TOKEN=TOKEN_DARI_BOTFATHER

Jalankan bot:

bash
python main.py

Bot akan mulai polling dan membalas setiap pesan. Tekan /start untuk menguji.

Contoh Script: Webhook dengan python-telegram-bot

Untuk webhook, bot memerlukan server HTTP dengan URL HTTPS. Berikut contoh menggunakan run_webhook():

python
# main.py
import os
from dotenv import load_dotenv
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters

load_dotenv()

TOKEN = os.environ.get("BOT_TOKEN")
PORT = int(os.environ.get("PORT", 8080))
WEBHOOK_URL = os.environ.get("WEBHOOK_URL")


async def start(update: Update, context):
    await update.message.reply_text("Halo! Selamat datang. Ketik pesan apa saja untuk direspons.")


async def echo(update: Update, context):
    await update.message.reply_text(f"Anda mengetik: {update.message.text}")


def main():
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
    app.run_webhook(
        listen="0.0.0.0",
        port=PORT,
        webhook_url=WEBHOOK_URL,
    )


if __name__ == "__main__":
    main()

Buat berkas .env:

text
BOT_TOKEN=TOKEN_DARI_BOTFATHER
WEBHOOK_URL=https://bot.anda.com
PORT=8080

Jalankan bot:

bash
python main.py

run_webhook akan menyetel webhook ke WEBHOOK_URL secara otomatis, lalu menerima POST di jalur /webhook (default python-telegram-bot).

Untuk uji lokal tanpa domain, pakai tunnel:

bash
ngrok http 8080
# lalu set WEBHOOK_URL ke URL https dari ngrok

Kelebihan dan Kekurangan

LayananKelebihanKekurangan / Risiko
PollingMudah diatur, bisa di localhost, cocok pengembangan.Konsumsi resource lebih tinggi; latensi bergantung interval poll.
WebhookRespon cepat, hemat resource, cocok produksi.Perlu server publik, domain, dan HTTPS.

Rekomendasi: Mana yang Dipakai?

  • Gunakan Polling jika Anda sedang mengembangkan, menguji, atau menjalankan bot sederhana tanpa perlu server publik. Polling sangat cocok untuk lingkungan pengembangan lokal.
  • Gunakan Webhook jika bot sudah diproduksi dan diakses banyak pengguna, atau jika Anda memiliki domain dan server dengan HTTPS. Webhook memberikan respons lebih cepat dan lebih hemat sumber daya.
  • Kombinasi: Pada tahap pengembangan gunakan polling, lalu pindah ke webhook saat siap produksi.

Troubleshoot

  • Bot polling tidak merespons: pastikan token sudah benar dan tidak ada proses lain yang memakai token yang sama. Periksa log terminal untuk pesan error.
  • Webhook tidak menerima pesan: pastikan URL webhook sudah terdaftar dengan benar dan server HTTP sedang mendengarkan. Cek dengan curl https://bot.anda.com/webhook.
  • Error HTTPS: webhook wajib menggunakan HTTPS (kecuali untuk localhost). Gunakan layanan seperti ngrok jika belum punya domain, atau pasang HTTPS dengan Caddy/Let's Encrypt.
  • Port sudah dipakai: pastikan port yang dipakai (misalnya 8080) tidak sedang dipakai proses lain. Cek dengan ss -ltnp atau netstat -tlnp.
  • Error Conflict: terminated by other getUpdates: ada instance bot lain yang masih berjalan. Hentikan yang lain, lalu jalankan kembali bot.
  • Token tidak valid: salin ulang token dari BotFather dan periksa berkas .env.

Kesimpulan

Polling dan webhook menjalankan fungsi yang sama — menerima pesan dari Telegram — namun berbeda dalam cara kerja dan kebutuhan server. Polling sederhana dan cocok untuk pengembangan; webhook lebih cepat dan efisien untuk produksi. Dengan contoh script di atas dan panduan virtual environment, Anda dapat membandingkan langsung kedua metode dan memilih yang paling sesuai dengan kebutuhan bot Anda.

Artikel Terkait