mbahsomo-note/catatan-wa.md

3.5 KiB
Raw Blame History

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)

  1. Jangan kirim burst (100 pesan langsung)
  2. Jangan interval konstan (misal selalu 1 detik)
  3. Jangan blast ke nomor yang belum pernah chat
  4. Gunakan delay random
  5. Gunakan queue (antrian)
  6. 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:

  • 515 pesan / menit aman
  • 2030 / 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; // 29 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 13:

  • max 2030 pesan/hari

Hari 47:

  • naik ke 50100

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 → 810 worker

  • tiap worker limit:

    • 5 msg / menit
  • total:

    • ~50 msg / menit (aman)

📊 Rule simple anti ban

👉 Rumus aman:

delay minimal: 210 detik
max: 10 pesan / menit / akun