Baileys - WhatsApp API
Baileys adalah library TypeScript berbasis WebSocket untuk berinteraksi dengan WhatsApp Web API.
Penggunaan
Panduan terbaru telah dipublikasikan di https://baileys.wiki.
Penyangkalan
Proyek ini tidak berafiliasi, tidak berasosiasi, tidak diotorisasi, tidak didukung, dan tidak memiliki koneksi resmi dengan WhatsApp maupun anak perusahaan atau afiliasinya.
Situs resmi WhatsApp dapat ditemukan di whatsapp.com.
"WhatsApp" serta nama-nama, merek dagang, lambang, dan gambar terkait adalah hak milik terdaftar dari pemilik masing-masing.
Para pengelola Baileys tidak mendukung penggunaan aplikasi ini untuk praktik yang melanggar Ketentuan Layanan WhatsApp.
Kami menyerukan kepada setiap pengguna untuk menggunakan aplikasi ini secara bertanggung jawab dan sesuai tujuan awal pengembangannya.
Gunakan atas kebijakan pribadi masing-masing. Jangan gunakan untuk spam. Kami tidak mendukung penggunaan untuk stalkerware, pesan massal, ataupun automasi pesan yang bersifat mengganggu.
Lisensi
Proyek ini menggunakan lisensi MIT License, dan merupakan karya turunan dari Baileys oleh Rajeh Taher/WhiskeySockets.
Dengan menggunakan proyek ini, Anda dianggap telah menyetujui ketentuan lisensi tersebut.
Tentang Modifikasi
Proyek ini merupakan hasil modifikasi besar dari Baileys, sebuah library open-source WhatsApp Web API yang awalnya ditulis dalam TypeScript dan menggunakan format ECMAScript Module (ESM).
Modifikasi ini difokuskan untuk membuat versi yang sepenuhnya berbasis JavaScript murni dengan dukungan CommonJS (CJS). Dengan pendekatan ini, library menjadi lebih fleksibel dan mudah diintegrasikan ke dalam berbagai jenis runtime Node.js tanpa memerlukan proses transpilasi atau konfigurasi tambahan seperti "type": "module".
Poin Utama Modifikasi:
- Konversi total dari TypeScript ke JavaScript, untuk menyederhanakan proses pengembangan, debugging, dan distribusi.
- Penggunaan format module CommonJS (CJS) secara konsisten agar dapat digunakan di lingkungan Node.js manapun, termasuk proyek lama.
- Kompatibel dengan modul-modul ESM modern, melalui penggunaan dynamic import (
await import()), tanpa mengorbankan arsitektur utama CJS.
- Dukungan penuh terhadap tombol interaktif
- Penyederhanaan berbagai struktur internal seperti manajemen sesi, koneksi, katalog produk, dan optimasi format media.
- File
proto (WAProto) telah di-compile secara statis menjadi JavaScript untuk menghindari dependensi waktu jalan terhadap parser .proto.
Modifikasi ini ditujukan untuk developer yang ingin menggunakan kemampuan penuh Baileys dalam lingkungan kerja JavaScript tanpa batasan ESM atau TypeScript, sekaligus tetap dapat menikmati fitur-fitur modern WhatsApp Business.
Instalasi
Gunakan salah satu manajer paket berikut untuk menginstal versi stabil:
npm install fr3
yarn add fr3
pnpm add fr3
Penggunaan
Untuk proyek dengan ESM (ECMAScript Modules):
import makeWASocket from 'fr3 '
Untuk proyek dengan CJS (CommonJS):
const makeWASocket = require('fr3 ')
fr3 secara otomatis mendukung ESM dan CJS tanpa perlu konfigurasi tambahan.
Informasi
Saat ini, fr3 membutuhkan Node.js versi 20 atau lebih tinggi untuk berjalan.
Proyek ini secara eksplisit ditujukan untuk lingkungan modern dan tidak mendukung Node versi lama. Dukungan akan selalu mengikuti versi LTS terbaru dari Node.js untuk menjaga performa dan kompatibilitas dengan ekosistem terbaru.
Menghubungkan Akun
WhatsApp menyediakan API multi-perangkat yang memungkinkan Baileys untuk diautentikasi sebagai klien WhatsApp kedua dengan cara memindai kode QR atau menggunakan Kode Pairing melalui aplikasi WhatsApp di ponsel Anda.
Memulai Socket dengan Kode QR
[!TIP]
Anda dapat menyesuaikan nama browser jika terhubung menggunakan Kode QR dengan konstanta Browser.
Beberapa konfigurasi browser tersedia, lihat dokumentasinya di sini
import makeWASocket, { Browsers } from 'fr3 '
const sock = makeWASocket({
browser: Browsers.ubuntu('Safari'),
printQRInTerminal: true
})
Jika koneksi berhasil, kode QR akan ditampilkan di terminal Anda.
Pindai kode tersebut menggunakan WhatsApp di ponsel Anda, dan Anda akan berhasil masuk!
Memulai Socket dengan Kode Pairing
[!IMPORTANT]
Pairing Code bukan API Mobile. Ini adalah metode untuk terhubung ke WhatsApp Web tanpa memindai kode QR.
Metode ini hanya memungkinkan koneksi dari satu perangkat saja.
Lihat penjelasan resmi di sini
Nomor telepon tidak boleh menggunakan karakter seperti +, (), atau -.
Gunakan hanya angka dan pastikan menyertakan kode negara.
import makeWASocket from 'fr3 '
const sock = makeWASocket({
printQRInTerminal: false
})
if (!sock.authState.creds.registered) {
const number = '628XXXXXXXXX'
const code = await sock.requestPairingCode(number)
console.log(code)
}
Setelah pairing code berhasil dibuat, masukkan kode tersebut melalui WhatsApp Web seperti biasa untuk menyelesaikan proses autentikasi.
Menerima Riwayat Pesan Lengkap
- Atur opsi
syncFullHistory ke true
- Secara default, Baileys menggunakan konfigurasi browser Chrome.
- Jika Anda ingin meniru koneksi desktop (dan menerima riwayat pesan yang lebih banyak), gunakan konfigurasi browser seperti berikut pada pengaturan Socket Anda:
import makeWASocket, { Browsers } from 'fr3 '
const sock = makeWASocket({
...otherOpts,
browser: Browsers.ubuntu('Safari'),
syncFullHistory: true
})
Catatan Penting Mengenai Konfigurasi Socket
Caching Metadata Grup (Direkomendasikan)
- Jika Anda menggunakan Baileys untuk mengelola grup, sangat disarankan untuk mengatur opsi
cachedGroupMetadata pada konfigurasi socket Anda.
- Anda perlu mengimplementasikan sistem cache sederhana seperti contoh berikut:
import makeWASocket from 'fr3 '
import NodeCache from 'node-cache'
const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })
const sock = makeWASocket({
cachedGroupMetadata: async (jid) => groupCache.get(jid)
})
sock.ev.on('groups.update', async ([event]) => {
const metadata = await sock.groupMetadata(event.id)
groupCache.set(event.id, metadata)
})
sock.ev.on('group-participants.update', async (event) => {
const metadata = await sock.groupMetadata(event.id)
groupCache.set(event.id, metadata)
})
Dengan menggunakan cache ini, Anda dapat mengurangi jumlah permintaan metadata yang berulang dan mempercepat proses interaksi bot dengan grup secara signifikan.
Meningkatkan Sistem Retry & Mendekripsi Suara Polling
- Jika Anda ingin meningkatkan pengiriman pesan, melakukan retry otomatis saat terjadi error, dan mendekripsi hasil polling, Anda perlu menggunakan
store dan mengatur opsi getMessage pada socket seperti berikut:
const sock = makeWASocket({
getMessage: async (key) => await getMessageFromStore(key)
})
Menerima Notifikasi di Aplikasi WhatsApp
- Untuk tetap menerima notifikasi di aplikasi WhatsApp saat socket aktif, atur
markOnlineOnConnect ke false:
const sock = makeWASocket({
markOnlineOnConnect: false
})
Menangani Event
- Baileys menggunakan pola
EventEmitter untuk menangani berbagai peristiwa (event).
Seluruh event telah diketik (typed) dengan baik, sehingga editor seperti VS Code akan memberikan dukungan Intellisense secara optimal.
[!IMPORTANT]
Daftar lengkap event tersedia di sini.
Sangat penting untuk memahami setiap event yang bisa digunakan.
Contoh penggunaan listener untuk menangani pesan masuk:
import makeWASocket from 'fr3 '
const sock = makeWASocket()
sock.ev.on('messages.upsert', ({ messages }) => {
console.log('Pesan diterima:', messages)
})
Menyimpan & Memulihkan Sesi
Tentu Anda tidak ingin terus-menerus memindai QR code setiap kali ingin terkoneksi.
Anda bisa menyimpan kredensial dan menggunakannya kembali saat login berikutnya:
import makeWASocket, { useMultiFileAuthState } from 'fr3 '
const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys')
const sock = makeWASocket({ auth: state })
sock.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.
[!NOTE]
Ketika pesan dikirim/diterima, sistem Signal dapat menyebabkan update pada kunci autentikasi (authState.keys).
Setiap kali terjadi perubahan, kunci tersebut wajib disimpan kembali.
Jika tidak, pesan bisa gagal terkirim dan menyebabkan masalah tak terduga.
useMultiFileAuthState sudah menangani hal ini secara otomatis. Namun jika Anda membuat sistem penyimpanan sendiri, pastikan manajemen state-nya ditangani dengan hati-hati.
Contoh untuk Memulai
[!NOTE]
Contoh ini juga sudah mencakup penyimpanan kredensial secara otomatis
import makeWASocket, { DisconnectReason, useMultiFileAuthState } from 'fr3 '
import { Boom } from '@hapi/boom'
async function connectToWhatsApp () {
const { state, saveCreds } = await useMultiFileAuthState('./auth_info_baileys')
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
})
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if (connection === 'close') {
const shouldReconnect = (lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
console.log('Koneksi terputus karena', lastDisconnect.error, ', mencoba sambung ulang:', shouldReconnect)
if (shouldReconnect) {
connectToWhatsApp()
}
} else if (connection === 'open') {
console.log('Koneksi berhasil dibuka')
}
})
sock.ev.on('messages.upsert', async (event) => {
for (const m of event.messages) {
console.log(JSON.stringify(m, undefined, 2))
console.log('Membalas ke', m.key.remoteJid)
await sock.sendMessage(m.key.remoteJid!, { text: 'Hello Word' })
}
})
sock.ev.on('creds.update', saveCreds)
}
connectToWhatsApp()
Contoh Penggunaan useSingleFileAuthState dan useMongoFileAuthState
import makeWASocket, {
useSingleFileAuthState,
useMongoFileAuthState
} from 'fr3 '
const { state, saveState } = await useSingleFileAuthState('./auth_info_baileys.json')
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
})
sock.ev.on('creds.update', saveState)
import { MongoClient } from 'mongodb'
const connectAuth = async () => {
global.client = new MongoClient('mongoURL')
global.client.connect(err => {
if (err) {
console.warn('Peringatan: Link MongoDB tidak valid atau gagal terhubung.')
} else {
console.log('Berhasil terhubung ke server MongoDB')
}
})
}
await client.connect()
const collection = client.db('fr3 ').collection('sessions')
const Authentication = await useMongoFileAuthState(collection)
const { state, saveCreds } = Authentication
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
})
sock.ev.on('creds.update', saveCreds)
[!IMPORTANT]
Dalam event messages.upsert, sangat disarankan menggunakan perulangan for (const message of event.messages) untuk menangani semua pesan dalam array secara individual.
Mendekripsi Suara Polling
Secara default, suara polling di WhatsApp dienkripsi dan diproses melalui event messages.update.
import pino from 'pino'
import {
makeInMemoryStore,
getAggregateVotesInPollMessage
} from 'fr3 '
const logger = pino({ timestamp: () => `,"time":"${new Date().toJSON()}"` }).child({ class: 'fr3 ' })
logger.level = 'fatal'
const store = makeInMemoryStore({ logger })
async function getMessage(key) {
if (store) {
const msg = await store.loadMessage(key.remoteJid, key.id)
return msg?.message
}
return {
conversation: 'Polling Tidak Ditemukan'
}
}
sock.ev.on('messages.update', async (chatUpdate) => {
for (const { key, update } of chatUpdate) {
if (update.pollUpdates && key.fromMe) {
const pollCreation = await getMessage(key)
if (pollCreation) {
const pollUpdate = await getAggregateVotesInPollMessage({
message: pollCreation,
pollUpdates: update.pollUpdates
})
const toCmd = pollUpdate.filter(v => v.voters.length !== 0)[0]?.name
if (!toCmd) return
console.log(toCmd)
}
}
}
})
Fungsi getAggregateVotesInPollMessage() akan membantu mendekripsi hasil polling dan mengagregasi suara berdasarkan pemilih. Ini berguna untuk sistem voting interaktif melalui grup WhatsApp.
Ringkasan Event Saat Koneksi Pertama
- Saat pertama kali Anda terhubung, event
connection.update akan dipicu — biasanya meminta untuk merestart socket.
- Setelah itu, riwayat pesan akan diterima melalui event
messaging.history-set.
Mengimplementasikan Data Store
- 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 Anda 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.
Berikut contoh penggunaan store:
import makeWASocket, { makeInMemoryStore } from 'fr3 '
const store = makeInMemoryStore({})
store.readFromFile('./baileys_store.json')
setInterval(() => {
store.writeToFile('./baileys_store.json')
}, 10_000)
const sock = makeWASocket({})
store.bind(sock.ev)
sock.ev.on('chats.upsert', () => {
console.log('Data chat diterima:', store.chats.all())
})
sock.ev.on('contacts.upsert', () => {
console.log('Kontak diperbarui:', Object.values(store.contacts))
})
Store ini juga menyediakan beberapa fungsi tambahan seperti loadMessages untuk mempercepat pengambilan data dari cache internal.
Penjelasan Tentang WhatsApp ID
Fungsi Utilitas (Utility Functions)
Beberapa fungsi penting yang tersedia di Baileys:
getContentType – Mengembalikan jenis konten dari sebuah pesan
getDevice – Menentukan jenis perangkat pengirim pesan
makeCacheableSignalKeyStore – Meningkatkan performa autentikasi dengan membuat key store yang dapat di-cache
downloadContentFromMessage – Mengunduh konten (media/file) dari pesan apa pun
Mengirim Pesan
- Semua jenis pesan dapat dikirim menggunakan satu fungsi saja, yaitu
sendMessage().
- Lihat daftar jenis pesan yang didukung di sini
- Dan semua opsi pengiriman pesan di sini
Contoh:
const jid = '6283143663697@s.whatsapp.net'
const content = { text: 'Halo, ini pesan dari bot!' }
const options = { quoted: null }
await sock.sendMessage(jid, content, options)
Pesan Non-Media
Pesan Teks
await sock.sendMessage(jid, { text: 'Halo dunia' })
Pesan Balasan (Quote)
await sock.sendMessage(jid, { text: 'Ini balasan pesan kamu' }, { quoted: message })
Mention Pengguna (Tag)
- Gunakan
@nomor dalam teks dan sertakan mentions di payload.
await sock.sendMessage(
jid,
{
text: '@6283143663697 Hai Naruya!',
mentions: ['6283143663697@s.whatsapp.net']
}
)
Meneruskan Pesan (Forward)
- Butuh objek pesan (
WAMessage). Bisa didapat dari store atau pesan sebelumnya.
const msg = getMessageFromStore()
await sock.sendMessage(jid, { forward: msg, force: true })
Lokasi Biasa
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: -6.200000,
degreesLongitude: 106.816666
}
}
)
Lokasi Langsung (Live Location)
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: -6.200000,
degreesLongitude: 106.816666
},
live: true
}
)
Kirim Kontak (vCard)
const vcard =
'BEGIN:VCARD\n' +
'VERSION:3.0\n' +
'FN:Naruya Izumi\n' +
'ORG:ZERO DEV;\n' +
'TEL;type=CELL;type=VOICE;waid=6283143663697:+62 831-4366-3697\n' +
'END:VCARD'
await sock.sendMessage(
jid,
{
contacts: {
displayName: 'Naruya Izumi',
contacts: [{ vcard }]
}
}
)
Pesan Reaksi (Reaction Message)
- Anda perlu mengirimkan
key dari pesan yang ingin diberikan reaksi.
key bisa diambil dari store atau menggunakan WAMessageKey.
await sock.sendMessage(
jid,
{
react: {
text: '🔥',
key: message.key
}
}
)
Pin Pesan (Pin Message)
- Anda juga perlu memberikan
key dari pesan yang ingin dipin.
Anda dapat mengatur durasi pin berdasarkan waktu dalam detik.
| 24 jam | 86.400 |
| 7 hari | 604.800 |
| 30 hari | 2.592.000 |
await sock.sendMessage(
jid,
{
pin: {
type: 1,
time: 86400,
key: message.key
}
}
)
Menandai Pesan (Keep Message)
- Untuk menyimpan pesan tertentu agar tidak terhapus otomatis.
await sock.sendMessage(
jid,
{
keep: {
key: message.key,
type: 1
}
}
)
Pesan Polling (Poll Message)
- Kirim polling ke grup atau kontak pribadi. Dapat menentukan apakah polling bersifat publik (announcement group).
await sock.sendMessage(
jid,
{
poll: {
name: 'Polling Hari Ini',
values: ['Opsi A', 'Opsi B', 'Opsi C'],
selectableCount: 1,
toAnnouncementGroup: false
}
}
)
Pesan Hasil Polling (Poll Result)
- Kirim hasil polling secara manual jika dibutuhkan. Cocok untuk sistem polling terintegrasi.
await sock.sendMessage(
jid,
{
pollResult: {
name: 'Hasil Polling',
values: [
['Opsi A', 120],
['Opsi B', 350],
['Opsi C', 75]
]
}
}
)
Pesan Panggilan (Call Message)
- Digunakan untuk mengirim notifikasi panggilan, bisa suara atau video.
await sock.sendMessage(
jid,
{
call: {
name: 'Hay',
type: 1
}
}
)
Pesan Event (Event Message)
- Cocok untuk mengumumkan acara atau undangan dengan detail lokasi dan waktu.
await sock.sendMessage(
jid,
{
event: {
isCanceled: false,
name: 'Liburan Bareng!',
description: 'Siapa yang mau ikut?',
location: {
degreesLatitude: 24.121231,
degreesLongitude: 55.1121221,
name: 'Pantai Sanur'
},
startTime: 1715000000,
endTime: 1715086400,
extraGuestsAllowed: true
}
}
)
Pesan Pemesanan (Order Message)
- Digunakan untuk menampilkan detail pemesanan dari katalog bisnis WhatsApp.
await sock.sendMessage(
jid,
{
order: {
orderId: '574XXX',
thumbnail: 'your_thumbnail',
itemCount: 3,
status: 'INQUIRY',
surface: 'CATALOG',
message: 'Deskripsi pesanan',
orderTitle: 'Judul Pesanan',
sellerJid: '628xxx@s.whatsapp.net',
token: 'your_token',
totalAmount1000: '150000',
totalCurrencyCode: 'IDR'
}
}
)
Pesan Produk (Product Message)
- Menampilkan detail produk dari katalog bisnis.
await sock.sendMessage(
jid,
{
product: {
productImage: {
url: 'https://your-image.url/image.jpg'
},
productId: 'PRD-001',
title: 'Produk Spesial',
description: 'Deskripsi lengkap produk kamu di sini',
currencyCode: 'IDR',
priceAmount1000: '50000',
retailerId: 'store-izumi',
url: 'https://linkproduk.com',
productImageCount: 1,
firstImageId: 'img-001',
salePriceAmount1000: '45000',
signedUrl: 'https://your.signed.url'
},
businessOwnerJid: '628xxx@s.whatsapp.net'
}
)
Pesan Pembayaran (Payment Message)
- Digunakan untuk mengirimkan informasi pembayaran, cocok untuk chatbot belanja.
await sock.sendMessage(
jid,
{
payment: {
note: 'Hi!',
currency: 'IDR',
offset: 0,
amount: '10000',
expiry: 0,
from: '628xxxx@s.whatsapp.net',
image: {
placeholderArgb: '#222222',
textArgb: '#FFFFFF',
subtextArgb: '#AAAAAA'
}
}
}
)
Pesan Undangan Pembayaran (Payment Invite Message)
- Digunakan untuk mengundang pengguna lain melakukan pembayaran.
await sock.sendMessage(
jid,
{
paymentInvite: {
type: 1,
expiry: 0
}
}
)
Pesan Undangan Admin Channel (Admin Invite Message)
- Meminta pengguna untuk menjadi admin di saluran (newsletter) Anda.
await sock.sendMessage(
jid,
{
adminInvite: {
jid: '123xxx@newsletter',
name: 'Channel Naruya',
caption: 'Tolong jadi admin channel saya ya!',
expiration: 86400,
jpegThumbnail: Buffer
}
}
)
Undangan Grup WhatsApp (Group Invite Message)
- Mengirim undangan ke grup tertentu menggunakan kode undangan.
await sock.sendMessage(
jid,
{
groupInvite: {
jid: '123xxx@g.us',
name: 'Grup Dev Naruya',
caption: 'Ayo gabung ke grup WhatsApp kami!',
code: 'ABCD1234',
expiration: 86400,
jpegThumbnail: Buffer
}
}
)
Pesan Bagikan Nomor Telepon (Share Phone Number)
- Mengirim permintaan eksplisit untuk membagikan nomor telepon pengguna.
await sock.sendMessage(
jid,
{
sharePhoneNumber: {}
}
)
Pesan Permintaan Nomor Telepon (Request Phone Number)
- Meminta pengguna untuk membagikan nomor telepon mereka secara langsung.
await sock.sendMessage(
jid,
{
requestPhoneNumber: {}
}
)
Pesan Balasan Tombol (Button Reply Message)
- Digunakan untuk merespons interaksi tombol yang diklik pengguna. Tipe pesan dibedakan berdasarkan jenis tombol yang digunakan.
Tombol Tipe List
await sock.sendMessage(
jid,
{
buttonReply: {
name: 'Hai',
description: 'Deskripsi pilihan',
rowId: 'pilihan_1'
},
type: 'list'
}
)
Tombol Tipe Plain
await sock.sendMessage(
jid,
{
buttonReply: {
displayText: 'Halo',
id: 'plain_id'
},
type: 'plain'
}
)
Tombol Tipe Template
await sock.sendMessage(
jid,
{
buttonReply: {
displayText: 'Pilih Saya',
id: 'template_id',
index: 1
},
type: 'template'
}
)
Tombol Tipe Interactive (Native Flow)
await sock.sendMessage(
jid,
{
buttonReply: {
body: 'Mau pilih yang mana?',
nativeFlows: {
name: 'menu_options',
paramsJson: JSON.stringify({ id: 'menu_1', description: 'Deskripsi interaktif' }),
version: 1
}
},
type: 'interactive'
}
)
Pesan dengan Tombol (Buttons Message)
- Pesan biasa yang disertai hingga 3 tombol untuk respon cepat.
await sock.sendMessage(
jid,
{
text: 'Ini adalah pesan tombol!',
caption: 'Gunakan jika memakai gambar/video',
footer: 'Salam dari Naruya Izumi!',
buttons: [
{
buttonId: 'btn1',
buttonText: { displayText: 'Tombol 1' }
},
{
buttonId: 'btn2',
buttonText: { displayText: 'Tombol 2' }
},
{
buttonId: 'btn3',
buttonText: { displayText: 'Tombol 3' }
}
]
}
)
Pesan List Tombol (Buttons List Message)
- Hanya bisa digunakan di chat pribadi, bukan grup.
await sock.sendMessage(
jid,
{
text: 'Ini adalah daftar pilihan!',
footer: 'Dipersembahkan oleh Naruya Izumi',
title: 'Judul Daftar Pilihan',
buttonText: 'Klik untuk melihat opsi',
sections: [
{
title: 'Bagian 1',
rows: [
{ title: 'Opsi 1', rowId: 'opsi1' },
{ title: 'Opsi 2', rowId: 'opsi2', description: 'Deskripsi Opsi 2' }
]
},
{
title: 'Bagian 2',
rows: [
{ title: 'Opsi 3', rowId: 'opsi3' },
{ title: 'Opsi 4', rowId: 'opsi4', description: 'Deskripsi Opsi 4' }
]
}
]
}
)
Pesan Daftar Produk dengan Tombol (Buttons Product List Message)
- Hanya dapat digunakan di chat pribadi, bukan grup.
- Menampilkan daftar produk dari katalog bisnis WhatsApp Anda.
await sock.sendMessage(
jid,
{
text: 'Ini adalah daftar produk!',
footer: 'Dikirim oleh Naruya Izumi',
title: 'Pilih Produk Unggulan',
buttonText: 'Lihat Daftar Produk',
productList: [
{
title: 'Kategori Produk Utama',
products: [
{ productId: '1234' },
{ productId: '5678' }
]
}
],
businessOwnerJid: '628xxx@s.whatsapp.net',
thumbnail: 'https://example.jpg'
}
)
Pesan Kartu dengan Tombol (Buttons Cards Message)
- Menampilkan beberapa kartu (card) interaktif dengan gambar atau video + tombol.
await sock.sendMessage(
jid,
{
text: 'Isi Utama Pesan',
title: 'Judul Utama',
subtile: 'Subjudul Opsional',
footer: 'Footer Pesan',
cards: [
{
image: { url: 'https://example.jpg' },
title: 'Judul Kartu',
body: 'Isi Konten Kartu',
footer: 'Footer Kartu',
buttons: [
{
name: 'quick_reply',
buttonParamsJson: JSON.stringify({
display_text: 'Tombol Cepat',
id: 'ID_TOMBOL_1'
})
},
{
name: 'cta_url',
buttonParamsJson: JSON.stringify({
display_text: 'Kunjungi Website',
url: 'https://www.example.com'
})
}
]
},
{
video: { url: 'https://example.mp4' },
title: 'Judul Kartu Video',
body: 'Deskripsi Konten',
footer: 'Footer Kartu',
buttons: [
{
name: 'quick_reply',
buttonParamsJson: JSON.stringify({
display_text: 'Respon Cepat',
id: 'ID_TOMBOL_2'
})
},
{
name: 'cta_url',
buttonParamsJson: JSON.stringify({
display_text: 'Lihat Selengkapnya',
url: 'https://www.example.com'
})
}
]
}
]
}
)
Pesan Tombol Template (Buttons Template Message)
- Menampilkan tombol dengan tipe URL, panggilan, atau tombol balasan cepat.
await sock.sendMessage(
jid,
{
text: 'Ini adalah pesan template tombol!',
footer: 'Dikirim oleh Naruya Izumi',
templateButtons: [
{
index: 1,
urlButton: {
displayText: 'Ikuti Channel',
url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y'
}
},
{
index: 2,
callButton: {
displayText: 'Hubungi Saya!',
phoneNumber: '628xxxx'
}
},
{
index: 3,
quickReplyButton: {
displayText: 'Balas Cepat',
id: 'id-button-reply'
}
}
]
}
)
Pesan Tombol Interaktif (Interactive Buttons)
- Mendukung berbagai jenis tombol dan dapat digunakan dengan media.
await sock.sendMessage(
jid,
{
text: 'Ini pesan interaktif!',
title: 'Hai!',
subtitle: 'Subjudul di sini',
footer: 'Dikirim oleh Naruya Izumi',
interactiveButtons: [
{
name: 'quick_reply',
buttonParamsJson: JSON.stringify({
display_text: 'Klik Aku!',
id: 'id_anda'
})
},
{
name: 'cta_url',
buttonParamsJson: JSON.stringify({
display_text: 'Kunjungi Channel',
url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y',
merchant_url: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y'
})
},
{
name: 'cta_copy',
buttonParamsJson: JSON.stringify({
display_text: 'Salin Link',
copy_code: 'https://whatsapp.com/channel/0029Vag9VSI2ZjCocqa2lB1y'
})
},
{
name: 'cta_call',
buttonParamsJson: JSON.stringify({
display_text: 'Telepon Saya',
phone_number: '628xxxx'
})
},
{
name: 'single_select',
buttonParamsJson: JSON.stringify({
title: 'Pilih Opsi',
sections: [
{
title: 'Pilihan Utama',
highlight_label: 'Rekomendasi',
rows: [
{
header: 'Header 1',
title: 'Opsi 1',
description: 'Deskripsi 1',
id: 'id1'
},
{
header: 'Header 2',
title: 'Opsi 2',
description: 'Deskripsi 2',
id: 'id2'
}
]
}
]
})
}
]
}
)
Versi dengan Media
Gambar
await sock.sendMessage(
jid,
{
image: { url: 'https://example.jpg' },
caption: 'Isi Pesan',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Footer',
interactiveButtons: [ ],
hasMediaAttachment: false
}
)
Video
await sock.sendMessage(
jid,
{
video: { url: 'https://example.mp4' },
caption: 'Isi Video',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Footer',
interactiveButtons: [ ],
hasMediaAttachment: false
}
)
Dokumen
await sock.sendMessage(
jid,
{
document: { url: 'https://example.jpg' },
mimetype: 'image/jpeg',
jpegThumbnail: await sock.resize('https://example.jpg', 320, 320),
caption: 'Isi Dokumen',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Footer',
interactiveButtons: [ ],
hasMediaAttachment: false
}
)
Lokasi
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: -6.2,
degreesLongitude: 106.8,
name: 'Naruya HQ'
},
caption: 'Ayo ke sini!',
title: 'Lokasi Tujuan',
subtitle: 'Subjudul Lokasi',
footer: 'Peta lokasi',
interactiveButtons: [ ],
hasMediaAttachment: false
}
)
Produk
await sock.sendMessage(
jid,
{
product: {
productImage: { url: 'https://example.jpg' },
productId: '836xxx',
title: 'Produk Pilihan',
description: 'Deskripsi produk terbaik',
currencyCode: 'IDR',
priceAmount1000: '283000',
retailerId: 'NaruyaStore',
url: 'https://example.com',
productImageCount: 1
},
businessOwnerJid: '628xxx@s.whatsapp.net',
caption: 'Produk baru tersedia!',
title: 'Nama Produk',
subtitle: 'Subjudul Produk',
footer: 'Info Produk',
interactiveButtons: [ ],
hasMediaAttachment: false
}
)
Mention Status (Status Mentions Message)
- Digunakan untuk membuat status WhatsApp yang menyebut seseorang secara langsung.
await sock.sendStatusMentions(
jid,
{
image: {
url: 'https://example.com.jpg'
},
caption: 'Halo dari Naruya!'
}
)
Pesan Album (Send Album Message)
- Mengirim beberapa gambar atau video sebagai album (sekuens media). Bisa pakai
Buffer atau URL.
await sock.sendAlbumMessage(
jid,
[
{
image: { url: 'https://example.jpg' },
caption: 'Gambar 1'
},
{
image: Buffer,
caption: 'Gambar 2'
},
{
video: { url: 'https://example.mp4' },
caption: 'Video 1'
},
{
video: Buffer,
caption: 'Video 2'
}
],
{
quoted: message,
delay: 2000
}
)
Pesan Toko (Shop Message)
- Digunakan untuk mengarahkan pengguna ke katalog atau produk dalam fitur bisnis WhatsApp.
Teks Saja
await sock.sendMessage(
jid,
{
text: 'Body pesan',
title: 'Judul Toko',
subtitle: 'Subjudul',
footer: 'Powered by Naruya',
shop: {
surface: 1,
id: 'https://example.com'
},
viewOnce: true
}
)
Gambar
await sock.sendMessage(
jid,
{
image: { url: 'https://example.jpg' },
caption: 'Deskripsi produk',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Footer',
shop: {
surface: 1,
id: 'https://example.com'
},
hasMediaAttachment: false,
viewOnce: true
}
)
Video
await sock.sendMessage(
jid,
{
video: { url: 'https://example.mp4' },
caption: 'Tonton videonya!',
title: 'Judul Video',
subtitle: 'Subjudul',
footer: 'Footer',
shop: {
surface: 1,
id: 'https://example.com'
},
hasMediaAttachment: false,
viewOnce: true
}
)
Dokumen
await sock.sendMessage(
jid,
{
document: { url: 'https://example.jpg' },
mimetype: 'image/jpeg',
jpegThumbnail: await sock.resize('https://example.jpg', 320, 320),
caption: 'Lampiran dokumen',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Footer',
shop: {
surface: 1,
id: 'https://example.com'
},
hasMediaAttachment: false,
viewOnce: true
}
)
Lokasi
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: -6.2000,
degreesLongitude: 106.8166,
name: 'Lokasi Toko'
},
caption: 'Lihat lokasi kami!',
title: 'Judul Lokasi',
subtitle: 'Subjudul',
footer: 'Peta lokasi',
shop: {
surface: 1,
id: 'https://example.com'
},
hasMediaAttachment: false,
viewOnce: true
}
)
Produk
await sock.sendMessage(
jid,
{
product: {
productImage: { url: 'https://example.jpg' },
productId: '836xxx',
title: 'Nama Produk',
description: 'Deskripsi produk menarik',
currencyCode: 'IDR',
priceAmount1000: '283000',
retailerId: 'NaruyaStore',
url: 'https://example.com',
productImageCount: 1
},
businessOwnerJid: '628xxx@s.whatsapp.net',
caption: 'Lihat produk unggulan kami!',
title: 'Judul Produk',
subtitle: 'Subjudul Produk',
footer: 'Info produk',
shop: {
surface: 1,
id: 'https://example.com'
},
hasMediaAttachment: false,
viewOnce: true
}
)
Pesan Koleksi (Collection Message)
- Fitur ini digunakan untuk menampilkan koleksi katalog dari bisnis tertentu di WhatsApp.
Teks Saja
await sock.sendMessage(
jid,
{
text: 'Isi pesan',
title: 'Judul Koleksi',
subtitle: 'Subjudul',
footer: 'Dari Naruya Izumi',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
viewOnce: true
}
)
Gambar
await sock.sendMessage(
jid,
{
image: { url: 'https://example.jpg' },
caption: 'Koleksi Gambar',
title: 'Judul Koleksi',
subtitle: 'Subjudul',
footer: 'Katalog Naruya',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
hasMediaAttachment: false,
viewOnce: true
}
)
Video
await sock.sendMessage(
jid,
{
video: { url: 'https://example.mp4' },
caption: 'Koleksi Video',
title: 'Judul Video',
subtitle: 'Subjudul',
footer: 'Video Katalog',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
hasMediaAttachment: false,
viewOnce: true
}
)
Dokumen
await sock.sendMessage(
jid,
{
document: { url: 'https://example.jpg' },
mimetype: 'image/jpeg',
jpegThumbnail: await sock.resize('https://example.jpg', 320, 320),
caption: 'Dokumen Katalog',
title: 'Judul Dokumen',
subtitle: 'Subjudul',
footer: 'Lampiran Koleksi',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
hasMediaAttachment: false,
viewOnce: true
}
)
Lokasi
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: -6.2,
degreesLongitude: 106.8,
name: 'Lokasi Bisnis'
},
caption: 'Lihat lokasi koleksi',
title: 'Judul Lokasi',
subtitle: 'Subjudul',
footer: 'Lokasi Katalog',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
hasMediaAttachment: false,
viewOnce: true
}
)
Produk
await sock.sendMessage(
jid,
{
product: {
productImage: { url: 'https://example.jpg' },
productId: '836xxx',
title: 'Nama Produk',
description: 'Deskripsi produk',
currencyCode: 'IDR',
priceAmount1000: '283000',
retailerId: 'NaruyaStore',
url: 'https://example.com',
productImageCount: 1
},
businessOwnerJid: '628xxx@s.whatsapp.net',
caption: 'Koleksi Produk',
title: 'Judul',
subtitle: 'Subjudul',
footer: 'Produk Katalog',
collection: {
bizJid: '628xxx@s.whatsapp.net',
id: 'https://example.com',
version: 1
},
hasMediaAttachment: false,
viewOnce: true
}
)
Mengirim Pesan dengan Pratinjau Link (Link Preview)
- Secara default, WhatsApp Web tidak menampilkan pratinjau link.
- Namun, Baileys menyediakan fungsi pembangkit preview link otomatis.
- Untuk mengaktifkannya, install dulu dependensinya dengan:
yarn add link-preview-js
- Contoh kirim pesan dengan pratinjau link:
await sock.sendMessage(
jid,
{
text: 'Hai! Ini dikirim dari https://github.com/whiskeysockets/baileys'
}
)
Pesan Media (Media Messages)
Mengirim media (gambar, video, audio, stiker) jauh lebih efisien dengan Baileys.
[!NOTE]
Anda bisa menggunakan Buffer, { stream }, atau { url }.
Lihat lebih lengkap di dokumentasi media
[!TIP]
Gunakan stream atau url langsung agar lebih hemat memori.
Pesan GIF (video pendek)
WhatsApp tidak mendukung file .gif, maka harus dikirim dalam bentuk .mp4 dengan flag gifPlayback: true
await sock.sendMessage(
jid,
{
video: fs.readFileSync('Media/ma_gif.mp4'),
caption: 'Halo dari GIF!',
gifPlayback: true
}
)
Pesan Video
await sock.sendMessage(
jid,
{
video: { url: './Media/ma_video.mp4' },
caption: 'Ini videonya'
}
)
Pesan Video PTV (Picture to Video / video bulat WA)
await sock.sendMessage(
jid,
{
video: { url: './Media/ma_video.mp4' },
ptv: true
}
)
Pesan Audio
Agar audio kompatibel di semua perangkat, sebaiknya gunakan ffmpeg dengan pengaturan berikut:
ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
await sock.sendMessage(
jid,
{
audio: { url: './Media/audio.ogg' },
mimetype: 'audio/ogg; codecs=opus'
}
)
Pesan Gambar
await sock.sendMessage(
jid,
{
image: { url: './Media/ma_img.png' },
caption: 'Halo dari gambar!'
}
)
Pesan View Once
Fitur View Once memungkinkan media hanya bisa dilihat satu kali.
await sock.sendMessage(
jid,
{
image: { url: './Media/ma_img.png' },
viewOnce: true,
caption: 'Media hanya bisa dilihat sekali'
}
)
Memodifikasi Pesan
Menghapus Pesan (Untuk Semua Orang)
- Digunakan untuk menarik pesan yang sudah dikirim (delete for everyone).
const msg = await sock.sendMessage(jid, { text: 'Halo dunia' })
await sock.sendMessage(jid, { delete: msg.key })
Catatan:
Untuk menghapus pesan hanya untuk diri sendiri, gunakan chatModify (lihat bagian Modifikasi Chat).
Mengedit Pesan
- Anda dapat mengedit isi pesan yang telah dikirim sebelumnya, selama masih berada dalam konteks yang diizinkan oleh WhatsApp.
await sock.sendMessage(jid, {
text: 'Teks yang sudah diperbarui di sini',
edit: response.key
})
Memanipulasi Pesan Media
Menambahkan Thumbnail pada Media
- Thumbnail (gambar pratinjau) untuk gambar dan stiker bisa dihasilkan secara otomatis jika Anda menambahkan salah satu dari dependency berikut:
yarn add jimp
yarn add sharp
- Untuk video, Anda juga bisa menghasilkan thumbnail otomatis, tapi pastikan Anda sudah install
ffmpeg di sistem Anda.
Contoh penggunaan otomatis biasanya tidak perlu Anda atur manual — Baileys akan meng-generate thumbnail bila dependensi sudah tersedia.
Mengunduh Media dari Pesan (Downloading Media Messages)
Jika kamu ingin menyimpan media yang diterima dari pengguna:
import { createWriteStream } from 'fs'
import { downloadMediaMessage, getContentType } from 'fr3 '
sock.ev.on('messages.upsert', async ({ messages }) => {
let m = messages[0]
if (!m.message) return
let messageType = getContentType(m.message)
if (messageType === 'imageMessage') {
let stream = await downloadMediaMessage(
m,
'stream',
{},
{
logger,
reuploadRequest: sock.updateMediaMessage
}
)
let file = createWriteStream('./downloaded-image.jpeg')
stream.pipe(file)
}
})
Re-upload Media ke WhatsApp
Jika media sudah dihapus dari server WhatsApp, kamu bisa minta perangkat pengirim untuk melakukan reupload:
await sock.updateMediaMessage(msg)
Fitur ini penting saat media gagal diunduh karena sudah tidak tersedia di server WhatsApp.
Menolak Panggilan (Reject Call)
- Kamu bisa mendapatkan
callId dan callFrom dari event call.
await sock.rejectCall(callId, callFrom)
Mengirim Status ke Chat (Send States in Chat)
Menandai Pesan Dibaca (Reading Messages)
- Kamu harus menandai pesan satu per satu menggunakan key dari
WAMessage.
- Tidak bisa menandai seluruh chat sebagai terbaca secara langsung seperti di WhatsApp Web.
const key = {
remoteJid: '628xxx@s.whatsapp.net',
fromMe: false,
id: 'ABCDEF123456'
}
await sock.readMessages([key])
Kamu bisa mendapatkan messageID dari:
let messageID = message.key.id
Memperbarui Status Kehadiran (Update Presence)
await sock.sendPresenceUpdate('available', jid)
await sock.sendPresenceUpdate('composing', jid)
await sock.sendPresenceUpdate('unavailable', jid)
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:
await sock.sendPresenceUpdate('unavailable')
Memodifikasi Chat (Modifying Chats)
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.
Mengarsipkan Chat (Archive)
let lastMsgInChat = await getLastMessageInChat(jid)
await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)
Membisukan / Mengaktifkan Notifikasi (Mute / Unmute)
| Hapus | null |
| 8 Jam | 86400000 |
| 7 Hari | 604800000 |
await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)
await sock.chatModify({ mute: null }, jid)
Tandai Sebagai Terbaca / Belum Dibaca
let lastMsgInChat = await getLastMessageInChat(jid)
await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, jid)
Hapus Pesan Hanya untuk Saya
await sock.chatModify(
{
clear: {
messages: [
{
id: 'ATWYHDNNWU81732J',
fromMe: true,
timestamp: '1654823909'
}
]
}
},
jid
)
Hapus Chat Secara Keseluruhan
let lastMsgInChat = await getLastMessageInChat(jid)
await sock.chatModify({
delete: true,
lastMessages: [
{
key: lastMsgInChat.key,
messageTimestamp: lastMsgInChat.messageTimestamp
}
]
}, jid)
Pin / Unpin Chat
await sock.chatModify({
pin: true
}, jid)
Tandai / Hapus Bintang dari Pesan
await sock.chatModify({
star: {
messages: [
{
id: 'messageID',
fromMe: true
}
],
star: true
}
}, jid)
Pesan Menghilang Otomatis (Disappearing Messages)
| Nonaktif | 0 |
| 24 Jam | 86400 |
| 7 Hari | 604800 |
| 90 Hari | 7776000 |
Aktifkan
await sock.sendMessage(jid, {
disappearingMessagesInChat: 604800
})
Kirim Pesan dengan Mode Menghilang
await sock.sendMessage(
jid,
{ text: 'halo' },
{ ephemeralExpiration: 604800 }
)
Nonaktifkan
await sock.sendMessage(jid, {
disappearingMessagesInChat: false
})
Menghapus Pesan Tertentu (Clear Messages)
await sock.clearMessage(jid, key, timestamps)
Query Pengguna (User Queries)
Cek Apakah Nomor Terdaftar di WhatsApp
let [result] = await sock.onWhatsApp(jid)
if (result.exists) console.log(`${jid} terdaftar di WhatsApp sebagai ${result.jid}`)
Ambil Riwayat Chat (termasuk grup)
Kamu perlu mengambil pesan paling lama dari chat tersebut
let msg = await getOldestMessageInChat(jid)
await sock.fetchMessageHistory(
50,
msg.key,
msg.messageTimestamp
)
- Hasilnya akan dikirimkan melalui event
messaging.history-set
Ambil Status WhatsApp (Bio)
let status = await sock.fetchStatus(jid)
console.log('Status: ' + status)
Ambil Foto Profil (Profil, Grup, Channel)
let ppUrl = await sock.profilePictureUrl(jid)
console.log('Foto profil: ' + ppUrl)
Ambil Profil Bisnis (Business Profile)
Cocok untuk akun bisnis WhatsApp, seperti deskripsi & kategori bisnis
let profile = await sock.getBusinessProfile(jid)
console.log('Deskripsi bisnis: ' + profile.description + ', Kategori: ' + profile.category)
Cek Kehadiran Seseorang (Presence: Online / Typing)
sock.ev.on('presence.update', console.log)
await sock.presenceSubscribe(jid)
Ubah Profil
Ubah Status Profil (Bio)
await sock.updateProfileStatus('Halo Dunia!')
Ubah Nama Profil
await sock.updateProfileName('Naruya Izumi')
Ubah Foto Profil (termasuk grup)
Sama seperti pesan media, kamu bisa pakai:
{ url }, Buffer, atau { stream }
await sock.updateProfilePicture(jid, { url: './foto-baru.jpeg' })
Hapus Foto Profil (termasuk grup)
await sock.removeProfilePicture(jid)
Grup WhatsApp (Groups)
Untuk mengubah pengaturan grup, kamu harus menjadi admin grup tersebut.
Membuat Grup
let group = await sock.groupCreate('Grup Hebat Naruya', ['1234@s.whatsapp.net', '4564@s.whatsapp.net'])
console.log('Grup berhasil dibuat dengan ID: ' + group.gid)
await sock.sendMessage(group.id, { text: 'Halo semuanya!' })
Tambah / Hapus / Jadikan Admin / Turunkan Admin
await sock.groupParticipantsUpdate(
jid,
['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'],
'add'
)
Ubah Nama Grup
await sock.groupUpdateSubject(jid, 'Nama Baru Grup!')
Ubah Deskripsi Grup
await sock.groupUpdateDescription(jid, 'Deskripsi baru untuk grup ini')
Ubah Pengaturan Grup
await sock.groupSettingUpdate(jid, 'announcement')
await sock.groupSettingUpdate(jid, 'not_announcement')
await sock.groupSettingUpdate(jid, 'unlocked')
await sock.groupSettingUpdate(jid, 'locked')
Keluar dari Grup
await sock.groupLeave(jid)
Dapatkan Kode Undangan Grup
let code = await sock.groupInviteCode(jid)
console.log('Kode undangan grup: ' + code)
Reset / Ganti Kode Undangan Grup
let newCode = await sock.groupRevokeInvite(jid)
console.log('Kode undangan baru: ' + newCode)
Gabung Grup dengan Kode Undangan
let response = await sock.groupAcceptInvite('ABC123DEF456')
console.log('Berhasil gabung ke grup: ' + response)
Lihat Info Grup dari Kode Undangan
let response = await sock.groupGetInviteInfo('ABC123DEF456')
console.log('Info grup: ', response)
Lihat Metadata Grup (peserta, nama, deskripsi, dll.)
let metadata = await sock.groupMetadata(jid)
console.log(metadata.id + ', Nama: ' + metadata.subject + ', Deskripsi: ' + metadata.desc)
Gabung Grup dari groupInviteMessage
let response = await sock.groupAcceptInviteV4(jid, groupInviteMessage)
console.log('Gabung ke grup: ' + response)
Lihat Daftar Pengguna yang Minta Gabung
let response = await sock.groupRequestParticipantsList(jid)
console.log(response)
Setujui / Tolak Permintaan Gabung
let response = await sock.groupRequestParticipantsUpdate(
jid,
['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'],
'approve'
)
console.log(response)
Dapatkan Metadata Semua Grup yang Kamu Ikuti
let allGroups = await sock.groupFetchAllParticipating()
console.log(allGroups)
Aktifkan Pesan Sementara di Grup (Ephemeral Message)
| Nonaktif | 0 |
| 24 Jam | 86400 |
| 7 Hari | 604800 |
| 90 Hari | 7776000 |
await sock.groupToggleEphemeral(jid, 86400)
Ubah Mode Penambahan Anggota Grup
await sock.groupMemberAddMode(
jid,
'all_member_add'
)
Privasi (Privacy)
Blokir / Buka Blokir Pengguna
await sock.updateBlockStatus(jid, 'block')
await sock.updateBlockStatus(jid, 'unblock')
Ambil Pengaturan Privasi
let privacySettings = await sock.fetchPrivacySettings(true)
console.log('Pengaturan privasi:', privacySettings)
Lihat Daftar Blokir
let blocklist = await sock.fetchBlocklist()
console.log(blocklist)
Ubah Privasi Terakhir Dilihat (Last Seen)
let value = 'all'
await sock.updateLastSeenPrivacy(value)
Ubah Privasi Status Online
let value = 'all'
await sock.updateOnlinePrivacy(value)
Ubah Privasi Foto Profil
let value = 'all'
await sock.updateProfilePicturePrivacy(value)
Ubah Privasi Status WhatsApp
let value = 'all'
await sock.updateStatusPrivacy(value)
Ubah Privasi Centang Biru (Read Receipts)
let value = 'all'
await sock.updateReadReceiptsPrivacy(value)
Ubah Privasi Siapa yang Bisa Menambahkan ke Grup
let value = 'all'
await sock.updateGroupsAddPrivacy(value)
Ubah Mode Default Pesan Sementara
Durasi dalam detik:
| Nonaktif | 0 |
| 24 Jam | 86400 |
| 7 Hari | 604800 |
| 90 Hari | 7776000 |
let ephemeral = 86400
await sock.updateDefaultDisappearingMode(ephemeral)
NEWSLETTER
- Mendapatkan informasi newsletter
const metadata = await sock.newsletterMetadata("invite", "xxxxx")
const metadata = await sock.newsletterMetadata("jid", "abcd@newsletter")
console.log(metadata)
- Mengubah deskripsi newsletter
await sock.newsletterUpdateDescription("abcd@newsletter", "Deskripsi Baru")
await sock.newsletterUpdateName("abcd@newsletter", "Nama Baru")
- Mengubah foto profil newsletter
await sock.newsletterUpdatePicture("abcd@newsletter", buffer)
- Menghapus foto profil newsletter
await sock.newsletterRemovePicture("abcd@newsletter")
- Mematikan notifikasi newsletter
await sock.newsletterMute("abcd@newsletter")
- Mengaktifkan kembali notifikasi newsletter
await sock.newsletterUnmute("abcd@newsletter")
const metadata = await sock.newsletterCreate("Nama Newsletter", "Deskripsi Newsletter")
console.log(metadata)
await sock.newsletterDelete("abcd@newsletter")
await sock.newsletterFollow("abcd@newsletter")
- Berhenti mengikuti newsletter
await sock.newsletterUnfollow("abcd@newsletter")
- Mengirim reaksi ke pesan di newsletter
const id = "175"
await sock.newsletterReactMessage("abcd@newsletter", id, "🥳")
Ikon AI
await sock.sendMessage(id, { text: "Hello World", ai: true })
Broadcast & Status WhatsApp
Kirim Broadcast dan Status (Stories)
- Kamu bisa kirim pesan ke broadcast & story WhatsApp menggunakan
sendMessage() seperti biasa, tapi dengan tambahan properti khusus:
await sock.sendMessage(
jid,
{
image: {
url: url
},
caption: 'Halo dari broadcast!'
},
{
backgroundColor: '#ffffff',
font: 'default',
statusJidList: ['628xxx@s.whatsapp.net'],
broadcast: true
}
)
Ambil Info Daftar Broadcast
let bList = await sock.getBroadcastListInfo('1234@broadcast')
console.log(`Nama list: ${bList.name}, Penerima: ${bList.recipients}`)
Baileys dirancang untuk ekstensi & kustomisasi. Kamu tidak perlu fork repo untuk modifikasi — cukup tulis kode kamu sendiri dan panggil lewat API yang disediakan.
Mengaktifkan Log Debug WhatsApp
- Untuk melihat semua pesan mentah dari WhatsApp, aktifkan logger debug saat inisialisasi soket:
import P from 'pino'
const sock = makeWASocket({
logger: P({ level: 'debug' })
})
Ini sangat berguna kalau kamu ingin memahami bagaimana WhatsApp bekerja di balik layar atau mau buat fitur-fitur advance yang gak didokumentasikan.
Bagaimana WhatsApp Berkomunikasi Dengan Kita
TIP:
Kalau kamu ingin mempelajari protokol komunikasi WhatsApp, disarankan untuk memahami tentang LibSignal Protocol dan Noise Protocol.
Contoh Kasus
Misalnya, kamu ingin melacak persentase baterai dari HP yang terhubung.
Kalau kamu mengaktifkan log debug, maka akan muncul pesan seperti ini di terminal:
{
"level": 10,
"fromMe": false,
"frame": {
"tag": "ib",
"attrs": {
"from": "@s.whatsapp.net"
},
"content": [
{
"tag": "edge_routing",
"attrs": {},
"content": [
{
"tag": "routing_info",
"attrs": {},
"content": {
"type": "Buffer",
"data": [8,2,8,5]
}
}
]
}
]
},
"msg": "communication"
}
Penjelasan Struktur frame
Setiap pesan dari WhatsApp memiliki struktur frame dengan komponen utama berikut:
tag — menandakan tipe pesan (contoh: 'message')
attrs — objek berisi key-value untuk metadata (biasanya mengandung ID pesan)
content — data utama dari isi pesan (contoh: isi teks dari pesan)
Untuk dokumentasi lebih lanjut, lihat struktur WABinary
Daftarkan Callback Untuk Event WebSocket
TIP:
Lihat fungsi onMessageReceived di file socket.ts untuk memahami cara event websocket diproses.
sock.ws.on('CB:edge_routing', (node) => { })
sock.ws.on('CB:edge_routing,id:abcd', (node) => { })
sock.ws.on('CB:edge_routing,id:abcd,routing_info', (node) => { })
Lisensi:
Repositori ini sekarang menggunakan lisensi MIT untuk kebebasan penggunaan dan modifikasi penuh oleh komunitas developer, tanpa batasan dari GPL.