Webhook dengan Flask (Python) dan Express (Node.js)

Bayangkan kamu sedang mengobrol dengan teman. Ketika dia mengirim pesan, kamu harus terus-menerus mengecek ponselmu untuk melihat apakah ada pesan baru. Itulah yang dilakukan polling — boros tapi sederhana. Sekarang bayangkan jika temanmu langsung menelponmu setiap kali ada pesan. Itulah webhook — Telegram (atau platform lain) mengirimkan data secara langsung ke alamat URL yang kamu tentukan.

Artikel ini membandingkan cara membuat webhook menggunakan dua framework populer: Flask di Python dan Express di Node.js. Keduanya melakukan hal yang sama — menerima data dari Telegram — namun dengan bahasa dan cara yang berbeda.

Pengertian

Apa itu Webhook?

Webhook adalah cara sebuah layanan (misalnya Telegram) mengirimkan data secara otomatis ke aplikasi kita setiap kali ada kejadian tertentu, seperti pengguna mengirim pesan. Alih-alih aplikasi kita yang terus mengecek ("ada pesan belum?"), Telegram yang mengirimkan pesan ke URL kita.

Flask (Python)

Flask adalah framework web ringan untuk Python. Dengan Flask, kita bisa membuat server HTTP sederhana yang mendengarkan permintaan masuk dari Telegram. Flask sangat cocok untuk pemula karena sintaksnya yang sederhana dan mudah dibaca.

Express (Node.js)

Express adalah framework web paling populer untuk Node.js. Express juga memungkinkan kita membuat server HTTP yang mendengarkan permintaan dari Telegram. Express menggunakan JavaScript, bahasa yang sama untuk frontend dan backend, sehingga cocok untuk pengembang yang sudah mengenal JavaScript.

Perbandingan Detail

AspekFlask (Python)Express (Node.js)
BahasaPythonJavaScript
KeringatanRingan, mudah dipelajariRingan, populer di dunia web
Penanganan asyncMenggunakan async/await (Python 3.7+)Mendukung async secara alami
Dependensiflask, python-dotenvexpress, dotenv
Kemudahan setupSangat mudahSangat mudah
Kebutuhan serverServer dengan HTTPS (atau tunnel)Server dengan HTTPS (atau tunnel)

Cara Kerja Webhook

Ketika pengguna mengirim pesan ke bot Telegram, Telegram akan mengirimkan permintaan HTTP POST ke URL webhook kita. Isi dari permintaan ini berupa data JSON yang berisi informasi tentang pesan tersebut, seperti siapa pengirim dan apa isi pesannya.

Berikut alur kerjanya:

  1. Telegram mengirimkan data JSON ke URL webhook kita.
  2. Server kita (Flask atau Express) menerima permintaan tersebut.
  3. Server membaca data JSON dan memprosesnya (misalnya mengekstrak teks pesan).
  4. Server membalas pesan menggunakan API Telegram.
  5. Server mengirimkan respons HTTP 200 OK ke Telegram untuk menandakan bahwa data telah diterima dan diproses.

Perbandingan Script Webhook

Di bawah ini adalah contoh script webhook untuk kedua framework. Keduanya melakukan hal yang sama: menerima pesan dari Telegram dan membalas dengan teks "Halo!".

Flask (Python)

Instal dependensi:

bash
pip install flask python-dotenv

Buat berkas app.py:

python
from flask import Flask, request, jsonify
import os
from dotenv import load_dotenv
import requests

load_dotenv()

app = Flask(__name__)
BOT_TOKEN = os.environ.get("BOT_TOKEN")
WEBHOOK_URL = os.environ.get("WEBHOOK_URL")

@app.route(f"/{BOT_TOKEN}", methods=["POST"])
def webhook():
    update = request.get_json()
    message = update.get("message", {})
    chat_id = message.get("chat", {}).get("id")
    text = message.get("text", "")

    if text == "/start":
        reply_text = "Halo! Selamat datang di bot Flask."
    else:
        reply_text = f"Kamu mengetik: {text}"

    requests.post(
        f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
        json={"chat_id": chat_id, "text": reply_text},
    )
    return jsonify({"status": "ok"})


if __name__ == "__main__":
    app.run(port=8080)

Jalankan bot:

bash
python app.py

Express (Node.js)

Instal dependensi:

bash
npm init -y
npm install express dotenv axios

Buat berkas index.js:

javascript
require('dotenv').config();
const express = require('express');
const axios = require('axios');

const app = express();
app.use(express.json());

const BOT_TOKEN = process.env.BOT_TOKEN;
const PORT = process.env.PORT || 8080;

app.post(`/${BOT_TOKEN}`, (req, res) => {
  const update = req.body;
  const message = update.message || {};
  const chatId = message.chat?.id;
  const text = message.text || "";

  let replyText = "Halo! Selamat datang di bot Express.";
  if (text !== "/start") {
    replyText = `Kamu mengetik: ${text}`;
  }

  axios.post(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
    chat_id: chatId,
    text: replyText,
  });

  res.json({ status: "ok" });
});

app.listen(PORT, () => {
  console.log(`Server berjalan di port ${PORT}`);
});

Jalankan bot:

bash
node index.js

Kelebihan dan Kekurangan

LayananKelebihanKekurangan
FlaskSintaks Python yang sederhana; cocok untuk pemula; banyak library ilmu data.Tidak secepat Node.js untuk aplikasi dengan banyak koneksi bersamaan.
ExpressSangat populer; banyak paket di npm; cocok untuk aplikasi real-time.Callback bisa membingungkan bagi pemula (walau async/await sudah mengatasi ini).

Rekomendasi: Mana yang Dipakai?

  • Gunakan Flask jika kamu lebih nyaman dengan Python, sedang mengembangkan bot sederhana, atau ingin integrasi dengan library ilmu data dan machine learning.
  • Gunakan Express jika kamu sudah mengenal JavaScript, membutuhkan aplikasi dengan banyak koneksi bersamaan, atau ingin membangun aplikasi web lengkap selain bot.
  • Keduanya cocok untuk webhook. Pilih sesuai bahasa pemrograman yang sudah kamu kuasai.

Troubleshoot

  • Webhook tidak menerima pesan: pastikan URL webhook sudah terdaftar dengan benar di Telegram melalui https://api.telegram.org/bot<TOKEN>/setWebhook?url=<URL>.
  • Error 404: pastikan route di Flask/Express sesuai dengan token bot. Flask menggunakan route /{BOT_TOKEN} dan Express menggunakan /${BOT_TOKEN}.
  • Error HTTPS: webhook wajib HTTPS (kecuali untuk localhost). Gunakan tunnel seperti ngrok untuk uji coba lokal: ngrok http 8080.
  • Port sudah dipakai: pastikan port yang dipakai (misalnya 8080) tidak sedang dipakai proses lain.
  • Token tidak valid: salin ulang token dari BotFather dan periksa berkas .env.

Kesimpulan

Flask dan Express sama-sama mampu menangani webhook dengan baik. Flask menawarkan kesederhanaan Python yang sangat cocok untuk pemula, sementara Express menawarkan kecepatan dan ekosistem npm yang luas. Pilih sesuai kebutuhan dan bahasa pemrograman yang kamu kuasai. Kedua contoh script di atas menunjukkan bahwa membuat webhook dengan kedua framework ini tidaklah rumit.

Artikel Terkait