Add catatan-wa.md
This commit is contained in:
parent
99ad083a02
commit
87f248d05a
|
|
@ -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
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue