WhatsApp Gateway Multi-Device (WAGW)

Project ini adalah WhatsApp Gateway API berbasis Node.js menggunakan library @whiskeysockets/baileys. Mendukung multi-device, pengiriman pesan massal (bulk blast) dengan rotasi pengirim acak, serta pencatatan log pesan menggunakan SQLite.

Fitur Utama

Instalasi

Cara Manual (Node.js)

  1. Pastikan Node.js sudah terinstal.
  2. Clone repository ini.
  3. Install dependencies:
    npm install
    
  4. Buat file .env (opsional, jika tidak ada akan menggunakan default):
    PORT=10000
    DEFAULT_API_KEY=wagw-secret-key
    
  5. Jalankan server:
    node app.js
    
  6. Atau jika ingin berjalan di background (gunakan process manager seperti pm2):
    pm2 start app.js --name wagw
    

Cara Menggunakan Docker

  1. Build image:
    docker build -t wagw .
    
  2. Jalankan container (mapping port 10000):
    docker run -d -p 10000:10000 --name wagw-container -v $(pwd)/sessions:/usr/src/app/sessions -v $(pwd)/.env:/usr/src/app/.env wagw
    
    Note: Volume -v digunakan agar sesi login tidak hilang saat container di-restart dan konfigurasi .env terbaca.

Konfigurasi

Konfigurasi server dilakukan melalui file .env.

Variable Default Deskripsi
PORT 10000 Port aplikasi berjalan
DEFAULT_API_KEY wagw-secret-key API Key default yang dibuat saat inisialisasi database
AUTO_REPLY_WEBHOOK_URL (kosong) URL webhook yang dipanggil WAGW setiap ada pesan masuk. Jika kosong, auto-reply dinonaktifkan.
AUTO_REPLY_TIMEOUT_MS 10000 Timeout (ms) menunggu respons dari webhook.
AUTO_REPLY_FALLBACK_MESSAGE (kosong) Pesan yang dikirim jika webhook gagal/timeout. Kosong = tidak ada balasan.

Keamanan API (API Key)

Semua endpoint API (/wagateway/*) dilindungi oleh API Key. Anda harus menyertakan API Key di Header atau Query Parameter pada setiap request.

API Key Default: Lihat konfigurasi DEFAULT_API_KEY di .env (default: wagw-secret-key)

PENTING: API Key ini disimpan di database SQLite (wagw.db) dalam tabel api_keys. Anda disarankan untuk mengubahnya atau menambahkan key baru langsung melalui database.

Cara Menggunakan

1. Manajemen Perangkat (Login, List, Logout, Delete)

Akses http://localhost:10000/ (sesuaikan port) di browser.

2. Mengirim Pesan Tunggal

Endpoint: POST /wagateway/kirimpesan

Header:

x-api-key: wagw-secret-key
Content-Type: application/json

Body (JSON):

{
    "sender": "admin1",
    "number": "6281234567890",
    "message": "Halo, ini pesan test"
}

3. Mengirim Pesan Massal (Blast)

Fitur ini akan mengirim pesan ke banyak nomor dengan menggunakan semua device yang terhubung secara acak. Mendukung pesan dinamis (personalisasi) berdasarkan data penerima.

Endpoint: POST /wagateway/blast

Header:

x-api-key: wagw-secret-key
Content-Type: application/json

Body (JSON):

{
  "receiver": [
    { "number": "6281234567890", "nama": "Fatimah", "tanggal": "2023-08-01", "poli": "Umum" },
    { "number": "6281234567891", "nama": "Joko", "tanggal": "2023-08-02", "poli": "Gigi" }
  ],
  "messages": [
    "Halo {nama}, jadwal {poli} Anda pada tanggal {tanggal} sudah dikonfirmasi.",
    "Hi {nama}, jangan lupa jadwal {poli} tanggal {tanggal} ya!"
  ],
  "type": "text"
}

4. Melihat Log Pesan

Akses http://localhost:10000/logs-view untuk melihat riwayat pesan. Anda akan diminta memasukkan API Key untuk melihat data log demi keamanan.

Auto-Reply via Webhook

WAGW mendukung auto-reply otomatis untuk pesan personal (1-on-1) yang masuk. Setiap kali ada pesan masuk, WAGW akan melakukan POST ke URL webhook yang Anda tentukan, lalu mengirimkan teks balasan yang dikembalikan oleh webhook tersebut.

Cara Kerja

Pesan masuk dari WA
        │
        ▼
WAGW POST payload → Webhook URL Anda
        │
        ▼
Webhook memproses & mengembalikan JSON {"reply": "..."}
        │
        ▼
WAGW mengirim balasan ke pengirim

Konfigurasi .env

AUTO_REPLY_WEBHOOK_URL=https://yourdomain.com/webhook.php
AUTO_REPLY_TIMEOUT_MS=10000
AUTO_REPLY_FALLBACK_MESSAGE=Maaf, sistem kami sedang gangguan. Mohon tunggu sebentar.

Payload yang Dikirim WAGW ke Webhook

WAGW melakukan POST dengan Content-Type: application/json:

{
  "device_id":  "admin1",
  "from":       "6281234567890@s.whatsapp.net",
  "to":         "6281234567890@s.whatsapp.net",
  "push_name":  "Nama Pengirim",
  "message":    "Halo",
  "timestamp":  1713700000
}
Field Tipe Keterangan
device_id string ID device WAGW yang menerima pesan
from string JID (nomor) pengirim pesan
to string JID tujuan (nomor device Anda)
push_name string Nama tampilan pengirim di WhatsApp
message string Isi teks pesan yang diterima
timestamp number Unix timestamp pesan

Format Response Webhook

Webhook Anda harus mengembalikan JSON. WAGW membaca field berikut (diprioritaskan berurutan):

Response Perilaku WAGW
{"reply": "teks balasan"} ✅ Mengirim balasan
{"message": "teks balasan"} ✅ Mengirim balasan
{"text": "teks balasan"} ✅ Mengirim balasan
{} / kosong / null ⛔ Tidak ada balasan

Catatan: Auto-reply hanya aktif untuk chat personal (1-on-1). Pesan dari grup, broadcast, dan status diabaikan.

Contoh Webhook PHP

File contoh tersedia di examples/webhook.php. Fitur yang ada:

Salin file tersebut ke server PHP Anda, lalu atur AUTO_REPLY_WEBHOOK_URL di .env WAGW:

AUTO_REPLY_WEBHOOK_URL=https://yourdomain.com/webhook.php

Mengelola Auto-Reply Per-Device (API)

Gunakan endpoint berikut untuk mengaktifkan/menonaktifkan auto-reply pada device tertentu tanpa restart server:

Aktifkan auto-reply:

POST /wagateway/auto-reply/enable
x-api-key: wagw-secret-key
Content-Type: application/json

{"device_id": "admin1"}

Nonaktifkan auto-reply:

POST /wagateway/auto-reply/disable
x-api-key: wagw-secret-key
Content-Type: application/json

{"device_id": "admin1"}

Struktur Database (SQLite)

File database: wagw.db

Tabel message_logs

Tabel api_keys