Pendahuluan

Bot Telegram merupakan salah satu solusi otomatisasi yang banyak digunakan, mulai dari layanan pelanggan, sistem notifikasi, hingga integrasi aplikasi internal. Dalam pengembangannya, terdapat dua metode utama untuk menerima pesan dari Telegram, yaitu polling dan webhook.

Bagi pengembang yang ingin menjalankan bot secara stabil di server seperti Rocky Linux 10, pemilihan metode yang tepat menjadi sangat penting. Artikel ini akan membahas apa itu polling dan webhook, perbedaannya, serta alasan mengapa webhook lebih direkomendasikan untuk lingkungan server dan produksi.

Apa Itu Polling pada Bot Telegram

Polling adalah metode di mana bot secara aktif dan berkala meminta data ke server Telegram menggunakan API getUpdates.

Ciri utama polling:
  • Bot mengecek pesan secara terus-menerus (misalnya setiap 1–2 detik)
  • Tidak memerlukan domain atau SSL
  • Umumnya digunakan saat pengembangan lokal atau uji coba
Contoh alur polling:
  • Bot mengirim permintaan ke server Telegram
  • Telegram mengembalikan pesan (jika ada)
  • Bot memproses pesan
  • Bot mengulangi proses dari awal

Metode ini sederhana, tetapi memiliki keterbatasan ketika digunakan di server produksi.

Apa Itu Webhook pada Bot Telegram

Webhook adalah metode di mana Telegram akan mengirimkan pesan secara langsung ke server bot melalui URL HTTPS yang telah didaftarkan.

Ciri utama webhook:
  • Bot tidak perlu mengecek pesan secara berkala
  • Telegram akan mengirim data hanya saat ada pesan
  • Membutuhkan domain dan SSL aktif
  • Lebih efisien dan profesional
Contoh alur webhook:
  • Pengguna mengirim pesan ke bot
  • Telegram langsung mengirim data ke URL webhook
  • Server bot menerima dan memproses pesan

Dengan webhook, bot bersifat event-driven, bukan request-driven seperti polling.

Mengapa Penting Menggunakan Webhook di Server

Penggunaan webhook sangat disarankan ketika bot dijalankan di server seperti Rocky Linux karena:

1. Lebih Hemat Sumber Daya:
  • Tidak ada loop permintaan terus-menerus
  • CPU dan RAM server lebih efisien
2. Respons Lebih Cepat:
  • Pesan diterima secara real-time
  • Tidak bergantung pada interval polling
3. Stabil untuk Produksi:
  • Cocok untuk bot yang aktif 24/7
  • Minim risiko timeout atau API limit
4. Standar Industri:
  • Digunakan pada sistem skala menengah hingga besar
  • Cocok untuk integrasi dengan reverse proxy seperti Caddy atau Nginx

Perbedaan polling dan webhook

Aspek Polling Webhook
Cara kerja Bot meminta data berkala Telegram mengirim data
Kebutuhan SSL Tidak wajib Wajib
Penggunaan server Boros Efisien
Kecepatan respon Tergantung interval Real-time
Cocok untuk Development / lokal Produksi
Kompleksitas Sederhana Lebih profesional

Langkah-langkah instalasi

Instalasi dilakukan untuk mempersiapkan:
  1. Webserver -> caddy
  2. NodeJS -> npm, pm2
  3. Python3 -> pip, pytelegrambotapi, flask, gunicorn, cryptography, openpyxl, pandas, speedtest-cli
  4. Menulis script
  5. Instal web server -> caddy
  6. Menjalankan script

1. Web Server

1. Lakukan update:

sudo dnf update -y

2. Instal plugin dnf:

sudo dnf install dnf-plugins-core -y

3. Aktifkan repository COPR resmi caddy pada sistem berbasis RHEL, termasuk Rocky Linux:

sudo dnf copr enable @caddy/caddy -y

4. Instal caddy:

sudo dnf install caddy -y

5. Ubah konfigurasi default Caddy , file terletak di /etc/caddy/Caddyfile:

