Perbedaan Script Bot Telegram: Webhook dan Polling dengan Node.js + grammY

Bot Telegram bisa 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 Node.js dan framework grammY, lengkap dengan contoh script dan penjelasan kapan sebaiknya memakai salah satu metode.

Pengertian

Polling

Polling adalah metode di mana bot secara berkala mengirim permintaan (poll) 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.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 di loop: bot meminta daftar update ke server Telegram, memprosesnya, lalu meminta lagi. Jika tidak ada pesan, bot menunggu hingga interval berikutnya. Pada grammY, metode bot.start() menjalankan polling secara otomatis.

Webhook bekerja secara terbalik. Bot mendaftarkan URL ke server Telegram melalui perintah setWebhook. Ketika pengguna mengirim pesan, Telegram mengirimkan payload JSON ke URL bot, dan bot memprosesnya. Pada grammY, fungsi serve() dari @grammyjs/node-server menyiapkan server HTTP sekaligus mendaftarkan webhook.

Contoh Script: Polling dengan grammY

Berikut adalah contoh bot yang menggunakan polling (bot.start()). Bot ini merespons perintah /start dan setiap pesan teks apa pun.

Instal dependensi:

bash
npm init -y
npm install grammy

Buat berkas bot.js:

js
import { Bot } from "grammy";

const bot = new Bot("GANTI-DENGAN-TOKEN-ANDAL");

bot.command("start", (ctx) => {
  ctx.reply("Halo! Selamat datang. Ketik pesan apa saja untuk direspons.");
});

bot.on("message", (ctx) => {
  const teks = ctx.message?.text ?? "";
  ctx.reply("Kamu bilang: " + teks);
});

bot.start();

Jalankan bot:

bash
node bot.js

Bot akan mulai polling dan mencetak log di terminal setiap kali ada pesan.

Contoh Script: Webhook dengan grammY

Untuk webhook, bot memerlukan server HTTP. Berikut contoh menggunakan @grammyjs/node-server. Instal dependensi tambahan:

bash
npm install grammy @grammyjs/node-server

Berkas bot.js:

js
import { Bot } from "grammy";
import { serve } from "@grammyjs/node-server";

const bot = new Bot("GANTI-DENGAN-TOKEN-ANDAL");

bot.command("start", (ctx) => {
  ctx.reply("Halo! Selamat datang. Ketik pesan apa saja untuk direspons.");
});

bot.on("message", (ctx) => {
  const teks = ctx.message?.text ?? "";
  ctx.reply("Kamu bilang: " + teks);
});

serve(bot, {
  port: 3000,
  webhookUrl: "https://domain-anda.com/bot"
});

Jalankan bot:

bash
node bot.js

Bot akan memulai server HTTP pada port 3000 dan mendaftarkan webhook ke URL yang ditentukan. Setiap pesan masuk langsung dikirim oleh Telegram ke URL tersebut.

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://domain-anda.com/bot.
  • 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 3000) tidak sedang dipakai proses lain. Cek dengan ss -ltnp atau netstat -tlnp.
  • Update sudah dibatalkan (revoked): jika poling mengembalikan 401 Unauthorized, token mungkin sudah di-revoke. Buat token baru melalui BotFather.

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, Anda dapat membandingkan langsung kedua metode dan memilih yang paling sesuai dengan kebutuhan bot Anda.

Artikel Terkait