diff --git a/catatan-wa.md b/catatan-wa.md new file mode 100644 index 0000000..9a0355d --- /dev/null +++ b/catatan-wa.md @@ -0,0 +1,208 @@ +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: + +```bash +npm install bullmq ioredis +``` + +--- + +# 🧠 2. Contoh Queue + Rate Limit (AMAN) + +```js +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 + +```js +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: + +```js +max: 10, +duration: 60000 +``` + +--- + +# 🧠 4. Random delay (WA suka ini) + +Tambahkan variasi: + +```js +function randomDelay() { + return Math.floor(Math.random() * 7000) + 2000; // 2–9 detik +} +``` + +--- + +# 🧩 5. Rate limit per nomor (PENTING) + +Jangan spam ke satu nomor: + +```js +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: + +```js +await client.sendPresenceAvailable(); +await client.sendPresenceTyping(number); + +await new Promise(r => setTimeout(r, 2000)); +``` + +--- + +### Randomisasi pesan: + +```js +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: + +```text +delay minimal: 2–10 detik +max: 10 pesan / menit / akun +```