sudo nano /etc/caddy/Caddyfile
bot.masyarakat.id {
    encode gzip
    root * /usr/share/caddy
    file_server
    reverse_proxy /quran 127.0.0.1:8041
    reverse_proxy /hadis 127.0.0.1:8042
}

6. Simpan konfigurasi:

ctrl + o
enter
ctrl + x

7. Jalankan caddy:

sudo systemctl start caddy
sudo systemctl enable caddy

8. Instal firewalld:

sudo dnf install firewalld -y

9. Aktifkan firewalld:

sudo systemctl start firewalld
sudo systemctl enable firewalld

10. Buka akses HTTP dan HTTPS pada firewall (firewalld) di Rocky Linux, agar server dapat menerima koneksi dari luar:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

11. Melalui browser, kunjungi domain/subdomain Anda:

https://bot.masyarakat.id

2. NodeJS

1. Instal curl:

sudo dnf install curl -y

2. Download nodejs:

curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -

3. Instal nodejs:

sudo dnf install nodejs -y

4. Perbarui npm:

sudo npm install -g npm@latest

5. Instal pm2:

sudo npm install -g pm2

3. Python

1. Instal pip:

sudo dnf install python3-pip -y

2. Buat folder baru bot:

mkdir ~/bot
~/bot berbeda dengan /bot
/bot = folder di root sistem (butuh akses root)
~/bot = folder milik user (aman & disarankan)

3. Buka folder bot:

cd ~/bot

4. Buat folder baru quran dan hadis:

mkdir quran hadis
bot
├── quran
│   ├── quran.py
│   └── quran.db
└── hadis
    ├── hadis.py
    └── hadis.db

5. Buat virtual environment atau venv:

python3 -m venv venv
bot
├── venv
├── quran
│   ├── quran.py
│   └── quran.db
└── hadis
    ├── hadis.py
    └── hadis.db

6. Aktifkan venv:

source venv/bin/activate

7. Perbarui pip:

pip install --upgrade pip

8. Instal semua library yang dibutuhkan bot:

pip install pytelegrambotapi openpyxl flask gunicorn

9. Non-aktifkan venv:

deactivate

4. Menulis script

1. Buka folder bot:

cd ~/bot

2. Buat file quran.py dan hadis.py lalu tempatkan pada folder masing-masing

Contoh script polling

from telebot import TeleBot, types

# Ganti dengan token bot Anda
TOKEN = "ISI_TOKEN_BOT_ANDA"
bot = TeleBot(TOKEN)

# Handler untuk /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False)
    markup.add('Daftar Surah', 'Jadwal Salat')
    markup.add('Bantuan Kami', 'Hubungi Kami')
    markup.add('Donasi', 'Hadis')
    bot.send_message(message.chat.id, f'Assalamu Alaikum, {message.from_user.first_name}')
    bot.send_message(message.chat.id, f"Silakan ketik kata yang ingin Anda cari atau gunakan format nomorSurah:nomorAyat untuk melakukan pencarian langsung", reply_markup=markup)

# Bot aktif
print('Bot sudah aktif')

# Polling
bot.polling()

Contoh script webhook quran.py:

from telebot import TeleBot, types

# Ganti dengan token bot Anda
TOKEN = "ISI_TOKEN_BOT_ANDA"
bot = TeleBot(TOKEN)

# Handler untuk /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False)
    markup.add('Daftar Surah', 'Jadwal Salat')
    markup.add('Bantuan Kami', 'Hubungi Kami')
    markup.add('Donasi', 'Hadis')
    bot.send_message(message.chat.id, f'Assalamu Alaikum, {message.from_user.first_name}')
    bot.send_message(message.chat.id, f"Selamat datang di bot Al-Qur'an Indonesia", reply_markup=markup)

# Webhook
app = Flask(__name__)

@app.route('/quran', methods=['POST'])
def webhook():
    json_str = request.get_data().decode('UTF-8')
    update = telebot.types.Update.de_json(json_str)
    bot.process_new_updates([update])
    return 'OK', 200

@app.route('/quran', methods=['GET'])
def index():
    return 'Bot Masyarakat sudah aktif', 200

if __name__ == '__main__':
    bot.remove_webhook()
    bot.set_webhook(url='https://bot.masyarakat.id/quran')

