3.5 KiB
Kalau pakai whatsapp-web.js, masalah ban biasanya bukan cuma karena “kebanyakan kirim”, tapi karena pola kirim tidak natural (terlalu cepat, terlalu konsisten, atau blast ke banyak nomor baru). Jadi rate limiter harus dibuat mirip perilaku manusia, bukan sekadar delay statis.
Saya kasih setup yang realistis dan aman 👇
🎯 Prinsip anti-ban (WA)
- ❌ Jangan kirim burst (100 pesan langsung)
- ❌ Jangan interval konstan (misal selalu 1 detik)
- ❌ Jangan blast ke nomor yang belum pernah chat
- ✅ Gunakan delay random
- ✅ Gunakan queue (antrian)
- ✅ Batasi per nomor & global
🚀 1. Gunakan Queue + Rate Limiter
Rekomendasi: pakai BullMQ + Redis
Install:
npm install bullmq ioredis
🧠 2. Contoh Queue + Rate Limit (AMAN)
const { Queue, Worker } = require('bullmq');
const IORedis = require('ioredis');
const connection = new IORedis();
const queue = new Queue('wa-send', { connection });
// PRODUCER (enqueue)
async function sendMessage(number, message) {
await queue.add('send', { number, message }, {
removeOnComplete: true,
removeOnFail: true
});
}
Worker dengan rate limiter
const worker = new Worker('wa-send', async job => {
const { number, message } = job.data;
await client.sendMessage(number, message);
// delay random (anti detection)
const delay = Math.floor(Math.random() * 5000) + 3000;
await new Promise(r => setTimeout(r, delay));
}, {
connection,
limiter: {
max: 10, // max 10 pesan
duration: 60000 // per 60 detik
}
});
🔥 3. Rate limit realistis (WA aman)
Untuk 1 akun:
- 5–15 pesan / menit ✅ aman
- 20–30 / menit ⚠️ hati-hati
-
50 / menit ❌ rawan ban
👉 Rekomendasi:
max: 10,
duration: 60000
🧠 4. Random delay (WA suka ini)
Tambahkan variasi:
function randomDelay() {
return Math.floor(Math.random() * 7000) + 2000; // 2–9 detik
}
🧩 5. Rate limit per nomor (PENTING)
Jangan spam ke satu nomor:
const lastSent = new Map();
async function safeSend(number, message) {
const now = Date.now();
const last = lastSent.get(number) || 0;
if (now - last < 60000) {
console.log('Skip spam ke nomor ini');
return;
}
lastSent.set(number, now);
await sendMessage(number, message);
}
🧠 6. Warm-up akun (sering dilupakan)
Kalau akun baru:
Hari 1–3:
- max 20–30 pesan/hari
Hari 4–7:
- naik ke 50–100
Setelah itu baru scale.
⚠️ 7. Hindari ini (penyebab BAN)
❌ Kirim ke nomor random tanpa interaksi ❌ Broadcast template sama persis ❌ Kirim terlalu cepat (burst) ❌ Banyak session dalam 1 IP ❌ Tidak ada reply masuk (one-way spam)
🔥 8. Tambahkan human behavior
Typing simulation:
await client.sendPresenceAvailable();
await client.sendPresenceTyping(number);
await new Promise(r => setTimeout(r, 2000));
Randomisasi pesan:
const messages = [
"Halo kak 😊",
"Hai, ada info menarik nih",
"Halo, mau tanya sebentar"
];
const msg = messages[Math.floor(Math.random() * messages.length)];
🧠 9. Advanced (kalau scale besar)
Gunakan:
- Redis queue (BullMQ) ✅
- multi worker (cluster)
- per-account rate limiter
🎯 Setup ideal kamu (server 10 core)
-
1 worker per core → 8–10 worker
-
tiap worker limit:
- 5 msg / menit
-
total:
- ~50 msg / menit (aman)
📊 Rule simple anti ban
👉 Rumus aman:
delay minimal: 2–10 detik
max: 10 pesan / menit / akun