baileys-xbats 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.MD +991 -0
- package/WAProto/index.d.ts +15933 -0
- package/WAProto/index.js +115857 -0
- package/engine-requirements.js +10 -0
- package/lib/Defaults/index.js +120 -0
- package/lib/Defaults/noxleyss-version.json +3 -0
- package/lib/Signal/Group/ciphertext-message.js +15 -0
- package/lib/Signal/Group/group-session-builder.js +64 -0
- package/lib/Signal/Group/group_cipher.js +96 -0
- package/lib/Signal/Group/index.js +57 -0
- package/lib/Signal/Group/keyhelper.js +55 -0
- package/lib/Signal/Group/queue-job.js +57 -0
- package/lib/Signal/Group/sender-chain-key.js +34 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
- package/lib/Signal/Group/sender-key-message.js +69 -0
- package/lib/Signal/Group/sender-key-name.js +51 -0
- package/lib/Signal/Group/sender-key-record.js +53 -0
- package/lib/Signal/Group/sender-key-state.js +99 -0
- package/lib/Signal/Group/sender-message-key.js +29 -0
- package/lib/Signal/libsignal.js +184 -0
- package/lib/Socket/Client/index.js +18 -0
- package/lib/Socket/Client/types.js +13 -0
- package/lib/Socket/Client/websocket.js +72 -0
- package/lib/Socket/business.js +260 -0
- package/lib/Socket/chats.js +997 -0
- package/lib/Socket/groups.js +332 -0
- package/lib/Socket/index.js +10 -0
- package/lib/Socket/messages-recv.js +1161 -0
- package/lib/Socket/messages-send.js +944 -0
- package/lib/Socket/newsletter.js +283 -0
- package/lib/Socket/socket.js +646 -0
- package/lib/Socket/usync.js +70 -0
- package/lib/Store/index.js +8 -0
- package/lib/Store/make-in-memory-store.js +439 -0
- package/lib/Store/make-ordered-dictionary.js +81 -0
- package/lib/Store/object-repository.js +27 -0
- package/lib/Types/Auth.js +2 -0
- package/lib/Types/Call.js +2 -0
- package/lib/Types/Chat.js +4 -0
- package/lib/Types/Contact.js +2 -0
- package/lib/Types/Events.js +2 -0
- package/lib/Types/GroupMetadata.js +2 -0
- package/lib/Types/Label.js +27 -0
- package/lib/Types/LabelAssociation.js +9 -0
- package/lib/Types/Message.js +7 -0
- package/lib/Types/Newsletter.js +18 -0
- package/lib/Types/Product.js +2 -0
- package/lib/Types/Signal.js +2 -0
- package/lib/Types/Socket.js +2 -0
- package/lib/Types/State.js +2 -0
- package/lib/Types/USync.js +2 -0
- package/lib/Types/index.js +42 -0
- package/lib/Utils/auth-utils.js +199 -0
- package/lib/Utils/browser-utils.js +35 -0
- package/lib/Utils/business.js +234 -0
- package/lib/Utils/chat-utils.js +730 -0
- package/lib/Utils/crypto.js +193 -0
- package/lib/Utils/decode-wa-message.js +217 -0
- package/lib/Utils/event-buffer.js +518 -0
- package/lib/Utils/generics.js +467 -0
- package/lib/Utils/history.js +94 -0
- package/lib/Utils/index.js +35 -0
- package/lib/Utils/link-preview.js +126 -0
- package/lib/Utils/logger.js +7 -0
- package/lib/Utils/lt-hash.js +51 -0
- package/lib/Utils/make-mutex.js +43 -0
- package/lib/Utils/message-retry-manager.js +185 -0
- package/lib/Utils/messages-media.js +879 -0
- package/lib/Utils/messages.js +1944 -0
- package/lib/Utils/noise-handler.js +150 -0
- package/lib/Utils/noxleyss-event-stream.js +63 -0
- package/lib/Utils/process-message.js +404 -0
- package/lib/Utils/signal.js +153 -0
- package/lib/Utils/use-multi-file-auth-state.js +124 -0
- package/lib/Utils/validate-connection.js +229 -0
- package/lib/WABinary/constants.js +1303 -0
- package/lib/WABinary/decode.js +265 -0
- package/lib/WABinary/encode.js +250 -0
- package/lib/WABinary/generic-utils.js +110 -0
- package/lib/WABinary/index.js +21 -0
- package/lib/WABinary/jid-utils.js +85 -0
- package/lib/WABinary/types.js +2 -0
- package/lib/WAM/BinaryInfo.js +13 -0
- package/lib/WAM/constants.js +15350 -0
- package/lib/WAM/encode.js +155 -0
- package/lib/WAM/index.js +19 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
- package/lib/WAUSync/Protocols/index.js +20 -0
- package/lib/WAUSync/USyncQuery.js +89 -0
- package/lib/WAUSync/USyncUser.js +26 -0
- package/lib/WAUSync/index.js +19 -0
- package/lib/index.js +89 -0
- package/package.json +97 -0
package/README.MD
ADDED
|
@@ -0,0 +1,991 @@
|
|
|
1
|
+
# <div align='center'>noxleyss</div>
|
|
2
|
+
|
|
3
|
+
<div align='center'>
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/noxleyss)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.npmjs.com/package/noxleyss)
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<div align="center">
|
|
12
|
+
<strong>noxleyss</strong> — WhatsApp API Multi‑Device Modern untuk bot dan aplikasi berbasis Node.js.
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
## ✨ Fitur Utama
|
|
16
|
+
|
|
17
|
+
- 🚀 **Modern & Cepat** – Dibangun dengan TypeScript dan teknologi terkini.
|
|
18
|
+
- 🔧 **Perbaikan @lid & @jid** – Mengatasi masalah ID lokal ke ID ponsel di grup WhatsApp.
|
|
19
|
+
- 📱 **Dukungan Multi‑Device** – Koneksi penuh ke WhatsApp Multi‑Device.
|
|
20
|
+
- 🔐 **Enkripsi End‑to‑End** – Semua pesan terenkripsi.
|
|
21
|
+
- 📨 **Semua Jenis Pesan** – Teks, media (gambar, video, audio), polling, stiker, lokasi, kontak, dan lainnya.
|
|
22
|
+
- 🧩 **Ringan & Optimal** – Performa stabil dengan dukungan streaming media.
|
|
23
|
+
- 📂 **Manajemen Autentikasi** – Simpan kredensial di file atau database.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## ⚠️ Peringatan
|
|
28
|
+
|
|
29
|
+
Proyek ini **tidak berafiliasi, didukung, atau terhubung secara resmi** dengan WhatsApp atau anak perusahaannya. Situs resmi WhatsApp: [whatsapp.com](https://whatsapp.com).
|
|
30
|
+
|
|
31
|
+
Pengguna bertanggung jawab penuh atas penggunaan aplikasi ini. Hindari spam dan otomatisasi berlebihan yang melanggar Ketentuan Layanan WhatsApp.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 📦 Instalasi
|
|
36
|
+
|
|
37
|
+
### Versi Stabil (Direkomendasikan)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install noxleyss
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Versi Terbaru (Edge)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install noxleyss@latest
|
|
47
|
+
# atau dengan yarn
|
|
48
|
+
yarn add noxleyss@latest
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Cara Impor
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
// CommonJS
|
|
55
|
+
const { default: makeWASocket } = require("noxleyss")
|
|
56
|
+
|
|
57
|
+
// ES6 Module
|
|
58
|
+
import makeWASocket from "noxleyss"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
🚀 Mulai Cepat
|
|
64
|
+
|
|
65
|
+
Contoh Dasar (dengan QR Code)
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('noxleyss')
|
|
69
|
+
const { Boom } = require('@hapi/boom')
|
|
70
|
+
|
|
71
|
+
async function connectToWhatsApp() {
|
|
72
|
+
// Simpan kredensial di folder 'auth_info_noxleyss'
|
|
73
|
+
const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
|
|
74
|
+
|
|
75
|
+
const sock = makeWASocket({
|
|
76
|
+
auth: state,
|
|
77
|
+
printQRInTerminal: true,
|
|
78
|
+
browser: ['noxleyss', 'Desktop', '3.0']
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// Event koneksi
|
|
82
|
+
sock.ev.on('connection.update', (update) => {
|
|
83
|
+
const { connection, lastDisconnect } = update
|
|
84
|
+
if (connection === 'close') {
|
|
85
|
+
const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
|
|
86
|
+
console.log('Koneksi tertutup, reconnecting:', shouldReconnect)
|
|
87
|
+
if (shouldReconnect) connectToWhatsApp()
|
|
88
|
+
} else if (connection === 'open') {
|
|
89
|
+
console.log('✅ Berhasil terhubung ke WhatsApp!')
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
// Event pesan masuk
|
|
94
|
+
sock.ev.on('messages.upsert', async ({ messages }) => {
|
|
95
|
+
for (const m of messages) {
|
|
96
|
+
if (!m.message) continue
|
|
97
|
+
console.log('📱 Pesan baru:', JSON.stringify(m, undefined, 2))
|
|
98
|
+
|
|
99
|
+
// Balas otomatis
|
|
100
|
+
await sock.sendMessage(m.key.remoteJid!, {
|
|
101
|
+
text: 'Halo! Saya bot WhatsApp menggunakan noxleyss 🤖'
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
// Simpan kredensial saat diperbarui
|
|
107
|
+
sock.ev.on('creds.update', saveCreds)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
connectToWhatsApp()
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
🔌 Koneksi Akun
|
|
116
|
+
|
|
117
|
+
WhatsApp menyediakan API multi‑device yang memungkinkan noxleyss terautentikasi sebagai klien WhatsApp sekunder melalui QR code atau pairing code.
|
|
118
|
+
|
|
119
|
+
Hubungkan dengan QR Code
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
const { default: makeWASocket, Browsers } = require("noxleyss")
|
|
123
|
+
|
|
124
|
+
const sock = makeWASocket({
|
|
125
|
+
browser: Browsers.ubuntu('My App'),
|
|
126
|
+
printQRInTerminal: true
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Setelah koneksi berhasil, QR code akan muncul di terminal. Pindai dengan WhatsApp di ponsel Anda untuk login.
|
|
131
|
+
|
|
132
|
+
Hubungkan dengan Pairing Code
|
|
133
|
+
|
|
134
|
+
Penting: Pairing code memungkinkan koneksi tanpa QR code. Nomor telepon harus tanpa +, (), atau -, dan sertakan kode negara.
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
const { default: makeWASocket } = require("noxleyss")
|
|
138
|
+
|
|
139
|
+
const sock = makeWASocket({
|
|
140
|
+
printQRInTerminal: false
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
// Pairing normal
|
|
144
|
+
if (!sock.authState.creds.registered) {
|
|
145
|
+
const number = '6283134600805' // ganti dengan nomor Anda
|
|
146
|
+
const code = await sock.requestPairingCode(number)
|
|
147
|
+
console.log('🔑 Kode Pairing:', code)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Pairing dengan kode kustom (8 karakter)
|
|
151
|
+
if (!sock.authState.creds.registered) {
|
|
152
|
+
const pair = "noxleyss"
|
|
153
|
+
const number = '6283134600805'
|
|
154
|
+
const code = await sock.requestPairingCode(number, pair)
|
|
155
|
+
console.log('🔑 Kode Pairing Kustom:', code)
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Terima Riwayat Lengkap
|
|
160
|
+
|
|
161
|
+
Untuk menerima riwayat pesan lengkap, setel syncFullHistory ke true.
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
const { default: makeWASocket, Browsers } = require("noxleyss")
|
|
165
|
+
|
|
166
|
+
const sock = makeWASocket({
|
|
167
|
+
browser: Browsers.macOS('Desktop'),
|
|
168
|
+
syncFullHistory: true
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
⚙️ Catatan Penting Konfigurasi Socket
|
|
175
|
+
|
|
176
|
+
Caching Metadata Grup (Direkomendasikan)
|
|
177
|
+
|
|
178
|
+
Untuk penggunaan grup, implementasikan caching metadata grup:
|
|
179
|
+
|
|
180
|
+
```javascript
|
|
181
|
+
const { default: makeWASocket } = require("noxleyss")
|
|
182
|
+
const NodeCache = require('node-cache')
|
|
183
|
+
|
|
184
|
+
const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })
|
|
185
|
+
|
|
186
|
+
const sock = makeWASocket({
|
|
187
|
+
cachedGroupMetadata: async (jid) => groupCache.get(jid)
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
sock.ev.on('groups.update', async ([event]) => {
|
|
191
|
+
const metadata = await sock.groupMetadata(event.id)
|
|
192
|
+
groupCache.set(event.id, metadata)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
sock.ev.on('group-participants.update', async (event) => {
|
|
196
|
+
const metadata = await sock.groupMetadata(event.id)
|
|
197
|
+
groupCache.set(event.id, metadata)
|
|
198
|
+
})
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Perbaiki Sistem Retry & Dekripsi Vote Poll
|
|
202
|
+
|
|
203
|
+
Tingkatkan pengiriman pesan dan dekripsi vote poll dengan store:
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
const sock = makeWASocket({
|
|
207
|
+
getMessage: async (key) => await getMessageFromStore(key)
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Terima Notifikasi di Aplikasi WhatsApp
|
|
212
|
+
|
|
213
|
+
Nonaktifkan status online untuk menerima notifikasi:
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
const sock = makeWASocket({
|
|
217
|
+
markOnlineOnConnect: false
|
|
218
|
+
})
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
💾 Simpan Info Auth
|
|
224
|
+
|
|
225
|
+
Hindari pemindaian QR code berulang dengan menyimpan kredensial:
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
const { default: makeWASocket, useMultiFileAuthState } = require("noxleyss")
|
|
229
|
+
|
|
230
|
+
async function connect() {
|
|
231
|
+
const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
|
|
232
|
+
const sock = makeWASocket({ auth: state })
|
|
233
|
+
sock.ev.on('creds.update', saveCreds)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
connect()
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Penting: useMultiFileAuthState menyimpan status auth di folder. Untuk produksi, gunakan database SQL/No‑SQL dan kelola update kunci dengan hati‑hati.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
🗄️ Implementasi Data Store
|
|
244
|
+
|
|
245
|
+
noxleyss tidak menyertakan penyimpanan default untuk obrolan, kontak, atau pesan. Namun, implementasi in‑memory sederhana disediakan.
|
|
246
|
+
|
|
247
|
+
```javascript
|
|
248
|
+
const { default: makeWASocket, makeInMemoryStore } = require("noxleyss")
|
|
249
|
+
|
|
250
|
+
const store = makeInMemoryStore({ })
|
|
251
|
+
|
|
252
|
+
store.readFromFile('./noxleyss_store.json')
|
|
253
|
+
|
|
254
|
+
setInterval(() => {
|
|
255
|
+
store.writeToFile('./noxleyss_store.json')
|
|
256
|
+
}, 10_000)
|
|
257
|
+
|
|
258
|
+
const sock = makeWASocket({ })
|
|
259
|
+
store.bind(sock.ev)
|
|
260
|
+
|
|
261
|
+
sock.ev.on('chats.upsert', () => {
|
|
262
|
+
console.log('dapat obrolan', store.chats.all())
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
sock.ev.on('contacts.upsert', () => {
|
|
266
|
+
console.log('dapat kontak', Object.values(store.contacts))
|
|
267
|
+
})
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
🆔 Penjelasan ID WhatsApp
|
|
273
|
+
|
|
274
|
+
id adalah ID WhatsApp, disebut juga jid, untuk orang atau grup tujuan pesan.
|
|
275
|
+
|
|
276
|
+
· Orang: [kode negara][nomor telepon]@s.whatsapp.net
|
|
277
|
+
Contoh: +19999999999@s.whatsapp.net
|
|
278
|
+
· Grup: 123456789-123345@g.us
|
|
279
|
+
· Daftar siaran: [timestamp pembuatan]@broadcast
|
|
280
|
+
· Cerita: status@broadcast
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
🔧 Fungsi Utilitas
|
|
285
|
+
|
|
286
|
+
· getContentType – Mengembalikan tipe konten pesan
|
|
287
|
+
· getDevice – Mengembalikan perangkat dari pesan
|
|
288
|
+
· makeCacheableSignalKeyStore – Mempercepat store auth
|
|
289
|
+
· downloadContentFromMessage – Unduh konten dari pesan
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
📤 Kirim Pesan
|
|
294
|
+
|
|
295
|
+
Kirim semua jenis pesan dengan satu fungsi.
|
|
296
|
+
|
|
297
|
+
```javascript
|
|
298
|
+
sock.sendMessage(jid, content, options)
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Pesan Non‑Media
|
|
302
|
+
|
|
303
|
+
Pesan Teks
|
|
304
|
+
|
|
305
|
+
```javascript
|
|
306
|
+
await sock.sendMessage(jid, { text: 'halo dunia' })
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Pesan Kutipan (bekerja dengan semua tipe)
|
|
310
|
+
|
|
311
|
+
```javascript
|
|
312
|
+
await sock.sendMessage(jid, { text: 'halo dunia' }, { quoted: message })
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Sebut Pengguna
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
await sock.sendMessage(
|
|
319
|
+
jid,
|
|
320
|
+
{
|
|
321
|
+
text: '@12345678901',
|
|
322
|
+
mentions: ['12345678901@s.whatsapp.net']
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Teruskan Pesan
|
|
328
|
+
|
|
329
|
+
```javascript
|
|
330
|
+
const msg = getMessageFromStore() // implementasikan sendiri
|
|
331
|
+
await sock.sendMessage(jid, { forward: msg })
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Pesan Lokasi
|
|
335
|
+
|
|
336
|
+
```javascript
|
|
337
|
+
await sock.sendMessage(
|
|
338
|
+
jid,
|
|
339
|
+
{
|
|
340
|
+
location: {
|
|
341
|
+
degreesLatitude: 24.121231,
|
|
342
|
+
degreesLongitude: 55.1121221
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Pesan Kontak (vCard)
|
|
349
|
+
|
|
350
|
+
```javascript
|
|
351
|
+
const vcard = 'BEGIN:VCARD\n'
|
|
352
|
+
+ 'VERSION:3.0\n'
|
|
353
|
+
+ 'FN:Jeff Singh\n'
|
|
354
|
+
+ 'ORG:Ashoka Uni;\n'
|
|
355
|
+
+ 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n'
|
|
356
|
+
+ 'END:VCARD'
|
|
357
|
+
|
|
358
|
+
await sock.sendMessage(
|
|
359
|
+
id,
|
|
360
|
+
{
|
|
361
|
+
contacts: {
|
|
362
|
+
displayName: 'Jeff',
|
|
363
|
+
contacts: [{ vcard }]
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
)
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Pesan Reaksi
|
|
370
|
+
|
|
371
|
+
```javascript
|
|
372
|
+
await sock.sendMessage(
|
|
373
|
+
jid,
|
|
374
|
+
{
|
|
375
|
+
react: {
|
|
376
|
+
text: '💖', // kosongkan untuk hapus reaksi
|
|
377
|
+
key: message.key
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
)
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Pin Pesan
|
|
384
|
+
|
|
385
|
+
```javascript
|
|
386
|
+
await sock.sendMessage(
|
|
387
|
+
jid,
|
|
388
|
+
{
|
|
389
|
+
pin: {
|
|
390
|
+
type: 1, // 0 untuk hapus
|
|
391
|
+
time: 86400, // 24 jam dalam detik
|
|
392
|
+
key: message.key
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
)
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
Pesan Poll
|
|
399
|
+
|
|
400
|
+
```javascript
|
|
401
|
+
await sock.sendMessage(
|
|
402
|
+
jid,
|
|
403
|
+
{
|
|
404
|
+
poll: {
|
|
405
|
+
name: 'Poll Saya',
|
|
406
|
+
values: ['Opsi 1', 'Opsi 2', 'Opsi 3'],
|
|
407
|
+
selectableCount: 1,
|
|
408
|
+
toAnnouncementGroup: false
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
)
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
Kirim dengan Pratinjau Tautan
|
|
415
|
+
|
|
416
|
+
Instal link-preview-js:
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
npm install link-preview-js
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
```javascript
|
|
423
|
+
await sock.sendMessage(
|
|
424
|
+
jid,
|
|
425
|
+
{
|
|
426
|
+
text: 'Halo, ini dikirim menggunakan https://npmjs.com/noxleyss'
|
|
427
|
+
}
|
|
428
|
+
)
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Pesan Media
|
|
432
|
+
|
|
433
|
+
Catatan: Di pesan media, bisa gunakan { stream: Stream }, { url: Url }, atau Buffer langsung.
|
|
434
|
+
|
|
435
|
+
Kirim Gambar
|
|
436
|
+
|
|
437
|
+
```javascript
|
|
438
|
+
await sock.sendMessage(
|
|
439
|
+
id,
|
|
440
|
+
{
|
|
441
|
+
image: {
|
|
442
|
+
url: './Media/ma_img.png'
|
|
443
|
+
},
|
|
444
|
+
caption: 'halo dunia'
|
|
445
|
+
}
|
|
446
|
+
)
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Kirim Video
|
|
450
|
+
|
|
451
|
+
```javascript
|
|
452
|
+
await sock.sendMessage(
|
|
453
|
+
id,
|
|
454
|
+
{
|
|
455
|
+
video: {
|
|
456
|
+
url: './Media/ma_video.mp4'
|
|
457
|
+
},
|
|
458
|
+
caption: 'halo dunia',
|
|
459
|
+
ptv: false // true untuk video note
|
|
460
|
+
}
|
|
461
|
+
)
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
Kirim GIF
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
await sock.sendMessage(
|
|
468
|
+
jid,
|
|
469
|
+
{
|
|
470
|
+
video: fs.readFileSync('Media/ma_gif.mp4'),
|
|
471
|
+
caption: 'halo dunia',
|
|
472
|
+
gifPlayback: true
|
|
473
|
+
}
|
|
474
|
+
)
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
Kirim Audio
|
|
478
|
+
|
|
479
|
+
```javascript
|
|
480
|
+
await sock.sendMessage(
|
|
481
|
+
jid,
|
|
482
|
+
{
|
|
483
|
+
audio: {
|
|
484
|
+
url: './Media/audio.mp3'
|
|
485
|
+
},
|
|
486
|
+
mimetype: 'audio/mp4'
|
|
487
|
+
}
|
|
488
|
+
)
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
View Once
|
|
492
|
+
|
|
493
|
+
```javascript
|
|
494
|
+
await sock.sendMessage(
|
|
495
|
+
id,
|
|
496
|
+
{
|
|
497
|
+
image: {
|
|
498
|
+
url: './Media/ma_img.png'
|
|
499
|
+
},
|
|
500
|
+
viewOnce: true,
|
|
501
|
+
caption: 'halo dunia'
|
|
502
|
+
}
|
|
503
|
+
)
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
✏️ Ubah Pesan
|
|
509
|
+
|
|
510
|
+
Hapus Pesan (untuk semua)
|
|
511
|
+
|
|
512
|
+
```javascript
|
|
513
|
+
const msg = await sock.sendMessage(jid, { text: 'halo dunia' })
|
|
514
|
+
await sock.sendMessage(jid, { delete: msg.key })
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
Edit Pesan
|
|
518
|
+
|
|
519
|
+
```javascript
|
|
520
|
+
await sock.sendMessage(jid, {
|
|
521
|
+
text: 'teks terupdate di sini',
|
|
522
|
+
edit: response.key,
|
|
523
|
+
})
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
🖼️ Manipulasi Pesan Media
|
|
529
|
+
|
|
530
|
+
Unduh Pesan Media
|
|
531
|
+
|
|
532
|
+
```javascript
|
|
533
|
+
import { createWriteStream } from 'fs'
|
|
534
|
+
import { downloadMediaMessage, getContentType } from 'noxleyss'
|
|
535
|
+
|
|
536
|
+
sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
|
|
537
|
+
if (!m.message) return
|
|
538
|
+
const messageType = getContentType(m)
|
|
539
|
+
|
|
540
|
+
if (messageType === 'imageMessage') {
|
|
541
|
+
const stream = await downloadMediaMessage(
|
|
542
|
+
m,
|
|
543
|
+
'stream',
|
|
544
|
+
{ },
|
|
545
|
+
{
|
|
546
|
+
logger,
|
|
547
|
+
reuploadRequest: sock.updateMediaMessage
|
|
548
|
+
}
|
|
549
|
+
)
|
|
550
|
+
const writeStream = createWriteStream('./my-download.jpeg')
|
|
551
|
+
stream.pipe(writeStream)
|
|
552
|
+
}
|
|
553
|
+
})
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
📞 Tolak Panggilan
|
|
559
|
+
|
|
560
|
+
```javascript
|
|
561
|
+
await sock.rejectCall(callId, callFrom)
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
💬 Status Kirim di Obrolan
|
|
567
|
+
|
|
568
|
+
Baca Pesan
|
|
569
|
+
|
|
570
|
+
```javascript
|
|
571
|
+
await sock.readMessages([key]) // bisa multiple kunci
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
Update Kehadiran
|
|
575
|
+
|
|
576
|
+
```javascript
|
|
577
|
+
await sock.sendPresenceUpdate('available', jid)
|
|
578
|
+
await sock.sendPresenceUpdate('composing', jid)
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
📁 Ubah Obrolan
|
|
584
|
+
|
|
585
|
+
Arsipkan Obrolan
|
|
586
|
+
|
|
587
|
+
```javascript
|
|
588
|
+
const lastMsgInChat = await getLastMessageInChat(jid) // implementasikan sendiri
|
|
589
|
+
await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Bisukan/Buka Bisukan Obrolan
|
|
593
|
+
|
|
594
|
+
```javascript
|
|
595
|
+
// Bisukan 8 jam
|
|
596
|
+
await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)
|
|
597
|
+
// Buka bisukan
|
|
598
|
+
await sock.chatModify({ mute: null }, jid)
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
Tandai Obrolan Dibaca/Tidak Dibaca
|
|
602
|
+
|
|
603
|
+
```javascript
|
|
604
|
+
const lastMsgInChat = await getLastMessageInChat(jid)
|
|
605
|
+
await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, jid)
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
Hapus Pesan untuk Saya
|
|
609
|
+
|
|
610
|
+
```javascript
|
|
611
|
+
await sock.chatModify(
|
|
612
|
+
{
|
|
613
|
+
clear: {
|
|
614
|
+
messages: [
|
|
615
|
+
{
|
|
616
|
+
id: 'ATWYHDNNWU81732J',
|
|
617
|
+
fromMe: true,
|
|
618
|
+
timestamp: '1654823909'
|
|
619
|
+
}
|
|
620
|
+
]
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
jid
|
|
624
|
+
)
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
Hapus Obrolan
|
|
628
|
+
|
|
629
|
+
```javascript
|
|
630
|
+
const lastMsgInChat = await getLastMessageInChat(jid)
|
|
631
|
+
await sock.chatModify({
|
|
632
|
+
delete: true,
|
|
633
|
+
lastMessages: [
|
|
634
|
+
{
|
|
635
|
+
key: lastMsgInChat.key,
|
|
636
|
+
messageTimestamp: lastMsgInChat.messageTimestamp
|
|
637
|
+
}
|
|
638
|
+
]
|
|
639
|
+
}, jid)
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
Pin/Hapus Pin Obrolan
|
|
643
|
+
|
|
644
|
+
```javascript
|
|
645
|
+
await sock.chatModify({ pin: true }, jid) // pin
|
|
646
|
+
await sock.chatModify({ pin: false }, jid) // hapus pin
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
Bintangi/Hapus Bintang Pesan
|
|
650
|
+
|
|
651
|
+
```javascript
|
|
652
|
+
await sock.chatModify({
|
|
653
|
+
star: {
|
|
654
|
+
messages: [
|
|
655
|
+
{
|
|
656
|
+
id: 'messageID',
|
|
657
|
+
fromMe: true
|
|
658
|
+
}
|
|
659
|
+
],
|
|
660
|
+
star: true // atau false untuk hapus bintang
|
|
661
|
+
}
|
|
662
|
+
}, jid)
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
Pesan Menghilang
|
|
666
|
+
|
|
667
|
+
```javascript
|
|
668
|
+
// Nyalakan pesan menghilang (7 hari default)
|
|
669
|
+
await sock.sendMessage(
|
|
670
|
+
jid,
|
|
671
|
+
{ disappearingMessagesInChat: 604800 } // 7 hari dalam detik
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
// Kirim sebagai pesan menghilang
|
|
675
|
+
await sock.sendMessage(jid, { text: 'halo' }, { ephemeralExpiration: 604800 })
|
|
676
|
+
|
|
677
|
+
// Matikan
|
|
678
|
+
await sock.sendMessage(
|
|
679
|
+
jid,
|
|
680
|
+
{ disappearingMessagesInChat: false }
|
|
681
|
+
)
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
👤 Query Pengguna
|
|
687
|
+
|
|
688
|
+
Periksa ID Ada di WhatsApp
|
|
689
|
+
|
|
690
|
+
```javascript
|
|
691
|
+
const [result] = await sock.onWhatsApp(jid)
|
|
692
|
+
if (result.exists) console.log(`${jid} ada di WhatsApp, sebagai jid: ${result.jid}`)
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
Query Riwayat Obrolan
|
|
696
|
+
|
|
697
|
+
```javascript
|
|
698
|
+
const msg = await getOldestMessageInChat(jid) // implementasikan sendiri
|
|
699
|
+
await sock.fetchMessageHistory(
|
|
700
|
+
50, // jumlah (max: 50 per query)
|
|
701
|
+
msg.key,
|
|
702
|
+
msg.messageTimestamp
|
|
703
|
+
)
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
Ambil Status
|
|
707
|
+
|
|
708
|
+
```javascript
|
|
709
|
+
const status = await sock.fetchStatus(jid)
|
|
710
|
+
console.log('status: ' + status)
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
Ambil Foto Profil (grup juga)
|
|
714
|
+
|
|
715
|
+
```javascript
|
|
716
|
+
// resolusi rendah
|
|
717
|
+
const ppUrl = await sock.profilePictureUrl(jid)
|
|
718
|
+
console.log(ppUrl)
|
|
719
|
+
|
|
720
|
+
// resolusi tinggi
|
|
721
|
+
const ppUrlHigh = await sock.profilePictureUrl(jid, 'image')
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
Ambil Profil Bisnis
|
|
725
|
+
|
|
726
|
+
```javascript
|
|
727
|
+
const profile = await sock.getBusinessProfile(jid)
|
|
728
|
+
console.log('deskripsi: ' + profile.description + ', kategori: ' + profile.category)
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
Ambil Kehadiran Seseorang
|
|
732
|
+
|
|
733
|
+
```javascript
|
|
734
|
+
sock.ev.on('presence.update', console.log)
|
|
735
|
+
await sock.presenceSubscribe(jid)
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
---
|
|
739
|
+
|
|
740
|
+
🔄 Ubah Profil
|
|
741
|
+
|
|
742
|
+
Ubah Status Profil
|
|
743
|
+
|
|
744
|
+
```javascript
|
|
745
|
+
await sock.updateProfileStatus('Halo Dunia!')
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
Ubah Nama Profil
|
|
749
|
+
|
|
750
|
+
```javascript
|
|
751
|
+
await sock.updateProfileName('Nama Saya')
|
|
752
|
+
```
|
|
753
|
+
|
|
754
|
+
Ubah Foto Tampilan (grup juga)
|
|
755
|
+
|
|
756
|
+
```javascript
|
|
757
|
+
await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' })
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
Hapus Foto Tampilan (grup juga)
|
|
761
|
+
|
|
762
|
+
```javascript
|
|
763
|
+
await sock.removeProfilePicture(jid)
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
---
|
|
767
|
+
|
|
768
|
+
👥 Grup
|
|
769
|
+
|
|
770
|
+
Buat Grup
|
|
771
|
+
|
|
772
|
+
```javascript
|
|
773
|
+
const group = await sock.groupCreate('Grup Saya', ['1234@s.whatsapp.net', '4564@s.whatsapp.net'])
|
|
774
|
+
console.log('grup dibuat dengan id: ' + group.gid)
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
Tambah/Hapus atau Turunkan/Naikkan
|
|
778
|
+
|
|
779
|
+
```javascript
|
|
780
|
+
await sock.groupParticipantsUpdate(
|
|
781
|
+
jid,
|
|
782
|
+
['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'],
|
|
783
|
+
'add' // 'remove', 'demote', atau 'promote'
|
|
784
|
+
)
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
Ubah Subjek (nama)
|
|
788
|
+
|
|
789
|
+
```javascript
|
|
790
|
+
await sock.groupUpdateSubject(jid, 'Subjek Baru!')
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
Ubah Deskripsi
|
|
794
|
+
|
|
795
|
+
```javascript
|
|
796
|
+
await sock.groupUpdateDescription(jid, 'Deskripsi Baru!')
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
Ubah Pengaturan
|
|
800
|
+
|
|
801
|
+
```javascript
|
|
802
|
+
// Hanya admin kirim pesan
|
|
803
|
+
await sock.groupSettingUpdate(jid, 'announcement')
|
|
804
|
+
// Semua bisa kirim
|
|
805
|
+
await sock.groupSettingUpdate(jid, 'not_announcement')
|
|
806
|
+
// Semua bisa ubah pengaturan grup
|
|
807
|
+
await sock.groupSettingUpdate(jid, 'unlocked')
|
|
808
|
+
// Hanya admin ubah pengaturan
|
|
809
|
+
await sock.groupSettingUpdate(jid, 'locked')
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
Keluar Grup
|
|
813
|
+
|
|
814
|
+
```javascript
|
|
815
|
+
await sock.groupLeave(jid)
|
|
816
|
+
```
|
|
817
|
+
|
|
818
|
+
Ambil Kode Undangan
|
|
819
|
+
|
|
820
|
+
```javascript
|
|
821
|
+
const code = await sock.groupInviteCode(jid)
|
|
822
|
+
console.log('https://chat.whatsapp.com/' + code)
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
Cabut Kode Undangan
|
|
826
|
+
|
|
827
|
+
```javascript
|
|
828
|
+
const code = await sock.groupRevokeInvite(jid)
|
|
829
|
+
console.log('Kode grup baru: ' + code)
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
Gabung Menggunakan Kode Undangan
|
|
833
|
+
|
|
834
|
+
```javascript
|
|
835
|
+
const response = await sock.groupAcceptInvite(code)
|
|
836
|
+
console.log('bergabung ke: ' + response)
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
Ambil Info Grup dari Kode Undangan
|
|
840
|
+
|
|
841
|
+
```javascript
|
|
842
|
+
const response = await sock.groupGetInviteInfo(code)
|
|
843
|
+
console.log('info grup: ' + response)
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
Query Metadata
|
|
847
|
+
|
|
848
|
+
```javascript
|
|
849
|
+
const metadata = await sock.groupMetadata(jid)
|
|
850
|
+
console.log(metadata.id + ', judul: ' + metadata.subject + ', deskripsi: ' + metadata.desc)
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
Ambil Semua Metadata Grup yang Diikuti
|
|
854
|
+
|
|
855
|
+
```javascript
|
|
856
|
+
const response = await sock.groupFetchAllParticipating()
|
|
857
|
+
console.log(response)
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
Toggle Ephemeral
|
|
861
|
+
|
|
862
|
+
```javascript
|
|
863
|
+
await sock.groupToggleEphemeral(jid, 86400) // 24 jam
|
|
864
|
+
```
|
|
865
|
+
|
|
866
|
+
Ubah Mode Tambah
|
|
867
|
+
|
|
868
|
+
```javascript
|
|
869
|
+
await sock.groupMemberAddMode(
|
|
870
|
+
jid,
|
|
871
|
+
'all_member_add' // atau 'admin_add'
|
|
872
|
+
)
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
---
|
|
876
|
+
|
|
877
|
+
🔒 Privasi
|
|
878
|
+
|
|
879
|
+
Blokir/Buka Blokir Pengguna
|
|
880
|
+
|
|
881
|
+
```javascript
|
|
882
|
+
await sock.updateBlockStatus(jid, 'block')
|
|
883
|
+
await sock.updateBlockStatus(jid, 'unblock')
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
Ambil Pengaturan Privasi
|
|
887
|
+
|
|
888
|
+
```javascript
|
|
889
|
+
const privacySettings = await sock.fetchPrivacySettings(true)
|
|
890
|
+
console.log(privacySettings)
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
Ambil Daftar Blokir
|
|
894
|
+
|
|
895
|
+
```javascript
|
|
896
|
+
const blocklist = await sock.fetchBlocklist()
|
|
897
|
+
console.log(blocklist)
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
Update Privasi
|
|
901
|
+
|
|
902
|
+
```javascript
|
|
903
|
+
await sock.updateLastSeenPrivacy('contacts')
|
|
904
|
+
await sock.updateOnlinePrivacy('all')
|
|
905
|
+
await sock.updateProfilePicturePrivacy('contacts')
|
|
906
|
+
await sock.updateStatusPrivacy('none')
|
|
907
|
+
await sock.updateReadReceiptsPrivacy('all')
|
|
908
|
+
await sock.updateGroupsAddPrivacy('contacts')
|
|
909
|
+
await sock.updateDefaultDisappearingMode(86400) // 24 jam
|
|
910
|
+
```
|
|
911
|
+
|
|
912
|
+
---
|
|
913
|
+
|
|
914
|
+
📢 Daftar Siaran & Cerita
|
|
915
|
+
|
|
916
|
+
Kirim Siaran & Cerita
|
|
917
|
+
|
|
918
|
+
```javascript
|
|
919
|
+
await sock.sendMessage(
|
|
920
|
+
jid,
|
|
921
|
+
{
|
|
922
|
+
image: {
|
|
923
|
+
url: url
|
|
924
|
+
},
|
|
925
|
+
caption: caption
|
|
926
|
+
},
|
|
927
|
+
{
|
|
928
|
+
backgroundColor: backgroundColor,
|
|
929
|
+
font: font,
|
|
930
|
+
statusJidList: statusJidList,
|
|
931
|
+
broadcast: true
|
|
932
|
+
}
|
|
933
|
+
)
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
Query Penerima & Nama Daftar Siaran
|
|
937
|
+
|
|
938
|
+
```javascript
|
|
939
|
+
const bList = await sock.getBroadcastListInfo('1234@broadcast')
|
|
940
|
+
console.log(`nama daftar: ${bList.name}, penerima: ${bList.recipients}`)
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
---
|
|
944
|
+
|
|
945
|
+
🛠️ Fungsi Kustom
|
|
946
|
+
|
|
947
|
+
Aktifkan Level Debug
|
|
948
|
+
|
|
949
|
+
```javascript
|
|
950
|
+
const { P } = require('noxleyss')
|
|
951
|
+
|
|
952
|
+
const sock = makeWASocket({
|
|
953
|
+
logger: P({ level: 'debug' }),
|
|
954
|
+
})
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
Daftarkan Callback untuk Event Websocket
|
|
958
|
+
|
|
959
|
+
```javascript
|
|
960
|
+
// Untuk tag 'edge_routing'
|
|
961
|
+
sock.ws.on('CB:edge_routing', (node) => { })
|
|
962
|
+
|
|
963
|
+
// Dengan id 'abcd'
|
|
964
|
+
sock.ws.on('CB:edge_routing,id:abcd', (node) => { })
|
|
965
|
+
|
|
966
|
+
// Dengan node routing_info
|
|
967
|
+
sock.ws.on('CB:edge_routing,id:abcd,routing_info', (node) => { })
|
|
968
|
+
```
|
|
969
|
+
|
|
970
|
+
---
|
|
971
|
+
|
|
972
|
+
💡 Tips & Praktik Terbaik
|
|
973
|
+
|
|
974
|
+
· Gunakan Caching – Cache metadata grup untuk performa lebih baik.
|
|
975
|
+
· Tangani Rekoneksi – Implementasikan auto‑reconnect untuk kestabilan.
|
|
976
|
+
· Kelola Store – Gunakan database (MongoDB, PostgreSQL) untuk produksi.
|
|
977
|
+
· Penanganan Error – Bungkus panggilan socket dengan try‑catch.
|
|
978
|
+
· Batas Rate – Hormati batas WhatsApp untuk hindari ban.
|
|
979
|
+
· Keamanan – Jangan bagikan kredensial auth; gunakan variabel lingkungan.
|
|
980
|
+
|
|
981
|
+
---
|
|
982
|
+
|
|
983
|
+
📄 Lisensi
|
|
984
|
+
|
|
985
|
+
Didistribusikan di bawah Lisensi GPL‑3.0. Lihat file LICENSE untuk informasi lebih lanjut.
|
|
986
|
+
|
|
987
|
+
---
|
|
988
|
+
<div align="center">
|
|
989
|
+
<strong>noxleyss</strong> — noxleyss<br>
|
|
990
|
+
WhatsApp API Modern dengan Perbaikan @lid Ke @pn
|
|
991
|
+
</div>
|