Contoh script webhook hadis.py:

from telebot import TeleBot, types

# Ganti dengan token bot Anda
TOKEN = "ISI_TOKEN_BOT_ANDA"
bot = TeleBot(TOKEN)

# Handler untuk /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=False)
    markup.add('Daftar Surah', 'Jadwal Salat')
    markup.add('Bantuan Kami', 'Hubungi Kami')
    markup.add('Donasi', 'Hadis')
    bot.send_message(message.chat.id, f'Assalamu Alaikum, {message.from_user.first_name}')
    bot.send_message(message.chat.id, f"Selamat datang di bot Hadis Indonesia", reply_markup=markup)

# Webhook
app = Flask(__name__)

@app.route('/hadis', methods=['POST'])
def webhook():
    json_str = request.get_data().decode('UTF-8')
    update = telebot.types.Update.de_json(json_str)
    bot.process_new_updates([update])
    return 'OK', 200

@app.route('/hadis', methods=['GET'])
def index():
    return 'Bot Masyarakat sudah aktif', 200

if __name__ == '__main__':
    bot.remove_webhook()
    bot.set_webhook(url='https://bot.masyarakat.id/hadis')

3. Kembali ke home:

cd

4. Buat file baru ecosystem.config.js:

module.exports = {
  apps: [
    {
      name: "quran",
      script: "/home/namauser/bot/venv/bin/gunicorn",
      args: "-w 2 -b 127.0.0.1:8041 quran:app",
      cwd: "/home/namauser/bot/quran",
      exec_mode: "fork",
      interpreter: "none",
      autorestart: true,
      watch: false,
      max_memory_restart: "300M",
      env: {
        pythonpath: "/home/namauser/bot/quran"
      }
    },
    {
      name: "hadis",
      script: "/home/namauser/bot/venv/bin/gunicorn",
      args: "-w 2 -b 127.0.0.1:8042 hadis:app",
      cwd: "/home/namauser/bot/hadis",
      exec_mode: "fork",
      interpreter: "none",
      autorestart: true,
      watch: false,
      max_memory_restart: "300M",
      env: {
        pythonpath: "/home/namauser/bot/hadis"
      }
    }
  ]
}

5. Struktur folder Anda:

/home/namauser/
└── ecosystem.config.js
└── bot/
    ├── venv/
    │   └── bin/
    │       ├── python
    │       ├── pip
    │       ├── flask
    │       └── gunicorn
    │
    ├── quran/
    │   ├── quran.py
    │   └── quran.db
    │
    └── hadis/
        ├── hadis.py
        └── hadis.db

6. Jalankan pm2:

pm2 start ecosystem.config.js

7. Aktifkan fungsi agar pm2 menjalankan bot setelah server restart:

pm2 startup

8. Salin dan tempelkan kembali teks yang ditampilkan, seperti:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u namauser --hp /home/namauser

9. Simpan konfigurasi pm2:

pm2 save

10. Restart bot yang dijalankan pm2jika ada perubahan script:

pm2 restart id

Atau:

pm2 restart name

11. Delete webhook:

https://api.telegram.org/botTOKEN-ANDA/deletewebhook

12. Aktifkan webhook:

https://api.telegram.org/botTOKEN-ANDA/setwebhook?url=https://DOMAIN_ANDA.com

13. Lihat status webhook:

https://api.telegram.org/botTOKEN-ANDA/getwebhookinfo

Kesimpulan

Polling dan webhook sama-sama dapat digunakan untuk menjalankan bot Telegram, namun memiliki tujuan yang berbeda. Polling cocok untuk tahap pengembangan dan pengujian, sedangkan webhook merupakan pilihan terbaik untuk server produksi seperti Rocky Linux 10.

Dengan menggunakan webhook, bot menjadi lebih efisien, stabil, dan sesuai dengan standar deployment modern. Oleh karena itu, jika Anda ingin menjalankan bot Telegram secara profesional dan jangka panjang, webhook adalah metode yang sangat direkomendasikan.




Baca Juga




masyarakat

Mari Berbagi

Alamat

Jl. Rompok Raya
Palembang
Indonesia