Pendahuluan
Bot Telegram adalah program yang berjalan di server dan merespons pesan pengguna lewat Bot API. Ada dua cara bot menerima pesan:
- Webhook: Telegram mengirimkan setiap pesan langsung ke URL HTTPS milik Anda (metode push). Efisien untuk produksi.
- Polling: bot Anda yang aktif menarik pesan baru dari server Telegram tiap beberapa detik (metode
getUpdates). Lebih sederhana untuk belajar.
Artikel ini fokus ke webhook dengan Node.js memakai library telegraf dan express. Jika lebih suka metode polling, baca Membuat Bot Telegram dengan Node.js (Polling).
Prasyarat
- Node.js terpasang. Bila perlu, ikuti Memasang NodeJS di Debian 13.
- Token bot dari @BotFather: kirim
/newbot, lalu salin token panjang seperti123456789:ABCdef.... - URL HTTPS publik yang menunjuk ke server Anda. Bisa berupa domain sendiri (misal lewat Caddy reverse proxy) atau tunnel seperti
ngrok/cloudflareduntuk uji coba lokal.
Webhook wajib HTTPS dan dapat diakses dari internet. http://localhost tidak akan pernah menerima update dari Telegram.
Struktur Folder
bot-telegram-node-webhook/
├── index.js
├── package.json
├── .env (opsional: BOT_TOKEN, WEBHOOK_URL, PORT)
└── node_modules/ (otomatis setelah npm install)Langkah 1: Inisialisasi Proyek
mkdir bot-telegram-node-webhook
cd bot-telegram-node-webhook
npm init -y
npm install telegraf expressLangkah 2: Tulis Kode
Buat berkas index.js:
// index.js
const express = require('express');
const { Telegraf } = require('telegraf');
const BOT_TOKEN = process.env.BOT_TOKEN;
const PORT = process.env.PORT || 3000;
const WEBHOOK_URL = process.env.WEBHOOK_URL; // mis. https://bot.anda.com
const bot = new Telegraf(BOT_TOKEN);
bot.start((ctx) => ctx.reply('Halo! Saya bot Node.js dengan webhook.'));
bot.on('text', (ctx) => ctx.reply('Anda mengetik: ' + ctx.message.text));
const app = express();
app.use(express.json());
// Telegram mengirim tiap update ke jalur ini
app.post('/webhook', bot.webhookCallback());
app.get('/', (req, res) => res.send('Bot berjalan.'));
async function main() {
await bot.telegram.setWebhook(WEBHOOK_URL + '/webhook');
console.log('Webhook aktif di:', WEBHOOK_URL + '/webhook');
app.listen(PORT, () => console.log('Server mendengarkan port', PORT));
}
main();Isi berkas package.json (pastikan start mengarah ke index.js):
{
"name": "bot-telegram-node-webhook",
"version": "1.0.0",
"description": "Bot Telegram Node.js dengan webhook",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.19.2",
"telegraf": "^4.16.3"
}
}Langkah 3: Siapkan Environment
Buat berkas .env (opsional, bisa juga export langsung di terminal):
export BOT_TOKEN="TOKEN_DARI_BOTFATHER"
export WEBHOOK_URL="https://bot.anda.com"
export PORT=3000Untuk memuat .env otomatis, pasang dotenv lalu tambahkan require('dotenv').config(); di baris paling atas index.js.
Langkah 4: Jalankan dan Arahkan Webhook
node index.jsPastikan domain/port memang mencapai server (misal lewat Caddy). Telegram akan mengirim POST ke https://bot.anda.com/webhook. Uji dengan mengetik /start di chat bot.
Untuk uji lokal tanpa domain, gunakan tunnel:
ngrok http 3000
# lalu set WEBHOOK_URL ke URL https yang diberikan ngrokPenjelasan Singkat
bot.telegram.setWebhook(...)memberitahu Telegram ke mana mengirim pesan.app.post('/webhook', bot.webhookCallback())menangani request masuk lalu memanggil handler bot.express.json()diperlukan agar body JSON bisa dibaca.
Kelebihan dan Kekurangan (Webhook)
Kelebihan:
- Hemat resource: server hanya bekerja saat ada pesan.
- Latensi rendah: pesan sampai hampir instan (push).
- Cocok untuk produksi dan traffic tinggi.
- Mudah digabung dengan layanan lain di server yang sama.
Kekurangan:
- Wajib HTTPS publik; butuh domain atau tunnel.
- Konfigurasi server (reverse proxy, firewall) lebih rumit.
- Sulit dijalankan di komputer lokal tanpa alat bantu tunnel.
Webhook vs Polling: webhook lebih efisien dan responsif, tetapi polling lebih mudah dipasang karena tidak butuh URL publik. Pelajari polling di Membuat Bot Telegram dengan Node.js (Polling).
Troubleshooting
1. Error 401 Unauthorized Token salah atau ada karakter tercecer. Salin ulang token dari BotFather dan pastikan BOT_TOKEN benar.
2. 409 Conflict: can't set webhook / webhook lama masih aktif Kemungkinan bot sebelumnya memakai polling. Hapus webhook dulu:
await bot.telegram.deleteWebhook();
await bot.telegram.setWebhook(WEBHOOK_URL + '/webhook');3. Pesan tidak masuk padahal server menyala Pastikan: WEBHOOK_URL benar-benar HTTPS dan bisa diakses dari internet (bukan localhost); firewall/cloud membuka port 443; jalur webhook (/webhook) cocok antara setWebhook dan app.post.
4. Webhook can't be set: bad webhook URL tidak HTTPS atau tidak reachable saat Telegram mencobanya. Nyalakan server dan arahkan domain ke IP Anda sebelum menjalankan setWebhook.
5. Respon lambat / Timed out Telegram menunggu balasan maksimal 60 detik. Jika ada kerjaan berat (API luar, database lambat), pindahkan ke antrean/worker, balas cepat, lalu kirim hasil belakangan.
Kesimpulan
Webhook adalah pilihan terbaik untuk bot Node.js produksi karena efisien dan cepat. Setelah menguasai dasarnya, kembangkan fitur dengan membaca Membangun Bot Telegram CRUD dengan Node.js dan Telegraf atau Membuat Bot Telegram Pengingat dengan Node.js.