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
| Aspek | Polling | Webhook |
|---|---|---|
| Cara kerja | Bot mengecek pesan secara berkala. | Telegram mengirim pesan secara otomatis ke URL bot. |
| Koneksi | Bot ke server Telegram (outgoing). | Server Telegram ke bot (incoming). |
| Kebutuhan server | Server publik tidak wajib (bisa di localhost). | Server publik dengan URL/HTTPS wajib. |
| Latensi | Sedang (tergantung interval poll). | Rendah (pesan diterima langsung). |
| Konsumsi resource | Lebih tinggi karena polling terus-menerus. | Lebih hemat (hanya aktif saat ada pesan). |
| Kemudahan setup | Sangat mudah, tanpa domain. | Perlu domain dan HTTPS. |
| Skala | Cocok 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:
npm init -y
npm install grammyBuat berkas bot.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:
node bot.jsBot 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:
npm install grammy @grammyjs/node-serverBerkas bot.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:
node bot.jsBot 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
| Layanan | Kelebihan | Kekurangan / Risiko |
|---|---|---|
| Polling | Mudah diatur, bisa di localhost, cocok pengembangan. | Konsumsi resource lebih tinggi; latensi bergantung interval poll. |
| Webhook | Respon 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 -ltnpataunetstat -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.