Gathering detailed insights and metrics for neroxbails
Gathering detailed insights and metrics for neroxbails
Gathering detailed insights and metrics for neroxbails
Gathering detailed insights and metrics for neroxbails
npm install neroxbails
Typescript
Module System
Min. Node Version
Node Version
NPM Version
Cumulative downloads
Total Downloads
Last Day
0%
NaN
Compared to previous day
Last Week
0%
NaN
Compared to previous week
Last Month
0%
NaN
Compared to previous month
Last Year
0%
NaN
Compared to previous year
⚠️ SECURITY WARNING ⚠️
This is a private version of Baileys with enhanced security features. This repository is NOT for public use and contains proprietary security measures. Unauthorized access or distribution is strictly prohibited.
Jika project ini membantu Anda, berikan ⭐ di GitHub!
Made with ❤️ by @neroxkira
Baileys adalah pustaka JavaScript yang ringan dan powerful untuk terhubung dengan WhatsApp Web API melalui WebSocket. Memungkinkan Anda membuat bot WhatsApp, automasi, dan integrasi dengan mudah tanpa perlu WhatsApp Business API yang berbayar!
PENTING: Proyek ini TIDAK berafiliasi dengan WhatsApp Inc. atau Meta Platforms Inc.
🚫 Dilarang untuk:
- Spam massal
- Stalking atau harassment
- Melanggar Terms of Service WhatsApp
- Aktivitas ilegal lainnya
⚖️ Segala bentuk penyalahgunaan adalah tanggung jawab pengguna sepenuhnya.
1# NPM 2npm install neroxbails 3 4# Yarn 5yarn add neroxbails 6 7# PNPM 8pnpm add neroxbails
1import makeWASocket, { Browsers } from 'neroxbails' 2 3const socket = makeWASocket({ 4 browser: Browsers.ubuntu('Safari'), 5 printQRInTerminal: true 6}) 7 8console.log('🔍 Scan QR code di terminal untuk login!')
1const { default: makeWASocket, Browsers } = require('neroxbails') 2 3const socket = makeWASocket({ 4 browser: Browsers.ubuntu('Safari'), 5 printQRInTerminal: true 6}) 7 8console.log('🔍 Scan QR code di terminal untuk login!')
⚠️ Catatan: Pastikan
package.json
TIDAK mengandung"type": "module"
untuk CommonJS
1import makeWASocket from 'neroxbails' 2 3const socket = makeWASocket({ 4 printQRInTerminal: false 5}) 6 7// Login tanpa scan QR code 8if (!socket.authState.creds.registered) { 9 const phoneNumber = '628123456789' // Nomor tanpa + atau - 10 const pairingCode = await socket.requestPairingCode(phoneNumber) 11 12 console.log('🔢 Kode Pairing:', pairingCode) 13 console.log('📱 Masukkan kode di WhatsApp > Linked Devices > Link a Device') 14}
1socket.ev.on('messages.upsert', ({ messages }) => { 2 const message = messages[0] 3 4 if (!message.message) return 5 6 console.log('📨 Pesan baru:', message.message) 7 8 // Balas pesan otomatis 9 if (message.message.conversation === 'ping') { 10 socket.sendMessage(message.key.remoteJid, { text: '🏓 pong!' }) 11 } 12})
1socket.ev.on('connection.update', ({ connection, lastDisconnect }) => { 2 if (connection === 'close') { 3 console.log('❌ Koneksi terputus. Reconnecting...') 4 // Logic untuk reconnect otomatis 5 } else if (connection === 'open') { 6 console.log('✅ Berhasil terhubung ke WhatsApp!') 7 } else if (connection === 'connecting') { 8 console.log('🔄 Sedang menghubungkan...') 9 } 10})
1import makeWASocket, { useMultiFileAuthState } from 'neroxbails' 2 3// Load session dari folder 4const { state, saveCreds } = await useMultiFileAuthState('./auth_session') 5 6const socket = makeWASocket({ 7 auth: state, 8 printQRInTerminal: true 9}) 10 11// Auto save credentials 12socket.ev.on('creds.update', saveCreds) 13 14console.log('💾 Session akan tersimpan otomatis')
1import fs from 'fs' 2 3// Kirim gambar 4await socket.sendMessage(chatId, { 5 image: fs.readFileSync('./gambar.jpg'), 6 caption: '🖼️ Ini adalah gambar' 7}) 8 9// Kirim video 10await socket.sendMessage(chatId, { 11 video: fs.readFileSync('./video.mp4'), 12 caption: '🎬 Video keren!' 13}) 14 15// Kirim dokumen 16await socket.sendMessage(chatId, { 17 document: fs.readFileSync('./dokumen.pdf'), 18 mimetype: 'application/pdf', 19 fileName: 'Document.pdf' 20})
1// Pesan dengan format 2await socket.sendMessage(chatId, { 3 text: `*Halo!* 👋 4 5_Ini adalah pesan dengan format:_ 6• Poin 1 7• Poin 2 8• Poin 3 9 10~Text tercoret~ 11\`\`\`javascript 12console.log("Code block") 13\`\`\` 14 15Kunjungi: https://github.com/neroxkira` 16})
1// Buat grup baru 2const group = await socket.groupCreate('Nama Grup 🚀', ['628xxx', '629xxx']) 3console.log('📱 Grup dibuat:', group.id) 4 5// Tambah anggota 6await socket.groupParticipantsUpdate(groupId, ['628xxx'], 'add') 7 8// Hapus anggota 9await socket.groupParticipantsUpdate(groupId, ['628xxx'], 'remove') 10 11// Jadikan admin 12await socket.groupParticipantsUpdate(groupId, ['628xxx'], 'promote') 13 14// Update info grup 15await socket.groupUpdateDescription(groupId, 'Deskripsi grup baru 📝')
1import NodeCache from 'node-cache' 2 3const groupCache = new NodeCache({ 4 stdTTL: 5 * 60, // 5 menit 5 useClones: false 6}) 7 8const socket = makeWASocket({ 9 cachedGroupMetadata: async (jid) => groupCache.get(jid) 10}) 11 12// Auto update cache 13socket.ev.on('groups.update', async ([event]) => { 14 const metadata = await socket.groupMetadata(event.id) 15 groupCache.set(event.id, metadata) 16}) 17 18socket.ev.on('group-participants.update', async (event) => { 19 const metadata = await socket.groupMetadata(event.id) 20 groupCache.set(event.id, metadata) 21})
1const socket = makeWASocket({ 2 browser: Browsers.ubuntu('Safari'), // Penting untuk full history 3 syncFullHistory: true, // Download semua riwayat chat 4 fireInitQueries: true, 5})
1import makeWASocket, { 2 Browsers, 3 useMultiFileAuthState, 4 fetchLatestBaileysVersion 5} from 'neroxbails' 6 7const { version } = await fetchLatestBaileysVersion() 8const { state, saveCreds } = await useMultiFileAuthState('./auth') 9 10const socket = makeWASocket({ 11 version, 12 auth: state, 13 browser: Browsers.ubuntu('Safari'), 14 15 // Koneksi 16 connectTimeoutMs: 20000, 17 defaultQueryTimeoutMs: 20000, 18 keepAliveIntervalMs: 10000, 19 20 // QR & Pairing 21 printQRInTerminal: true, 22 qrTimeout: 40000, 23 24 // Performance 25 syncFullHistory: true, 26 markOnlineOnConnect: false, 27 emitOwnEvents: false, 28 29 // Media 30 generateHighQualityLinkPreview: true, 31 linkPreviewImageThumbnailWidth: 120, 32 33 // Custom functions 34 getMessage: async (key) => { 35 // Return message dari database Anda 36 return await getMessageFromDB(key) 37 } 38}) 39 40socket.ev.on('creds.update', saveCreds)
connection.update
untuk auto reconnectMasalah | Solusi |
---|---|
QR Code tidak muncul | Cek koneksi internet & pastikan printQRInTerminal: true |
Koneksi sering putus | Gunakan keepAliveIntervalMs dan implement auto-reconnect |
Session hilang | Backup folder auth_session secara berkala |
Pesan tidak terkirim | Cek format remoteJid dan pastikan nomor valid |
Error "Cannot find module" | Install ulang dependencies dengan npm install |
1import pino from 'pino' 2 3const socket = makeWASocket({ 4 logger: pino({ level: 'debug' }), 5 printQRInTerminal: true 6})
Kontribusi sangat diterima! Silakan:
git checkout -b feature/AmazingFeature
)git commit -m 'Add some AmazingFeature'
)git push origin feature/AmazingFeature
)Distributed unter der MIT License. Lihat LICENSE
file untuk informasi lebih lanjut.
[!IMPORTANT]
Daftar lengkap event tersedia di sini.
Sangat penting untuk memahami setiap event yang bisa digunakan.
Contoh penggunaan listener untuk menangani pesan masuk:
1import makeWASocket from 'neroxbails' 2 3const sock = makeWASocket() 4 5sock.ev.on('messages.upsert', ({ messages }) => { 6 console.log('Pesan diterima:', messages) 7})
Baileys menggunakan sistem EventEmitter untuk menangani interaksi WhatsApp secara real-time.
Semua event yang terjadi saat koneksi aktif akan dipancarkan melalui sock.ev.on(...)
, dan kamu bisa menangkap serta meresponsnya sesuai kebutuhan bot kamu.
[!IMPORTANT]
Daftar lengkap event tersedia di sini.
Disarankan untuk memahami struktur tiap event agar integrasi kamu lebih stabil dan efisien.
1sock.ev.on('messages.upsert', async ({ messages, type }) => { 2 const msg = messages[0] 3 if (!msg.message) return 4 console.log('Pesan diterima:', msg.message) 5})
type
bisa bernilai notify
, append
, replace
, atau remove
.type === 'notify'
untuk pesan baru yang masuk.1sock.ev.on('connection.update', ({ connection, lastDisconnect }) => { 2 if (connection === 'close') { 3 console.log('Koneksi terputus.') 4 } else if (connection === 'open') { 5 console.log('Terhubung ke WhatsApp!') 6 } 7})
connection === 'close'
, Kamu dapat mencoba reconnect otomatis.1sock.ev.on('group-participants.update', async ({ id, participants, action }) => { 2 if (action === 'add') { 3 console.log('Anggota baru masuk:', participants) 4 } else if (action === 'remove') { 5 console.log('Anggota keluar:', participants) 6 } 7})
id
: JID grupparticipants
: array nomor yang terlibataction
: 'add' | 'remove' | 'promote' | 'demote'
1sock.ev.on('groups.update', async (updates) => { 2 for (let group of updates) { 3 console.log('Grup diperbarui:', group) 4 } 5})
messages.update
digunakan untuk mendeteksi status pesan seperti dibaca, diterima, atau gagal.messages.reaction
digunakan untuk menangkap reaksi (emoji) pada pesan kamu.[!TIP]
Baileys tidak menyimpan cache pesan secara default.
Untuk menangani event dengan akurat (seperti retry atau polling), gunakangetMessage()
bersamastore
.
Jika kamu butuh event tambahan seperti reaction, presence, atau call offer, tinggal tambahkan listener-nya sesuai struktur BaileysEventMap.
Tentu kamu tidak ingin terus-menerus memindai QR code setiap kali ingin terkoneksi.
Kamu bisa menyimpan kredensial dan menggunakannya kembali saat login berikutnya:
1import makeWASocket, { useMultiFileAuthState } from 'neroxbails' 2 3const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys') 4 5// Akan menggunakan kredensial yang tersedia untuk koneksi ulang 6// Jika kredensial valid ditemukan, akan langsung login tanpa QR 7const sock = makeWASocket({ auth: state }) 8 9// Fungsi ini akan dipanggil setiap kali kredensial diperbarui 10sock.ev.on('creds.update', saveCreds)
[!IMPORTANT]
useMultiFileAuthState
adalah fungsi utilitas untuk menyimpan state autentikasi dalam satu folder.
Fungsi ini juga dapat dijadikan dasar untuk menulis sistem autentikasi dan penyimpanan kunci pada database SQL atau NoSQL — sangat direkomendasikan untuk sistem berskala produksi.
auth_info_baileys
?Folder tersebut akan berisi beberapa file .json
seperti:
creds.json
— informasi kredensial utamakeys/
— berisi subfile kunci Signal: pre-keys, session, senderKey, dll.Folder ini jangan pernah dimodifikasi atau dihapus secara manual.
Perlakukan seperti file token yang sangat sensitif.
Jika folder auth_info_baileys
dihapus:
Backup sangat disarankan jika kamu mengelola sesi penting.
auth_info_baileys
secara utuh..gitignore
agar folder ini tidak ikut di-push ke GitHub:
auth_info_baileys/
Jika kamu mengelola banyak sesi pengguna (multi-client), buat direktori penyimpanan berdasarkan ID pengguna:
1const { state, saveCreds } = await useMultiFileAuthState(`./sessions/${userId}`)
Dengan cara ini, kamu bisa memisahkan sesi tiap user tanpa saling bentrok.
Rekomendasi: kombinasikan dengan database seperti MongoDB/Redis untuk mencatat mapping antara userId dan path session-nya.
[!NOTE]
Contoh ini juga sudah mencakup penyimpanan kredensial secara otomatis
1import makeWASocket, { DisconnectReason, useMultiFileAuthState } from 'neroxbails' 2import { Boom } from '@hapi/boom' 3 4async function connectToWhatsApp () { 5 const { state, saveCreds } = await useMultiFileAuthState('./auth_info_baileys') 6 7 const sock = makeWASocket({ 8 auth: state, 9 printQRInTerminal: true 10 }) 11 12 sock.ev.on('connection.update', (update) => { 13 const { connection, lastDisconnect } = update 14 15 if (connection === 'close') { 16 const shouldReconnect = (lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut 17 console.log('Koneksi terputus karena', lastDisconnect.error, ', mencoba sambung ulang:', shouldReconnect) 18 19 if (shouldReconnect) { 20 connectToWhatsApp() 21 } 22 } else if (connection === 'open') { 23 console.log('Koneksi berhasil dibuka') 24 } 25 }) 26 27 sock.ev.on('messages.upsert', async (event) => { 28 for (const m of event.messages) { 29 console.log(JSON.stringify(m, undefined, 2)) 30 31 console.log('Membalas ke', m.key.remoteJid) 32 await sock.sendMessage(m.key.remoteJid!, { text: 'Hello World' }) 33 } 34 }) 35 36 // Menyimpan kredensial setiap kali diperbarui 37 sock.ev.on('creds.update', saveCreds) 38} 39 40connectToWhatsApp()
useSingleFileAuthState
dan useMongoFileAuthState
1import makeWASocket, { 2 useSingleFileAuthState, 3 useMongoFileAuthState 4} from 'neroxbails' 5 6// Autentikasi menggunakan file tunggal (Single File Auth) 7const { state, saveState } = await useSingleFileAuthState('./auth_info_baileys.json') 8const sock = makeWASocket({ 9 auth: state, 10 printQRInTerminal: true 11}) 12 13sock.ev.on('creds.update', saveState)
1// Autentikasi menggunakan MongoDB 2import { MongoClient } from 'mongodb' 3 4const connectAuth = async () => { 5 const client = new MongoClient('mongodb://localhost:27017') 6 await client.connect() 7 8 console.log('Berhasil terhubung ke MongoDB') 9 10 const collection = client.db('neroxbails').collection('sessions') 11 const { state, saveCreds } = await useMongoFileAuthState(collection) 12 13 const sock = makeWASocket({ 14 auth: state, 15 printQRInTerminal: true 16 }) 17 18 sock.ev.on('creds.update', saveCreds) 19} 20 21connectAuth()
[!IMPORTANT]
Dalam eventmessages.upsert
, sangat disarankan menggunakan perulanganfor (const message of event.messages)
untuk menangani semua pesan dalam array secara individual.
Hal ini mencegah pesan terlewat dan memudahkan logging/debugging.
[!TIP]
Kamu bisa menggabungkan pendekatan penyimpanan sesi (MultiFile
,SingleFile
, atauMongoDB
) dengan sistem login berbasis ID pengguna, sehingga mendukung banyak akun secara paralel.
Secara default, suara polling di WhatsApp dienkripsi dan diproses melalui event messages.update
.
1import pino from 'pino' 2import { 3 makeInMemoryStore, 4 getAggregateVotesInPollMessage 5} from 'neroxbails' 6 7const logger = pino({ timestamp: () => `,"time":"${new Date().toJSON()}"` }).child({ class: 'neroxbails' }) 8logger.level = 'fatal' 9const store = makeInMemoryStore({ logger }) 10 11async function getMessage(key) { 12 if (store) { 13 const msg = await store.loadMessage(key.remoteJid, key.id) 14 return msg?.message 15 } 16 return { 17 conversation: 'Polling Tidak Ditemukan' 18 } 19} 20 21sock.ev.on('messages.update', async (chatUpdate) => { 22 for (const { key, update } of chatUpdate) { 23 if (update.pollUpdates && key.fromMe) { 24 const pollCreation = await getMessage(key) 25 if (pollCreation) { 26 const pollUpdate = await getAggregateVotesInPollMessage({ 27 message: pollCreation, 28 pollUpdates: update.pollUpdates 29 }) 30 31 const toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name 32 if (!toCmd) return 33 34 console.log('Pilihan terpilih:', toCmd) 35 // Tambahkan aksi lanjutan di sini 36 } 37 } 38 } 39})
store.loadMessage(jid, id)
digunakan untuk mengambil ulang isi pesan polling (karena hasil polling hanya berisi update, bukan isi awal).getAggregateVotesInPollMessage()
menggabungkan seluruh pollUpdates
dan menghasilkan daftar suara lengkap.getMessage()
yang valid. Jika kamu tidak menyimpan store, dekripsi suara tidak akan berhasil.[!TIP]
Untuk polling publik, kamu tidak perlu key khusus.
Tapi untuk polling private (atau jika polling berasal dari orang lain), pastikan kamu menyimpan pesan awalnya menggunakan store atau log pesan masuk.
connection.update
akan dipicu.'open'
atau 'close'
.messaging-history.set
[!IMPORTANT]
Untuk menangani polling, kamu wajib mengaturgetMessage()
di konfigurasimakeWASocket()
.
Ini memastikan Baileys bisa mendekripsi hasil polling dengan benar.
1const sock = makeWASocket({ 2 auth: state, 3 getMessage: async (key) => await getMessage(key) 4})
Baileys tidak menyediakan sistem penyimpanan (storage) bawaan untuk chat, kontak, atau pesan.
Namun, tersedia implementasi sederhana menggunakan in-memory store. Store ini akan memantau pembaruan chat, pesan baru, dan perubahan lainnya agar data kamu tetap mutakhir.
[!IMPORTANT]
Sangat disarankan untuk membangun sistem penyimpanan sendiri.
Menyimpan seluruh riwayat chat di RAM akan memakan memori yang besar dan tidak efisien untuk jangka panjang.
1import makeWASocket, { makeInMemoryStore } from 'neroxbails' 2 3// Store akan menyimpan data koneksi WhatsApp dalam memori 4const store = makeInMemoryStore({}) 5 6// Membaca data dari file (jika tersedia) 7store.readFromFile('./baileys_store.json') 8 9// Menyimpan state ke file setiap 10 detik 10setInterval(() => { 11 store.writeToFile('./baileys_store.json') 12}, 10_000) 13 14const sock = makeWASocket({}) 15 16// Store akan mulai mendengarkan event dari socket ini 17// Jika socket diganti, store masih bisa digunakan ulang 18store.bind(sock.ev) 19 20sock.ev.on('chats.upsert', () => { 21 // Akses semua chat tersimpan 22 console.log('Data chat diterima:', store.chats.all()) 23}) 24 25sock.ev.on('contacts.upsert', () => { 26 // Akses semua kontak tersimpan 27 console.log('Kontak diperbarui:', Object.values(store.contacts)) 28})
loadMessages
, loadMessage
, dan loadMessageFromContent
.Untuk sistem besar atau multi-user:
messages.upsert
, chats.upsert
, dan contacts.upsert
ke penyimpanan permanen.[!TIP]
Store ini sangat berguna untuk keperluan seperti:
- Menyimpan polling
- Retry pesan
- Melacak status kontak dan grup
- Menyediakan command
.listchat
,.listgroup
, dll. dengan data real-time
Jika kamu menggunakan custom getMessage()
, store ini juga dapat dijadikan referensi lokal untuk mendekripsi polling dan mengirim ulang pesan.
id
atau biasa disebut juga jid
adalah identitas WhatsApp dari seseorang atau grup yang menjadi tujuan pengiriman pesan.Format:
[kode negara][nomor telepon]@s.whatsapp.net
Contoh:
628123456789@s.whatsapp.net
Format:
[timestamp grup dibuat]-[random id]@g.us
Contoh:
1234567890-987654321@g.us
Format:
[timestamp]@broadcast
Contoh:
1685539347@broadcast
Format:
status@broadcast
Format:
[numeric id]@newsletter
Contoh:
120363025487665599@newsletter
TIP:
Kamu bisa mendapatkanjid
dari:
m.key.remoteJid
groupParticipantsUpdate
messages.upsert
, dll
CAUTION:
Jangan pernah mengubah formatjid
secara manual tanpa validasi.
Salah format bisa menyebabkan errorbad jid
atau pesan tidak terkirim.
Baileys menyediakan beberapa fungsi utilitas penting yang sangat membantu saat mengembangkan bot:
getContentType(message)
Mengembalikan jenis konten dari pesan (misalnya: imageMessage
, conversation
, buttonsMessage
, dll).
getDevice(jid)
Mengembalikan jenis perangkat yang digunakan pengirim (jika tersedia), contoh: Android, iPhone, Web.
makeCacheableSignalKeyStore(authState)
Membungkus SignalKeyStore menjadi versi yang lebih efisien dan bisa di-cache, untuk performa autentikasi yang lebih cepat.
downloadContentFromMessage(message, type)
Mengunduh media dari pesan (seperti gambar, video, dokumen).
type
bisa berupa 'image'
, 'video'
, 'audio'
, 'document'
, dll.
Contoh penggunaan:
1const stream = await downloadContentFromMessage(msg.imageMessage, 'image') 2const buffer = Buffer.concat([]) 3for await (const chunk of stream) buffer.push(chunk)
[!NOTE]
Sebagian besar fungsi utilitas tidak dipanggil otomatis — Kamu harus menggunakannya sesuai kebutuhan, terutama saat menangani pesan media, format jid, atau decrypt konten.
sendMessage()
.Contoh:
1const jid = '628XXXXXXXXX@s.whatsapp.net' // tujuan 2const content = { text: 'Halo, ini pesan dari bot!' } // isi pesan 3const options = { quoted: null } // opsi tambahan (misalnya: balasan) 4 5await sock.sendMessage(jid, content, options)
1await sock.sendMessage(jid, { text: 'Halo dunia' })
1await sock.sendMessage(jid, { text: 'Ini balasan pesan kamu' }, { quoted: message })
Gunakan @nomor
dalam teks dan sertakan mentions
di payload.
1await sock.sendMessage( 2 jid, 3 { 4 text: '@628XXXXXXXXX Hai Nerox!', 5 mentions: ['628XXXXXXXXX@s.whatsapp.net'] 6 } 7)
Butuh objek pesan (WAMessage
). Bisa didapat dari store atau pesan sebelumnya.
1const msg = getMessageFromStore() // Kamu buat sendiri sesuai struktur 2await sock.sendMessage(jid, { forward: msg, force: true })
1await sock.sendMessage(jid, { 2 text: 'Pilih salah satu:', 3 buttons: [ 4 { buttonId: 'btn_1', buttonText: { displayText: 'Tombol 1' }, type: 1 }, 5 { buttonId: 'btn_2', buttonText: { displayText: 'Tombol 2' }, type: 1 } 6 ], 7 footer: 'Contoh footer' 8})
1await sock.sendMessage(jid, { 2 text: 'Pilih dari daftar berikut:', 3 footer: 'Contoh footer', 4 title: 'Judul Daftar', 5 buttonText: 'Buka List', 6 sections: [ 7 { 8 title: 'Menu 1', 9 rows: [ 10 { title: 'Opsi A', rowId: 'pilih_a' }, 11 { title: 'Opsi B', rowId: 'pilih_b' } 12 ] 13 }, 14 { 15 title: 'Menu 2', 16 rows: [ 17 { title: 'Opsi C', rowId: 'pilih_c' } 18 ] 19 } 20 ] 21})
[!TIP]
Kamu bisa menggabungkan semua jenis pesan dengan opsi tambahan sepertiquoted
,mentions
,ephemeralExpiration
, dan lainnya untuk membuat interaksi bot yang lebih kaya dan interaktif.
1await sock.sendMessage( 2 jid, 3 { 4 location: { 5 degreesLatitude: -6.200000, 6 degreesLongitude: 106.816666 7 } 8 } 9)
1await sock.sendMessage( 2 jid, 3 { 4 location: { 5 degreesLatitude: -6.200000, 6 degreesLongitude: 106.816666 7 }, 8 live: true 9 } 10)
1const vcard = 2 'BEGIN:VCARD\n' + 3 'VERSION:3.0\n' + 4 'FN:Nerox\n' + 5 'ORG:ZERO DEV;\n' + 6 'TEL;type=CELL;type=VOICE;waid=628XXXXXXXXX:+62 831-4366-3697\n' + 7 'END:VCARD' 8 9await sock.sendMessage( 10 jid, 11 { 12 contacts: { 13 displayName: 'Nerox', 14 contacts: [{ vcard }] 15 } 16 } 17)
key
dari pesan yang ingin diberikan reaksi.key
bisa diambil dari store atau menggunakan WAMessageKey.1await sock.sendMessage( 2 jid, 3 { 4 react: { 5 text: '🔥', // gunakan string kosong '' untuk menghapus reaksi 6 key: message.key 7 } 8 } 9)
key
dari pesan yang ingin dipin.Durasi | Detik |
---|---|
24 jam | 86.400 |
7 hari | 604.800 |
30 hari | 2.592.000 |
1await sock.sendMessage( 2 jid, 3 { 4 pin: { 5 type: 1, // 1 untuk pin, 2 untuk unpin 6 time: 86400, 7 key: message.key 8 } 9 } 10)
1await sock.sendMessage( 2 jid, 3 { 4 keep: { 5 key: message.key, 6 type: 1 // 1 = simpan, 2 = batalkan simpan 7 } 8 } 9)
1await sock.sendMessage( 2 jid, 3 { 4 poll: { 5 name: 'Polling Hari Ini', 6 values: ['Opsi A', 'Opsi B', 'Opsi C'], 7 selectableCount: 1, 8 toAnnouncementGroup: false 9 } 10 } 11)
1await sock.sendMessage( 2 jid, 3 { 4 pollResult: { 5 name: 'Hasil Polling', 6 values: [ 7 ['Opsi A', 120], 8 ['Opsi B', 350], 9 ['Opsi C', 75] 10 ] 11 } 12 } 13)
1await sock.sendMessage( 2 jid, 3 { 4 call: { 5 name: 'Hay', 6 type: 1 // 1 = suara, 2 = video 7 } 8 } 9)
1await sock.sendMessage( 2 jid, 3 { 4 event: { 5 isCanceled: false, // true jika dibatalkan 6 name: 'Liburan Bareng!', 7 description: 'Siapa yang mau ikut?', 8 location: { 9 degreesLatitude: 24.121231, 10 degreesLongitude: 55.1121221, 11 name: 'Pantai Sanur' 12 }, 13 startTime: 1715000000, 14 endTime: 1715086400, 15 extraGuestsAllowed: true // apakah boleh bawa tamu 16 } 17 } 18)
1await sock.sendMessage( 2 jid, 3 { 4 order: { 5 orderId: '574XXX', 6 thumbnail: 'your_thumbnail', 7 itemCount: 3, 8 status: 'INQUIRY', // atau ACCEPTED / DECLINED 9 surface: 'CATALOG', 10 message: 'Deskripsi pesanan', 11 orderTitle: 'Judul Pesanan', 12 sellerJid: '628xxx@s.whatsapp.net', 13 token: 'your_token', 14 totalAmount1000: '150000', 15 totalCurrencyCode: 'IDR' 16 } 17 } 18)
1await sock.sendMessage( 2 jid, 3 { 4 product: { 5 productImage: { 6 url: 'https://your-image.url/image.jpg' 7 }, 8 productId: 'PRD-001', 9 title: 'Produk Spesial', 10 description: 'Deskripsi lengkap produk kamu di sini', 11 currencyCode: 'IDR', 12 priceAmount1000: '50000', 13 retailerId: 'nerox', // opsional 14 url: 'https://linkproduk.com', // opsional 15 productImageCount: 1, 16 firstImageId: 'img-001', // opsional 17 salePriceAmount1000: '45000', 18 signedUrl: 'https://your.signed.url' // opsional 19 }, 20 businessOwnerJid: '628xxx@s.whatsapp.net' 21 } 22)
1await sock.sendMessage( 2 jid, 3 { 4 payment: { 5 note: 'Hi!', 6 currency: 'IDR', 7 offset: 0, 8 amount: '10000', 9 expiry: 0, 10 from: '628xxxx@s.whatsapp.net', 11 image: { 12 placeholderArgb: '#222222', 13 textArgb: '#FFFFFF', 14 subtextArgb: '#AAAAAA' 15 } 16 } 17 } 18)
1await sock.sendMessage( 2 jid, 3 { 4 paymentInvite: { 5 type: 1, // 1 = request, 2 = accept, 3 = decline (sesuaikan sesuai konteks) 6 expiry: 0 7 } 8 } 9)
1await sock.sendMessage( 2 jid, 3 { 4 adminInvite: { 5 jid: '123xxx@newsletter', 6 name: 'Channel Nerox', 7 caption: 'Tolong jadi admin channel saya ya!', 8 expiration: 86400, // dalam detik (24 jam) 9 jpegThumbnail: Buffer // opsional, bisa berupa buffer gambar 10 } 11 } 12)
1await sock.sendMessage( 2 jid, 3 { 4 groupInvite: { 5 jid: '123xxx@g.us', 6 name: 'Grup Dev Nerox', 7 caption: 'Ayo gabung ke grup WhatsApp kami!', 8 code: 'ABCD1234', // kode undangan grup 9 expiration: 86400, 10 jpegThumbnail: Buffer // opsional 11 } 12 } 13)
1await sock.sendMessage( 2 jid, 3 { 4 sharePhoneNumber: {} 5 } 6)
1await sock.sendMessage( 2 jid, 3 { 4 requestPhoneNumber: {} 5 } 6)
1await sock.sendMessage( 2 jid, 3 { 4 buttonReply: { 5 name: 'Hai', 6 description: 'Deskripsi pilihan', 7 rowId: 'pilihan_1' 8 }, 9 type: 'list' 10 } 11)
1await sock.sendMessage( 2 jid, 3 { 4 buttonReply: { 5 displayText: 'Halo', 6 id: 'plain_id' 7 }, 8 type: 'plain' 9 } 10)
1await sock.sendMessage( 2 jid, 3 { 4 buttonReply: { 5 displayText: 'Pilih Saya', 6 id: 'template_id', 7 index: 1 8 }, 9 type: 'template' 10 } 11)
1await sock.sendMessage( 2 jid, 3 { 4 buttonReply: { 5 body: 'Mau pilih yang mana?', 6 nativeFlows: { 7 name: 'menu_options', 8 paramsJson: JSON.stringify({ id: 'menu_1', description: 'Deskripsi interaktif' }), 9 version: 1 // bisa juga 2 atau 3 10 } 11 }, 12 type: 'interactive' 13 } 14)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Ini adalah pesan tombol!', 5 caption: 'Gunakan jika memakai gambar/video', 6 footer: 'Salam dari Nerox!', 7 buttons: [ 8 { 9 buttonId: 'btn1', 10 buttonText: { displayText: 'Tombol 1' } 11 }, 12 { 13 buttonId: 'btn2', 14 buttonText: { displayText: 'Tombol 2' } 15 }, 16 { 17 buttonId: 'btn3', 18 buttonText: { displayText: 'Tombol 3' } 19 } 20 ] 21 } 22)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Ini adalah daftar pilihan!', 5 footer: 'Dipersembahkan oleh Nerox', 6 title: 'Judul Daftar Pilihan', 7 buttonText: 'Klik untuk melihat opsi', 8 sections: [ 9 { 10 title: 'Bagian 1', 11 rows: [ 12 { title: 'Opsi 1', rowId: 'opsi1' }, 13 { title: 'Opsi 2', rowId: 'opsi2', description: 'Deskripsi Opsi 2' } 14 ] 15 }, 16 { 17 title: 'Bagian 2', 18 rows: [ 19 { title: 'Opsi 3', rowId: 'opsi3' }, 20 { title: 'Opsi 4', rowId: 'opsi4', description: 'Deskripsi Opsi 4' } 21 ] 22 } 23 ] 24 } 25)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Ini adalah daftar produk!', 5 footer: 'Dikirim oleh Nerox', 6 title: 'Pilih Produk Unggulan', 7 buttonText: 'Lihat Daftar Produk', 8 productList: [ 9 { 10 title: 'Kategori Produk Utama', 11 products: [ 12 { productId: '1234' }, 13 { productId: '5678' } 14 ] 15 } 16 ], 17 businessOwnerJid: '628xxx@s.whatsapp.net', 18 thumbnail: 'https://example.jpg' // atau buffer gambar 19 } 20)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Isi Utama Pesan', 5 title: 'Judul Utama', 6 subtile: 'Subjudul Opsional', 7 footer: 'Footer Pesan', 8 9 cards: [ 10 { 11 image: { url: 'https://example.jpg' }, // bisa juga Buffer 12 title: 'Judul Kartu', 13 body: 'Isi Konten Kartu', 14 footer: 'Footer Kartu', 15 buttons: [ 16 { 17 name: 'quick_reply', 18 buttonParamsJson: JSON.stringify({ 19 display_text: 'Tombol Cepat', 20 id: 'ID_TOMBOL_1' 21 }) 22 }, 23 { 24 name: 'cta_url', 25 buttonParamsJson: JSON.stringify({ 26 display_text: 'Kunjungi Website', 27 url: 'https://www.example.com' 28 }) 29 } 30 ] 31 }, 32 { 33 video: { url: 'https://example.mp4' }, // bisa juga Buffer video 34 title: 'Judul Kartu Video', 35 body: 'Deskripsi Konten', 36 footer: 'Footer Kartu', 37 buttons: [ 38 { 39 name: 'quick_reply', 40 buttonParamsJson: JSON.stringify({ 41 display_text: 'Respon Cepat', 42 id: 'ID_TOMBOL_2' 43 }) 44 }, 45 { 46 name: 'cta_url', 47 buttonParamsJson: JSON.stringify({ 48 display_text: 'Lihat Selengkapnya', 49 url: 'https://www.example.com' 50 }) 51 } 52 ] 53 } 54 ] 55 } 56)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Ini adalah pesan template tombol!', 5 footer: 'Dikirim oleh Nerox', 6 templateButtons: [ 7 { 8 index: 1, 9 urlButton: { 10 displayText: 'Ikuti Channel', 11 url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y' 12 } 13 }, 14 { 15 index: 2, 16 callButton: { 17 displayText: 'Hubungi Saya!', 18 phoneNumber: '628xxxx' 19 } 20 }, 21 { 22 index: 3, 23 quickReplyButton: { 24 displayText: 'Balas Cepat', 25 id: 'id-button-reply' 26 } 27 } 28 ] 29 } 30)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Ini pesan interaktif!', 5 title: 'Hai!', 6 subtitle: 'Subjudul di sini', 7 footer: 'Dikirim oleh Nerox', 8 interactiveButtons: [ 9 { 10 name: 'quick_reply', 11 buttonParamsJson: JSON.stringify({ 12 display_text: 'Klik Aku!', 13 id: 'id_kamu' 14 }) 15 }, 16 { 17 name: 'cta_url', 18 buttonParamsJson: JSON.stringify({ 19 display_text: 'Kunjungi Channel', 20 url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y', 21 merchant_url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y' 22 }) 23 }, 24 { 25 name: 'cta_copy', 26 buttonParamsJson: JSON.stringify({ 27 display_text: 'Salin Link', 28 copy_code: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y' 29 }) 30 }, 31 { 32 name: 'cta_call', 33 buttonParamsJson: JSON.stringify({ 34 display_text: 'Telepon Saya', 35 phone_number: '628xxxx' 36 }) 37 }, 38 { 39 name: 'single_select', 40 buttonParamsJson: JSON.stringify({ 41 title: 'Pilih Opsi', 42 sections: [ 43 { 44 title: 'Pilihan Utama', 45 highlight_label: 'Rekomendasi', 46 rows: [ 47 { 48 header: 'Header 1', 49 title: 'Opsi 1', 50 description: 'Deskripsi 1', 51 id: 'id1' 52 }, 53 { 54 header: 'Header 2', 55 title: 'Opsi 2', 56 description: 'Deskripsi 2', 57 id: 'id2' 58 } 59 ] 60 } 61 ] 62 }) 63 } 64 ] 65 } 66)
1await sock.sendMessage( 2 jid, 3 { 4 image: { url: 'https://example.jpg' }, 5 caption: 'Isi Pesan', 6 title: 'Judul', 7 subtitle: 'Subjudul', 8 footer: 'Footer', 9 interactiveButtons: [ /* tombol seperti di atas */ ], 10 hasMediaAttachment: false 11 } 12)
1await sock.sendMessage( 2 jid, 3 { 4 video: { url: 'https://example.mp4' }, 5 caption: 'Isi Video', 6 title: 'Judul', 7 subtitle: 'Subjudul', 8 footer: 'Footer', 9 interactiveButtons: [ /* tombol seperti di atas */ ], 10 hasMediaAttachment: false 11 } 12)
1await sock.sendMessage( 2 jid, 3 { 4 document: { url: 'https://example.jpg' }, 5 mimetype: 'image/jpeg', 6 jpegThumbnail: await sock.resize('https://example.jpg', 320, 320), 7 caption: 'Isi Dokumen', 8 title: 'Judul', 9 subtitle: 'Subjudul', 10 footer: 'Footer', 11 interactiveButtons: [ /* tombol seperti di atas */ ], 12 hasMediaAttachment: false 13 } 14)
1await sock.sendMessage( 2 jid, 3 { 4 location: { 5 degreesLatitude: -6.2, 6 degreesLongitude: 106.8, 7 name: 'Nerox' 8 }, 9 caption: 'Ayo ke sini!', 10 title: 'Lokasi Tujuan', 11 subtitle: 'Subjudul Lokasi', 12 footer: 'Peta lokasi', 13 interactiveButtons: [ /* tombol seperti di atas */ ], 14 hasMediaAttachment: false 15 } 16)
1await sock.sendMessage( 2 jid, 3 { 4 product: { 5 productImage: { url: 'https://example.jpg' }, 6 productId: '836xxx', 7 title: 'Produk Pilihan', 8 description: 'Deskripsi produk terbaik', 9 currencyCode: 'IDR', 10 priceAmount1000: '283000', 11 retailerId: 'Nerox', 12 url: 'https://example.com', 13 productImageCount: 1 14 }, 15 businessOwnerJid: '628xxx@s.whatsapp.net', 16 caption: 'Produk baru tersedia!', 17 title: 'Nama Produk', 18 subtitle: 'Subjudul Produk', 19 footer: 'Info Produk', 20 interactiveButtons: [ /* tombol seperti di atas */ ], 21 hasMediaAttachment: false 22 } 23)
1await sock.sendStatusMentions( 2 jid, 3 { 4 image: { 5 url: 'https://example.com.jpg' 6 }, 7 caption: 'Halo dari Nerox!' 8 } 9)
Buffer
atau URL.1await sock.sendAlbumMessage( 2 jid, 3 [ 4 { 5 image: { url: 'https://example.jpg' }, 6 caption: 'Gambar 1' 7 }, 8 { 9 image: Buffer, 10 caption: 'Gambar 2' 11 }, 12 { 13 video: { url: 'https://example.mp4' }, 14 caption: 'Video 1' 15 }, 16 { 17 video: Buffer, 18 caption: 'Video 2' 19 } 20 ], 21 { 22 quoted: message, // opsional, untuk membalas pesan 23 delay: 2000 // jeda antar media (ms) 24 } 25)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Body pesan', 5 title: 'Judul Toko', 6 subtitle: 'Subjudul', 7 footer: 'Powered by Nerox', 8 shop: { 9 surface: 1, 10 id: 'https://example.com' 11 }, 12 viewOnce: true 13 } 14)
1await sock.sendMessage( 2 jid, 3 { 4 image: { url: 'https://example.jpg' }, 5 caption: 'Deskripsi produk', 6 title: 'Judul', 7 subtitle: 'Subjudul', 8 footer: 'Footer', 9 shop: { 10 surface: 1, 11 id: 'https://example.com' 12 }, 13 hasMediaAttachment: false, 14 viewOnce: true 15 } 16)
1await sock.sendMessage( 2 jid, 3 { 4 video: { url: 'https://example.mp4' }, 5 caption: 'Tonton videonya!', 6 title: 'Judul Video', 7 subtitle: 'Subjudul', 8 footer: 'Footer', 9 shop: { 10 surface: 1, 11 id: 'https://example.com' 12 }, 13 hasMediaAttachment: false, 14 viewOnce: true 15 } 16)
1await sock.sendMessage( 2 jid, 3 { 4 document: { url: 'https://example.jpg' }, 5 mimetype: 'image/jpeg', 6 jpegThumbnail: await sock.resize('https://example.jpg', 320, 320), 7 caption: 'Lampiran dokumen', 8 title: 'Judul', 9 subtitle: 'Subjudul', 10 footer: 'Footer', 11 shop: { 12 surface: 1, 13 id: 'https://example.com' 14 }, 15 hasMediaAttachment: false, 16 viewOnce: true 17 } 18)
1await sock.sendMessage( 2 jid, 3 { 4 location: { 5 degreesLatitude: -6.2000, 6 degreesLongitude: 106.8166, 7 name: 'Lokasi Toko' 8 }, 9 caption: 'Lihat lokasi kami!', 10 title: 'Judul Lokasi', 11 subtitle: 'Subjudul', 12 footer: 'Peta lokasi', 13 shop: { 14 surface: 1, 15 id: 'https://example.com' 16 }, 17 hasMediaAttachment: false, 18 viewOnce: true 19 } 20)
1await sock.sendMessage( 2 jid, 3 { 4 product: { 5 productImage: { url: 'https://example.jpg' }, 6 productId: '836xxx', 7 title: 'Nama Produk', 8 description: 'Deskripsi produk menarik', 9 currencyCode: 'IDR', 10 priceAmount1000: '283000', 11 retailerId: 'Nerox', 12 url: 'https://example.com', 13 productImageCount: 1 14 }, 15 businessOwnerJid: '628xxx@s.whatsapp.net', 16 caption: 'Lihat produk unggulan kami!', 17 title: 'Judul Produk', 18 subtitle: 'Subjudul Produk', 19 footer: 'Info produk', 20 shop: { 21 surface: 1, 22 id: 'https://example.com' 23 }, 24 hasMediaAttachment: false, 25 viewOnce: true 26 } 27)
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Isi pesan', 5 title: 'Judul Koleksi', 6 subtitle: 'Subjudul', 7 footer: 'Dari Nerox', 8 collection: { 9 bizJid: '628xxx@s.whatsapp.net', 10 id: 'https://example.com', 11 version: 1 12 }, 13 viewOnce: true 14 } 15)
1await sock.sendMessage( 2 jid, 3 { 4 image: { url: 'https://example.jpg' }, 5 caption: 'Koleksi Gambar', 6 title: 'Judul Koleksi', 7 subtitle: 'Subjudul', 8 footer: 'Katalog Nerox', 9 collection: { 10 bizJid: '628xxx@s.whatsapp.net', 11 id: 'https://example.com', 12 version: 1 13 }, 14 hasMediaAttachment: false, 15 viewOnce: true 16 } 17)
1await sock.sendMessage( 2 jid, 3 { 4 video: { url: 'https://example.mp4' }, 5 caption: 'Koleksi Video', 6 title: 'Judul Video', 7 subtitle: 'Subjudul', 8 footer: 'Video Katalog', 9 collection: { 10 bizJid: '628xxx@s.whatsapp.net', 11 id: 'https://example.com', 12 version: 1 13 }, 14 hasMediaAttachment: false, 15 viewOnce: true 16 } 17)
1await sock.sendMessage( 2 jid, 3 { 4 document: { url: 'https://example.jpg' }, 5 mimetype: 'image/jpeg', 6 jpegThumbnail: await sock.resize('https://example.jpg', 320, 320), 7 caption: 'Dokumen Katalog', 8 title: 'Judul Dokumen', 9 subtitle: 'Subjudul', 10 footer: 'Lampiran Koleksi', 11 collection: { 12 bizJid: '628xxx@s.whatsapp.net', 13 id: 'https://example.com', 14 version: 1 15 }, 16 hasMediaAttachment: false, 17 viewOnce: true 18 } 19)
1await sock.sendMessage( 2 jid, 3 { 4 location: { 5 degreesLatitude: -6.2, 6 degreesLongitude: 106.8, 7 name: 'Lokasi Bisnis' 8 }, 9 caption: 'Lihat lokasi koleksi', 10 title: 'Judul Lokasi', 11 subtitle: 'Subjudul', 12 footer: 'Lokasi Katalog', 13 collection: { 14 bizJid: '628xxx@s.whatsapp.net', 15 id: 'https://example.com', 16 version: 1 17 }, 18 hasMediaAttachment: false, 19 viewOnce: true 20 } 21)
1await sock.sendMessage( 2 jid, 3 { 4 product: { 5 productImage: { url: 'https://example.jpg' }, 6 productId: '836xxx', 7 title: 'Nama Produk', 8 description: 'Deskripsi produk', 9 currencyCode: 'IDR', 10 priceAmount1000: '283000', 11 retailerId: 'Nerox', 12 url: 'https://example.com', 13 productImageCount: 1 14 }, 15 businessOwnerJid: '628xxx@s.whatsapp.net', 16 caption: 'Koleksi Produk', 17 title: 'Judul', 18 subtitle: 'Subjudul', 19 footer: 'Produk Katalog', 20 collection: { 21 bizJid: '628xxx@s.whatsapp.net', 22 id: 'https://example.com', 23 version: 1 24 }, 25 hasMediaAttachment: false, 26 viewOnce: true 27 } 28)
1yarn add link-preview-js
1await sock.sendMessage( 2 jid, 3 { 4 text: 'Hai! Ini dikirim dari https://github.com/whiskeysockets/baileys' 5 } 6)
Mengirim media (gambar, video, audio, stiker) jauh lebih efisien dengan Baileys.
[!NOTE]
Kamu bisa menggunakanBuffer
,{ stream }
, atau{ url }
.
Lihat lebih lengkap di dokumentasi media
[!TIP]
Gunakan stream atau url langsung agar lebih hemat memori.
WhatsApp tidak mendukung file
.gif
, maka harus dikirim dalam bentuk.mp4
dengan flaggifPlayback: true
1await sock.sendMessage( 2 jid, 3 { 4 video: fs.readFileSync('Media/ma_gif.mp4'), 5 caption: 'Halo dari GIF!', 6 gifPlayback: true 7 } 8)
1await sock.sendMessage( 2 jid, 3 { 4 video: { url: './Media/ma_video.mp4' }, 5 caption: 'Ini videonya' 6 } 7)
1await sock.sendMessage( 2 jid, 3 { 4 video: { url: './Media/ma_video.mp4' }, 5 ptv: true 6 } 7)
Agar audio kompatibel di semua perangkat, sebaiknya gunakan
ffmpeg
dengan pengaturan berikut:
1ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
1await sock.sendMessage( 2 jid, 3 { 4 audio: { url: './Media/audio.ogg' }, 5 mimetype: 'audio/ogg; codecs=opus' 6 } 7)
1await sock.sendMessage( 2 jid, 3 { 4 image: { url: './Media/ma_img.png' }, 5 caption: 'Halo dari gambar!' 6 } 7)
Fitur View Once memungkinkan media hanya bisa dilihat satu kali.
1await sock.sendMessage( 2 jid, 3 { 4 image: { url: './Media/ma_img.png' }, 5 viewOnce: true, 6 caption: 'Media hanya bisa dilihat sekali' 7 } 8)
1const msg = await sock.sendMessage(jid, { text: 'Halo dunia' }) 2await sock.sendMessage(jid, { delete: msg.key })
Catatan:
Untuk menghapus pesan hanya untuk diri sendiri, gunakanchatModify
(lihat bagian Modifikasi Chat).
1await sock.sendMessage(jid, { 2 text: 'Teks yang sudah diperbarui di sini', 3 edit: response.key 4})
1yarn add jimp 2# atau 3yarn add sharp
ffmpeg
di sistem kamu.Contoh penggunaan otomatis biasanya tidak perlu kamu atur manual — Baileys akan meng-generate thumbnail bila dependensi sudah tersedia.
Jika kamu ingin menyimpan media yang diterima dari pengguna:
1import { createWriteStream } from 'fs' 2import { downloadMediaMessage, getContentType } from 'neroxbails' 3 4sock.ev.on('messages.upsert', async ({ messages }) => { 5let m = messages[0] 6if (!m.message) return // jika tidak ada media atau isi pesan 7 8let messageType = getContentType(m.message) // deteksi tipe pesan (image, video, audio, dll) 9 10if (messageType === 'imageMessage') { 11let stream = await downloadMediaMessage( 12m, 13'stream', // bisa juga 'buffer' kalau ingin langsung di-handle tanpa file 14{}, 15{ 16logger, 17reuploadRequest: sock.updateMediaMessage // agar bisa reupload jika file sudah tidak ada 18} 19) 20 21let file = createWriteStream('./downloaded-image.jpeg') 22stream.pipe(file) 23} 24})
Jika media sudah dihapus dari server WhatsApp, kamu bisa minta perangkat pengirim untuk melakukan reupload:
1await sock.updateMediaMessage(msg)
Fitur ini penting saat media gagal diunduh karena sudah tidak tersedia di server WhatsApp.
callId
dan callFrom
dari event call
.1await sock.rejectCall(callId, callFrom)
WAMessage
.1const key = { 2remoteJid: '628xxx@s.whatsapp.net', 3fromMe: false, 4id: 'ABCDEF123456' 5} 6 7// bisa juga array untuk banyak pesan sekaligus 8await sock.readMessages([key])
Kamu bisa mendapatkan
messageID
dari:
1let messageID = message.key.id
presence
bisa berupa:available
, unavailable
, composing
, recording
, paused
, dll.1await sock.sendPresenceUpdate('available', jid) // online 2await sock.sendPresenceUpdate('composing', jid) // mengetik 3await sock.sendPresenceUpdate('unavailable', jid) // offline
Catatan:
Jika kamu menggunakan WhatsApp Desktop secara bersamaan, maka WA tidak akan mengirim notifikasi ke perangkat lain.
Kalau kamu ingin tetap terima notifikasi di HP, kamu bisa set status bot jadi offline:
1await sock.sendPresenceUpdate('unavailable')
WhatsApp menggunakan komunikasi terenkripsi untuk memperbarui status chat atau aplikasi. Beberapa fitur modifikasi sudah didukung oleh Baileys, dan bisa kamu kirim seperti di bawah ini.
PERINGATAN:
Jika kamu salah menggunakan modifikasi ini (misal kirim data invalid), WhatsApp bisa logout semua perangkat dan kamu harus scan ulang QR.
1let lastMsgInChat = await getLastMessageInChat(jid) // kamu buat fungsi ini sendiri 2await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)
Durasi | Milidetik |
---|---|
Hapus | null |
8 Jam | 86400000 |
7 Hari | 604800000 |
1await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid) // bisukan 8 jam 2await sock.chatModify({ mute: null }, jid) // aktifkan kembali notifikasi
1let lastMsgInChat = await getLastMessageInChat(jid) 2await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, jid)
1await sock.chatModify( 2 { 3 clear: { 4 messages: [ 5 { 6 id: 'ATWYHDNNWU81732J', 7 fromMe: true, 8 timestamp: '1654823909' 9 } 10 ] 11 } 12 }, 13 jid 14)
1let lastMsgInChat = await getLastMessageInChat(jid) 2await sock.chatModify({ 3 delete: true, 4 lastMessages: [ 5 { 6 key: lastMsgInChat.key, 7 messageTimestamp: lastMsgInChat.messageTimestamp 8 } 9 ] 10}, jid)
1await sock.chatModify({ 2 pin: true // false untuk unpin 3}, jid)
1await sock.chatModify({ 2 star: { 3 messages: [ 4 { 5 id: 'messageID', 6 fromMe: true 7 } 8 ], 9 star: true // true: beri bintang, false: hapus bintang 10 } 11}, jid)
Durasi | Detik (Seconds) |
---|---|
Nonaktif | 0 |
24 Jam | 86400 |
7 Hari | 604800 |
90 Hari | 7776000 |
1await sock.sendMessage(jid, { 2 disappearingMessagesInChat: 604800 // 7 hari 3})
1await sock.sendMessage( 2 jid, 3 { text: 'halo' }, 4 { ephemeralExpiration: 604800 } 5)
1await sock.sendMessage(jid, { 2 disappearingMessagesInChat: false 3})
1await sock.clearMessage(jid, key, timestamps)
1let [result] = await sock.onWhatsApp(jid) 2if (result.exists) console.log(`${jid} terdaftar di WhatsApp sebagai ${result.jid}`)
Kamu perlu mengambil pesan paling lama dari chat tersebut
1let msg = await getOldestMessageInChat(jid) 2await sock.fetchMessageHistory( 3 50, // maksimal 50 per query 4 msg.key, 5 msg.messageTimestamp 6)
messaging.history-set
1let status = await sock.fetchStatus(jid) 2console.log('Status: ' + status)
1let ppUrl = await sock.profilePictureUrl(jid) 2console.log('Foto profil: ' + ppUrl)
Cocok untuk akun bisnis WhatsApp, seperti deskripsi & kategori bisnis
1let profile = await sock.getBusinessProfile(jid) 2console.log('Deskripsi bisnis: ' + profile.description + ', Kategori: ' + profile.category)
1sock.ev.on('presence.update', console.log) 2await sock.presenceSubscribe(jid)
1await sock.updateProfileStatus('Halo Dunia!')
1await sock.updateProfileName('Nerox')
Sama seperti pesan media, kamu bisa pakai:
{ url }
,Buffer
, atau{ stream }
1await sock.updateProfilePicture(jid, { url: './foto-baru.jpeg' })
1await sock.removeProfilePicture(jid)
Untuk mengubah pengaturan grup, kamu harus menjadi admin grup tersebut.
1let group = await sock.groupCreate('Grup Hebat Nerox', ['1234@s.whatsapp.net', '4564@s.whatsapp.net']) 2console.log('Grup berhasil dibuat dengan ID: ' + group.gid) 3 4await sock.sendMessage(group.id, { text: 'Halo semuanya!' })
1await sock.groupParticipantsUpdate( 2 jid, 3 ['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'], 4 'add' // bisa diganti: 'remove', 'promote', 'demote' 5)
1await sock.groupUpdateSubject(jid, 'Nama Baru Grup!')
1await sock.groupUpdateDescription(jid, 'Deskripsi baru untuk grup ini')
1// hanya admin yang bisa kirim pesan 2await sock.groupSettingUpdate(jid, 'announcement') 3 4// semua anggota bisa kirim pesan 5await sock.groupSettingUpdate(jid, 'not_announcement') 6 7// semua anggota bisa ubah info grup (foto, nama, dll.) 8await sock.groupSettingUpdate(jid, 'unlocked') 9 10// hanya admin yang bisa ubah info grup 11await sock.groupSettingUpdate(jid, 'locked')
1await sock.groupLeave(jid)
1let code = await sock.groupInviteCode(jid) 2console.log('Kode undangan grup: ' + code) 3// gabung pakai: https://chat.whatsapp.com/ + code
1let newCode = await sock.groupRevokeInvite(jid) 2console.log('Kode undangan baru: ' + newCode)
1let response = await sock.groupAcceptInvite('ABC123DEF456') 2console.log('Berhasil gabung ke grup: ' + response)
1let response = await sock.groupGetInviteInfo('ABC123DEF456') 2console.log('Info grup: ', response)
1let metadata = await sock.groupMetadata(jid) 2console.log(metadata.id + ', Nama: ' + metadata.subject + ', Deskripsi: ' + metadata.desc)
groupInviteMessage
1let response = await sock.groupAcceptInviteV4(jid, groupInviteMessage) 2console.log('Gabung ke grup: ' + response)
1let response = await sock.groupRequestParticipantsList(jid) 2console.log(response)
1let response = await sock.groupRequestParticipantsUpdate( 2 jid, 3 ['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'], 4 'approve' // atau 'reject' 5) 6console.log(response)
1let allGroups = await sock.groupFetchAllParticipating() 2console.log(allGroups)
Durasi | Detik (Seconds) |
---|---|
Nonaktif | 0 |
24 Jam | 86400 |
7 Hari | 604800 |
90 Hari | 7776000 |
1await sock.groupToggleEphemeral(jid, 86400) // contoh: aktif 1 hari
1await sock.groupMemberAddMode( 2 jid, 3 'all_member_add' // atau 'admin_add' 4)
1await sock.updateBlockStatus(jid, 'block') // Bloki
No vulnerabilities found.
No security vulnerabilities found.