wileys
v0.4.2
Published
WhatsApp Web API Library
Maintainers
Readme
Wileys
💝 Donasi
Dukung pengembangan proyek ini:
Salin and paste di browser :
https://cdn.yupra.my.id/yp/eocz6gnv.html✨ Fitur Utama
- 🚀 Modern & Cepat - Dibangun dengan TypeScript dan teknologi terbaru
- 🔧 Perbaikan @lid & @jid - Mengatasi masalah @lid ke @pn di grup WhatsApp
- 📱 Dukungan Multi-Device - Mendukung koneksi multi-device WhatsApp
- 🔐 Enkripsi End-to-End - Komunikasi terenkripsi penuh
- 📨 Semua Jenis Pesan - Dukung teks, media, polling, dll.
⚠️ Peringatan
Proyek ini tidak berafiliasi, terkait, diotorisasi, didukung, atau terhubung secara resmi dengan WhatsApp atau anak perusahaannya. Situs resmi WhatsApp ada di whatsapp.com.
Pengelola Wileys tidak mendukung penggunaan aplikasi ini untuk melanggar Ketentuan Layanan WhatsApp. Kami menekankan tanggung jawab pribadi pengguna untuk menggunakan secara adil dan bertanggung jawab.
Gunakan dengan bijak. Hindari spam. Jangan gunakan otomatisasi berlebihan.
📦 Instalasi
Versi Stabil (Direkomendasikan)
npm i wileysVersi Edge (Fitur Terbaru)
npm i wileys@latest
# atau
yarn add wileys@latestImpor di Kode
const { default: makeWASocket } = require("wileys")
// atau ES6
import makeWASocket from "wileys"🚀 Mulai Cepat
Contoh Dasar
const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('wileys')
const { Boom } = require('@hapi/boom')
async function connectToWhatsApp() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
const sock = makeWASocket({
auth: state,
printQRInTerminal: true,
browser: ['Wileys', 'Desktop', '3.0']
})
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 tertutup karena ', lastDisconnect.error, ', reconnecting ', shouldReconnect)
if(shouldReconnect) {
connectToWhatsApp()
}
} else if(connection === 'open') {
console.log('✅ Berhasil terhubung ke WhatsApp!')
}
})
sock.ev.on('messages.upsert', async ({ messages }) => {
for (const m of messages) {
if (!m.message) continue
console.log('📱 Pesan baru:', JSON.stringify(m, undefined, 2))
// Balas otomatis
await sock.sendMessage(m.key.remoteJid!, {
text: 'Halo! Saya bot WhatsApp menggunakan Wileys 🤖'
})
}
})
sock.ev.on('creds.update', saveCreds)
}
connectToWhatsApp()📋 Daftar Isi
Disclaimer : Docs ini masih dalam tahap beta, jadi ada kesalahan atau ketidaksesuaian
🔌 Koneksi Akun
WhatsApp menyediakan API multi-device yang memungkinkan Wileys terautentikasi sebagai klien WhatsApp sekunder melalui QR code atau pairing code.
Hubungkan dengan QR Code
[!TIP]
Sesuaikan nama browser menggunakan konstantaBrowsers. Lihat konfigurasi yang tersedia di bawah.
const { default: makeWASocket, Browsers } = require("wileys")
const sock = makeWASocket({
browser: Browsers.ubuntu('My App'),
printQRInTerminal: true
})Setelah koneksi berhasil, QR code akan muncul di terminal. Pindai dengan WhatsApp di ponsel Anda untuk login.
Hubungkan dengan Pairing Code
[!IMPORTANT]
Pairing code bukan bagian dari Mobile API. Ini memungkinkan koneksi WhatsApp Web tanpa QR code, tapi hanya satu perangkat. Lihat FAQ WhatsApp.
Nomor telepon harus tanpa +, (), atau -, dan sertakan kode negara.
const { default: makeWASocket } = require("wileys")
const sock = makeWASocket({
printQRInTerminal: false
})
// Pairing Normal
if (!sock.authState.creds.registered) {
const number = '6285134816783'
const code = await sock.requestPairingCode(number)
console.log('🔑 Kode Pairing:', code)
}
// Pairing Kustom
if (!sock.authState.creds.registered) {
const pair = "YP240125" // 8 karakter
const number = '6285134816783'
const code = await sock.requestPairingCode(number, pair)
console.log('🔑 Kode Pairing Kustom:', code)
}Terima Riwayat Lengkap
- Setel
syncFullHistoryketrue. - Secara default, Wileys menggunakan konfigurasi Chrome. Untuk koneksi seperti desktop (untuk riwayat pesan lebih banyak), gunakan:
const { default: makeWASocket, Browsers } = require("wileys")
const sock = makeWASocket({
browser: Browsers.macOS('Desktop'),
syncFullHistory: true
})⚙️ Catatan Penting Konfigurasi Socket
Caching Metadata Grup (Direkomendasikan)
Untuk penggunaan grup, implementasikan caching metadata grup:
const { default: makeWASocket } = require("wileys")
const NodeCache = require('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)
})Perbaiki Sistem Retry & Dekripsi Vote Poll
Tingkatkan pengiriman pesan dan dekripsi vote poll dengan store:
const sock = makeWASocket({
getMessage: async (key) => await getMessageFromStore(key)
})Terima Notifikasi di Aplikasi WhatsApp
Nonaktifkan status online untuk menerima notifikasi:
const sock = makeWASocket({
markOnlineOnConnect: false
})💾 Simpan Info Auth
Hindari pemindaian QR code berulang dengan menyimpan kredensial:
const makeWASocket = require("wileys").default
const { useMultiFileAuthState } = require("wileys")
async function connect() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
const sock = makeWASocket({ auth: state })
sock.ev.on('creds.update', saveCreds)
}
connect()[!IMPORTANT]
useMultiFileAuthStatemenyimpan status auth di folder. Untuk produksi, gunakan database SQL/No-SQL dan kelola update kunci dengan hati-hati.
const sock = makeWASocket()
sock.ev.on('messages.upsert', ({ messages }) => {
console.log('Dapat pesan:', messages)
})Contoh Mulai
const makeWASocket = require("wileys").default
const { DisconnectReason, useMultiFileAuthState } = require("wileys")
const { Boom } = require('@hapi/boom')
async function connectToWhatsApp() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
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 tertutup karena ', lastDisconnect.error, ', reconnecting ', shouldReconnect)
if(shouldReconnect) {
connectToWhatsApp()
}
} else if(connection === 'open') {
console.log('Koneksi terbuka')
}
})
sock.ev.on('messages.upsert', async ({ messages }) => {
for (const m of messages) {
console.log(JSON.stringify(m, undefined, 2))
console.log('Balas ke', m.key.remoteJid)
await sock.sendMessage(m.key.remoteJid!, { text: 'Halo Dunia' })
}
})
sock.ev.on('creds.update', saveCreds)
}
connectToWhatsApp()Dekripsi Vote Poll
Secara default, vote poll terenkripsi dan ditangani di messages.update:
sock.ev.on('messages.update', event => {
for(const { key, update } of event) {
if(update.pollUpdates) {
const pollCreation = await getMessage(key)
if(pollCreation) {
console.log(
'update poll diterima, agregasi: ',
getAggregateVotesInPollMessage({
message: pollCreation,
pollUpdates: update.pollUpdates,
})
)
}
}
}
})getMessage adalah implementasi store (di pihak Anda).
Ringkasan Event Koneksi Pertama
- Saat koneksi pertama,
connection.updateakan dipicu meminta restart sock. - Kemudian, pesan riwayat diterima di
messaging.history-set.
🗄️ Implementasi Data Store
Wileys tidak menyertakan penyimpanan default untuk obrolan, kontak, atau pesan. Namun, implementasi in-memory sederhana disediakan. Store mendengarkan update obrolan, pesan baru, dll., untuk menjaga data tetap terkini.
[!IMPORTANT]
Saya sangat merekomendasikan membangun data store sendiri, karena menyimpan seluruh riwayat obrolan di memori sangat boros RAM.
const makeWASocket = require("wileys").default
const { makeInMemoryStore } = require("wileys")
const store = makeInMemoryStore({ })
store.readFromFile('./wileys_store.json')
setInterval(() => {
store.writeToFile('./wileys_store.json')
}, 10_000)
const sock = makeWASocket({ })
store.bind(sock.ev)
sock.ev.on('chats.upsert', () => {
console.log('dapat obrolan', store.chats.all())
})
sock.ev.on('contacts.upsert', () => {
console.log('dapat kontak', Object.values(store.contacts))
})Store juga menyediakan fungsi sederhana seperti loadMessages untuk mempercepat pengambilan data.
🆔 Penjelasan ID WhatsApp
id adalah ID WhatsApp, disebut juga jid, untuk orang atau grup tujuan pesan.
Format: [kode negara][nomor telepon]@s.whatsapp.net
Contoh untuk orang: [email protected].
Untuk grup: [email protected].
Untuk daftar siaran: [timestamp pembuatan]@broadcast.
Untuk cerita: status@broadcast.
🔧 Fungsi Utilitas
getContentType- Mengembalikan tipe konten pesangetDevice- Mengembalikan perangkat dari pesanmakeCacheableSignalKeyStore- Mempercepat store authdownloadContentFromMessage- Unduh konten dari pesan
📤 Kirim Pesan
Kirim semua jenis pesan dengan satu fungsi.
Lihat konten pesan yang didukung di bagian di bawah.
Lihat opsi seperti quote di contoh di bawah.
const jid: string
const content: AnyMessageContent
const options: MiscMessageGenerationOptions
sock.sendMessage(jid, content, options)Pesan Non-Media
Pesan Teks
await sock.sendMessage(jid, { text: 'halo dunia' })Pesan Kutipan (bekerja dengan semua tipe)
await sock.sendMessage(jid, { text: 'halo dunia' }, { quoted: message })Sebut Pengguna (bekerja dengan sebagian besar tipe)
@number untuk sebut di teks, opsional.
await sock.sendMessage(
jid,
{
text: '@12345678901',
mentions: ['[email protected]']
}
)Teruskan Pesan
Butuh objek pesan, ambil dari store atau gunakan objek pesan.
const msg = getMessageFromStore() // implementasikan sendiri
await sock.sendMessage(jid, { forward: msg })Pesan Lokasi
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: 24.121231,
degreesLongitude: 55.1121221
}
}
)Pesan Kontak
const vcard = 'BEGIN:VCARD\n'
+ 'VERSION:3.0\n'
+ 'FN:Jeff Singh\n'
+ 'ORG:Ashoka Uni;\n'
+ 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n'
+ 'END:VCARD'
await sock.sendMessage(
id,
{
contacts: {
displayName: 'Jeff',
contacts: [{ vcard }]
}
}
)Pesan Reaksi
Butuh kunci pesan, ambil dari store atau gunakan objek kunci.
await sock.sendMessage(
jid,
{
react: {
text: '💖', // kosongkan untuk hapus reaksi
key: message.key
}
}
)Pin Pesan
Butuh kunci pesan.
Waktu:
| Waktu | Detik | |-------|------------| | 24j | 86.400 | | 7h | 604.800 | | 30h | 2.592.000 |
await sock.sendMessage(
jid,
{
pin: {
type: 1, // 0 untuk hapus
time: 86400,
key: message.key
}
}
)Pesan Poll
await sock.sendMessage(
jid,
{
poll: {
name: 'Poll Saya',
values: ['Opsi 1', 'Opsi 2', ...],
selectableCount: 1,
toAnnouncementGroup: false // atau true
}
}
)Kirim dengan Pratinjau Tautan
- Secara default, WA tidak punya generasi tautan dari web.
- Wileys punya fungsi untuk pratinjau tautan.
- Tambahkan
link-preview-jsdengannpm i link-preview-js. - Kirim tautan:
await sock.sendMessage(
jid,
{
text: 'Halo, ini dikirim menggunakan https://npmjs.com/wileys'
}
)Pesan Media
Pengiriman media (video, stiker, gambar) lebih mudah & efisien.
[!NOTE] Di pesan media, bisa gunakan
{ stream: Stream }atau{ url: Url }atau Buffer langsung, lihat contoh di bawah.
Wileys tidak muat seluruh buffer ke memori; enkripsi sebagai stream.
[!TIP] Gunakan Stream atau Url untuk hemat memori.
Pesan Gif
WA tidak dukung .gif, kirim sebagai .mp4 dengan flag gifPlayback.
await sock.sendMessage(
jid,
{
video: fs.readFileSync('Media/ma_gif.mp4'),
caption: 'halo dunia',
gifPlayback: true
}
)Pesan Video
await sock.sendMessage(
id,
{
video: {
url: './Media/ma_gif.mp4'
},
caption: 'halo dunia',
ptv: false // true untuk video note
}
)Pesan Audio
Konversi dengan ffmpeg: codec: libopus, ac: 1, avoid_negative_ts, make_zero.
Contoh: ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg
await sock.sendMessage(
jid,
{
audio: {
url: './Media/audio.mp3'
},
mimetype: 'audio/mp4'
}
)Pesan Gambar
await sock.sendMessage(
id,
{
image: {
url: './Media/ma_img.png'
},
caption: 'halo dunia'
}
)Pesan View Once
Tambahkan viewOnce: true untuk semua pesan di atas.
await sock.sendMessage(
id,
{
image: {
url: './Media/ma_img.png'
},
viewOnce: true, // bekerja dengan video, audio juga
caption: 'halo dunia'
}
)✏️ Ubah Pesan
Hapus Pesan (untuk semua)
const msg = await sock.sendMessage(jid, { text: 'halo dunia' })
await sock.sendMessage(jid, { delete: msg.key })Catatan: Hapus untuk diri sendiri dukung via chatModify, lihat Ubah Obrolan.
Edit Pesan
Gunakan konten editable.
await sock.sendMessage(jid, {
text: 'teks terupdate di sini',
edit: response.key,
});🖼️ Manipulasi Pesan Media
Thumbnail di Pesan Media
Thumbnail otomatis untuk gambar & stiker jika tambah jimp atau sharp (npm i jimp atau npm i sharp).
Untuk video, butuh ffmpeg terinstal.
Unduh Pesan Media
Untuk simpan media yang diterima:
import { createWriteStream } from 'fs'
import { downloadMediaMessage, getContentType } from 'wileys'
sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
if (!m.message) return
const messageType = getContentType(m)
if (messageType === 'imageMessage') {
const stream = await downloadMediaMessage(
m,
'stream', // atau 'buffer'
{ },
{
logger,
reuploadRequest: sock.updateMediaMessage
}
)
const writeStream = createWriteStream('./my-download.jpeg')
stream.pipe(writeStream)
}
})Unggah Ulang Pesan Media ke WhatsApp
WA hapus media lama dari server. Unggah ulang dengan:
await sock.updateMediaMessage(msg)📞 Tolak Panggilan
Ambil callId dan callFrom dari event call.
await sock.rejectCall(callId, callFrom)💬 Status Kirim di Obrolan
Baca Pesan
Kumpulan kunci pesan harus ditandai dibaca secara eksplisit.
const key: WAMessageKey
await sock.readMessages([key]) // bisa multiple kunciID pesan adalah pengenal unik. Akses dengan message.key.id.
Update Kehadiran
presence bisa: available, composing, recording, paused, unavailable.
Berlaku 10 detik. Beri tahu jid apakah Anda online, offline, mengetik, dll.
await sock.sendPresenceUpdate('available', jid) [!NOTE] Jika klien desktop aktif, WA tidak kirim notifikasi push. Untuk terima notifikasi, setel offline dengan
sock.sendPresenceUpdate('unavailable').
📁 Ubah Obrolan
WA gunakan komunikasi terenkripsi untuk update obrolan/aplikasi.
[!IMPORTANT] Jika salah update, WA bisa logout dari semua perangkat.
Arsipkan Obrolan
const lastMsgInChat = await getLastMessageInChat(jid) // implementasikan sendiri
await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)Bisukan/Buka Bisukan Obrolan
Waktu dukung:
| Waktu | Milidetik | |-------|-------------| | Hapus | null | | 8j | 86.400.000 | | 7h | 604.800.000 |
// Bisukan 8 jam
await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)
// Buka bisukan
await sock.chatModify({ mute: null }, jid)Tandai Obrolan Dibaca/Tidak Dibaca
const lastMsgInChat = await getLastMessageInChat(jid)
// tandai tidak dibaca
await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, jid)Hapus Pesan untuk Saya
await sock.chatModify(
{
clear: {
messages: [
{
id: 'ATWYHDNNWU81732J',
fromMe: true,
timestamp: '1654823909'
}
]
}
},
jid
)Hapus Obrolan
const lastMsgInChat = await getLastMessageInChat(jid)
await sock.chatModify({
delete: true,
lastMessages: [
{
key: lastMsgInChat.key,
messageTimestamp: lastMsgInChat.messageTimestamp
}
]
},
jid
)Pin/Hapus Pin Obrolan
await sock.chatModify({
pin: true // atau false untuk hapus pin
},
jid
)Bintangi/Hapus Bintang Pesan
await sock.chatModify({
star: {
messages: [
{
id: 'messageID',
fromMe: true // atau false
}
],
star: true // true: Bintangi; false: Hapus Bintang
}
},
jid
)Pesan Menghilang
Ephemeral:
| Waktu | Detik | |-------|-------------| | Hapus | 0 | | 24j | 86.400 | | 7h | 604.800 | | 90h | 7.776.000 |
Gunakan detik, default 7 hari.
// Nyalakan pesan menghilang
await sock.sendMessage(
jid,
{ disappearingMessagesInChat: WA_DEFAULT_EPHEMERAL }
)
// Kirim sebagai pesan menghilang
await sock.sendMessage(jid, { text: 'halo' }, { ephemeralExpiration: WA_DEFAULT_EPHEMERAL })
// Matikan
await sock.sendMessage(
jid,
{ disappearingMessagesInChat: false }
)👤 Query Pengguna
Periksa ID Ada di WhatsApp
const [result] = await sock.onWhatsApp(jid)
if (result.exists) console.log(`${jid} ada di WhatsApp, sebagai jid: ${result.jid}`)Query Riwayat Obrolan (grup juga)
Butuh pesan tertua di obrolan.
const msg = await getOldestMessageInChat(jid) // implementasikan sendiri
await sock.fetchMessageHistory(
50, // jumlah (max: 50 per query)
msg.key,
msg.messageTimestamp
)Pesan diterima di event messaging.history-set.
Ambil Status
const status = await sock.fetchStatus(jid)
console.log('status: ' + status)Ambil Foto Profil (grup juga)
// resolusi rendah
const ppUrl = await sock.profilePictureUrl(jid)
console.log(ppUrl)
// resolusi tinggi
const ppUrl = await sock.profilePictureUrl(jid, 'image')Ambil Profil Bisnis (deskripsi atau kategori)
const profile = await sock.getBusinessProfile(jid)
console.log('deskripsi bisnis: ' + profile.description + ', kategori: ' + profile.category)Ambil Kehadiran Seseorang (mengetik atau online)
sock.ev.on('presence.update', console.log)
await sock.presenceSubscribe(jid) 🔄 Ubah Profil
Ubah Status Profil
await sock.updateProfileStatus('Halo Dunia!')Ubah Nama Profil
await sock.updateProfileName('Nama Saya')Ubah Foto Tampilan (grup juga)
[!NOTE] Seperti pesan media, gunakan
{ stream: Stream }atau{ url: Url }atau Buffer, lihat Pesan Media.
await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' })Hapus Foto Tampilan (grup juga)
await sock.removeProfilePicture(jid)👥 Grup
Untuk ubah properti grup, harus admin.
Buat Grup
const group = await sock.groupCreate('Grup Saya', ['[email protected]', '[email protected]'])
console.log('grup dibuat dengan id: ' + group.gid)
await sock.sendMessage(group.id, { text: 'halo semuanya' })Tambah/Hapus atau Turunkan/Naikkan
await sock.groupParticipantsUpdate(
jid,
['[email protected]', '[email protected]'],
'add' // ganti dengan 'remove', 'demote', atau 'promote'
)Ubah Subjek (nama)
await sock.groupUpdateSubject(jid, 'Subjek Baru!')Ubah Deskripsi
await sock.groupUpdateDescription(jid, 'Deskripsi Baru!')Ubah Pengaturan
// Hanya admin kirim pesan
await sock.groupSettingUpdate(jid, 'announcement')
// Semua bisa kirim
await sock.groupSettingUpdate(jid, 'not_announcement')
// Semua bisa ubah pengaturan grup
await sock.groupSettingUpdate(jid, 'unlocked')
// Hanya admin ubah pengaturan
await sock.groupSettingUpdate(jid, 'locked')Keluar Grup
await sock.groupLeave(jid)Ambil Kode Undangan
Buat tautan: 'https://chat.whatsapp.com/' + code.
const code = await sock.groupInviteCode(jid)
console.log('kode grup: ' + code)Cabut Kode Undangan
const code = await sock.groupRevokeInvite(jid)
console.log('Kode grup baru: ' + code)Gabung Menggunakan Kode Undangan
Kode tanpa https://chat.whatsapp.com/.
const response = await sock.groupAcceptInvite(code)
console.log('bergabung ke: ' + response)Ambil Info Grup dari Kode Undangan
const response = await sock.groupGetInviteInfo(code)
console.log('info grup: ' + response)Query Metadata (peserta, nama, deskripsi...)
const metadata = await sock.groupMetadata(jid)
console.log(metadata.id + ', judul: ' + metadata.subject + ', deskripsi: ' + metadata.desc)Gabung Menggunakan groupInviteMessage
const response = await sock.groupAcceptInviteV4(jid, groupInviteMessage)
console.log('bergabung ke: ' + response)Ambil Daftar Permintaan Gabung
const response = await sock.groupRequestParticipantsList(jid)
console.log(response)Setujui/Tolak Permintaan Gabung
const response = await sock.groupRequestParticipantsUpdate(
jid,
['[email protected]', '[email protected]'],
'approve' // atau 'reject'
)
console.log(response)Ambil Semua Metadata Grup yang Diikuti
const response = await sock.groupFetchAllParticipating()
console.log(response)Toggle Ephemeral
Ephemeral:
| Waktu | Detik | |-------|-------------| | Hapus | 0 | | 24j | 86.400 | | 7h | 604.800 | | 90h | 7.776.000 |
await sock.groupToggleEphemeral(jid, 86400)Ubah Mode Tambah
await sock.groupMemberAddMode(
jid,
'all_member_add' // atau 'admin_add'
)🔒 Privasi
Blokir/Buka Blokir Pengguna
await sock.updateBlockStatus(jid, 'block') // Blokir
await sock.updateBlockStatus(jid, 'unblock') // Buka blokirAmbil Pengaturan Privasi
const privacySettings = await sock.fetchPrivacySettings(true)
console.log('pengaturan privasi: ' + privacySettings)Ambil Daftar Blokir
const response = await sock.fetchBlocklist()
console.log(response)Update Privasi Terakhir Dilihat
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock.updateLastSeenPrivacy(value)Update Privasi Online
const value = 'all' // 'match_last_seen'
await sock.updateOnlinePrivacy(value)Update Privasi Foto Profil
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock.updateProfilePicturePrivacy(value)Update Privasi Status
const value = 'all' // 'contacts' | 'contact_blacklist' | 'none'
await sock.updateStatusPrivacy(value)Update Privasi Tanda Terima Baca
const value = 'all' // 'none'
await sock.updateReadReceiptsPrivacy(value)Update Privasi Tambah Grup
const value = 'all' // 'contacts' | 'contact_blacklist'
await sock.updateGroupsAddPrivacy(value)Update Mode Menghilang Default
Ephemeral:
| Waktu | Detik | |-------|-------------| | Hapus | 0 | | 24j | 86.400 | | 7h | 604.800 | | 90h | 7.776.000 |
const ephemeral = 86400
await sock.updateDefaultDisappearingMode(ephemeral)📢 Daftar Siaran & Cerita
Kirim Siaran & Cerita
Pesan bisa dikirim ke siaran & cerita. Tambahkan opsi pesan:
await sock.sendMessage(
jid,
{
image: {
url: url
},
caption: caption
},
{
backgroundColor: backgroundColor,
font: font,
statusJidList: statusJidList,
broadcast: true
}
)Body pesan bisa extendedTextMessage, imageMessage, dll., lihat Pesan Media.
broadcast: true aktifkan mode siaran.
statusJidList: daftar penerima.
ID siaran: 12345678@broadcast.
Query Penerima & Nama Daftar Siaran
const bList = await sock.getBroadcastListInfo('1234@broadcast')
console.log(`nama daftar: ${bList.name}, penerima: ${bList.recipients}`)🛠️ Fungsi Kustom
Wileys dirancang untuk fungsi kustom. Tambahkan ekstensi sendiri tanpa fork.
Aktifkan Level Debug di Log Wileys
const sock = makeWASocket({
logger: P({ level: 'debug' }),
})Ini tampilkan pesan WhatsApp di konsol.
Cara WhatsApp Berkomunikasi
[!TIP] Pelajari protokol WhatsApp dengan Libsignal Protocol dan Noise Protocol.
Contoh: Lacak persentase baterai ponsel. Aktifkan log, pesan baterai muncul:
{
"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"
}'frame' punya: tag (jenis frame), attrs (metadata), content (data).
Daftarkan Callback untuk Event Websocket
[!TIP] Lihat fungsi
onMessageReceiveddisocket.ts.
// Untuk tag 'edge_routing'
sock.ws.on('CB:edge_routing', (node: BinaryNode) => { })
// Dengan id 'abcd'
sock.ws.on('CB:edge_routing,id:abcd', (node: BinaryNode) => { })
// Dengan node routing_info
sock.ws.on('CB:edge_routing,id:abcd,routing_info', (node: BinaryNode) => { })💡 Tips & Praktik Terbaik
- Gunakan Caching: Cache metadata grup untuk performa lebih baik.
- Tangani Rekoneksi: Implementasikan auto-reconnect untuk kestabilan.
- Kelola Store: Gunakan database (MongoDB, PostgreSQL) untuk produksi.
- Penanganan Error: Bungkus panggilan socket dengan try-catch.
- Batas Rate: Hormati batas WhatsApp untuk hindari ban—jangan spam.
- Keamanan: Jangan bagikan kredensial auth; gunakan variabel lingkungan.
📄 Lisensi
Didistribusikan di bawah Lisensi GPL-3.0. Lihat LICENSE untuk info lebih lanjut.
