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
- GET `/qr` → ambil QR (base64 PNG) untuk pairing pertama
- GET `/status` → cek status client (ready / not ready)
- POST `/send/text` → kirim pesan teks
- POST `/send/media-url` → kirim file lewat URL
- POST `/send/file` → unggah file multipart
- POST `/send/qris` → generate & kirim QR dari payload QRIS
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.