WA Sender Mini — Service Otomatisasi Pesan WhatsApp

12 Oktober 2025MicroserviceNode.js, Express, Puppeteer, whatsapp-web.js, LocalAuth, PM2

Deskripsi Singkat

Proyek ini membangun mini-service untuk otomatisasi pengiriman pesan WhatsApp dengan *unofficial* tapi aman menggunakan **whatsapp-web.js**. Kita memanfaatkan **Chromium headless** dan **LocalAuth** agar QR cukup sekali selama sesi sama. Ideal untuk microservice yang ingin mengirim pesan, file, dan QRIS secara efisien.

Fitur Utama

package.json
{
  "name": "wa-sender-mini",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node index.js",
    "start:dev": "NODE_ENV=development node index.js"
  },
  "dependencies": {
    "express": "^4.19.2",
    "helmet": "^7.1.0",
    "express-rate-limit": "^7.3.0",
    "whatsapp-web.js": "^1.26.0",
    "multer": "^1.4.5-lts.1",
    "dotenv": "^16.4.5"
  }
}
.env.example
PORT=3001
API_KEY_SUPERSECRET=ubah-ini
PUPPETEER_NO_SANDBOX=true
index.js (server utama)
import 'dotenv/config';
import express from 'express';
import helmet from 'helmet';
import { Client, LocalAuth, MessageMedia } from 'whatsapp-web.js';
import QRCode from 'qrcode';
import multer from 'multer';

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

const client = new Client({
  authStrategy: new LocalAuth({ clientId: 'wa-sender-mini' }),
  puppeteer: { headless: 'new', args: ['--no-sandbox'] }
});

let lastQr = null;
client.on('qr', async (qr) => {
  lastQr = await QRCode.toDataURL(qr);
});
client.on('ready', () => console.log('WhatsApp ready ✅'));
client.initialize();

app.get('/qr', (_, res) =>
  lastQr ? res.json({ ok: true, dataUrl: lastQr }) : res.status(404).json({ ok: false })
);

app.listen(3001, () => console.log('Server running on 3001'));
Contoh kirim pesan (curl)
curl -X POST http://localhost:3001/send/text \
  -H "x-api-key: ubah-ini" -H "Content-Type: application/json" \
  -d '{"to":"62812XXXXXXX","body":"Halo dari API 🎉"}'

Tips Keamanan & Stabilitas

- Kirim hanya ke penerima *opt-in*. - Gunakan jeda acak antar pesan (sudah bawaan). - Hindari spam masal. - Gunakan PM2 agar proses stabil. - Backup folder `.wwebjs_auth` agar sesi tetap aktif.

Hasil Eksperimen

Eksperimen berjalan stabil dengan delay acak 1.2–2.5 detik, mencegah blokir nomor. Berhasil mengirim teks, file, QRIS, dan media tanpa error di VPS dengan PM2.

Dev Lab — Eksperimen, Microservice, dan Playground Kode