noxXza.exe
noxleyss — Library WhatsApp API Multi‑Device Modern untuk bot dan aplikasi berbasis Node.js.
✨ Fitur Utama
- 🚀 Modern & Cepat – Dibangun dengan TypeScript dan teknologi terkini.
- 🔧 Perbaikan @lid & @jid – Mengatasi masalah ID lokal ke ID ponsel di grup WhatsApp.
- 📱 Dukungan Multi‑Device – Koneksi penuh ke WhatsApp Multi‑Device.
- 🔐 Enkripsi End‑to‑End – Semua pesan terenkripsi.
- 📨 Semua Jenis Pesan – Teks, media (gambar, video, audio), polling, stiker, lokasi, kontak, dan lainnya.
- 🧩 Ringan & Optimal – Performa stabil dengan dukungan streaming media.
- 📂 Manajemen Autentikasi – Simpan kredensial di file atau database.
⚠️ Peringatan
Proyek ini tidak berafiliasi, didukung, atau terhubung secara resmi dengan WhatsApp atau anak perusahaannya. Situs resmi WhatsApp: whatsapp.com.
Pengguna bertanggung jawab penuh atas penggunaan aplikasi ini. Hindari spam dan otomatisasi berlebihan yang melanggar Ketentuan Layanan WhatsApp.
📦 Instalasi
Versi Stabil (Direkomendasikan)
npm install noxleyss
Versi Terbaru (Edge)
npm install noxleyss@latest
yarn add noxleyss@latest
Cara Impor
const { default: makeWASocket } = require("noxleyss")
import makeWASocket from "noxleyss"
🚀 Mulai Cepat
Contoh Dasar (dengan QR Code)
const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('noxleyss')
const { Boom } = require('@hapi/boom')
async function connectToWhatsApp() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
const sock = makeWASocket({
auth: state,
printQRInTerminal: true,
browser: ['noxleyss', '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, 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))
await sock.sendMessage(m.key.remoteJid!, {
text: 'Halo! Saya bot WhatsApp menggunakan noxleyss 🤖'
})
}
})
sock.ev.on('creds.update', saveCreds)
}
connectToWhatsApp()
🔌 Koneksi Akun
WhatsApp menyediakan API multi‑device yang memungkinkan noxleyss terautentikasi sebagai klien WhatsApp sekunder melalui QR code atau pairing code.
Hubungkan dengan QR Code
const { default: makeWASocket, Browsers } = require("noxleyss")
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
Penting: Pairing code memungkinkan koneksi tanpa QR code. Nomor telepon harus tanpa +, (), atau -, dan sertakan kode negara.
const { default: makeWASocket } = require("noxleyss")
const sock = makeWASocket({
printQRInTerminal: false
})
if (!sock.authState.creds.registered) {
const number = '6283134600805'
const code = await sock.requestPairingCode(number)
console.log('🔑 Kode Pairing:', code)
}
if (!sock.authState.creds.registered) {
const pair = "NOXLEYSS"
const number = '6283134600805'
const code = await sock.requestPairingCode(number, pair)
console.log('🔑 Kode Pairing Kustom:', code)
}
Terima Riwayat Lengkap
Untuk menerima riwayat pesan lengkap, setel syncFullHistory ke true.
const { default: makeWASocket, Browsers } = require("noxleyss")
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("noxleyss")
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 { default: makeWASocket, useMultiFileAuthState } = require("noxleyss")
async function connect() {
const { state, saveCreds } = await useMultiFileAuthState('auth_info_noxleyss')
const sock = makeWASocket({ auth: state })
sock.ev.on('creds.update', saveCreds)
}
connect()
Penting: useMultiFileAuthState menyimpan status auth di folder. Untuk produksi, gunakan database SQL/No‑SQL dan kelola update kunci dengan hati‑hati.
🗄️ Implementasi Data Store
noxleyss tidak menyertakan penyimpanan default untuk obrolan, kontak, atau pesan. Namun, implementasi in‑memory sederhana disediakan.
const { default: makeWASocket, makeInMemoryStore } = require("noxleyss")
const store = makeInMemoryStore({ })
store.readFromFile('./noxleyss_store.json')
setInterval(() => {
store.writeToFile('./noxleyss_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))
})
🆔 Penjelasan ID WhatsApp
id adalah ID WhatsApp, disebut juga jid atau m.chat, untuk orang atau grup tujuan pesan.
· Orang: [kode negara][nomor telepon]@s.whatsapp.net
Contoh: +19999999999@s.whatsapp.net
· Grup: 123456789-123345@g.us
· Daftar siaran: [timestamp pembuatan]@broadcast
· Cerita: status@broadcast
🔧 Fungsi Utilitas
· getContentType – Mengembalikan tipe konten pesan
· getDevice – Mengembalikan perangkat dari pesan
· makeCacheableSignalKeyStore – Mempercepat store auth
· downloadContentFromMessage – Unduh konten dari pesan
📤 Kirim Pesan
Kirim semua jenis pesan dengan satu fungsi.
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
await sock.sendMessage(
jid,
{
text: '@12345678901',
mentions: ['12345678901@s.whatsapp.net']
}
)
Teruskan Pesan
const msg = getMessageFromStore()
await sock.sendMessage(jid, { forward: msg })
Pesan Lokasi
await sock.sendMessage(
jid,
{
location: {
degreesLatitude: 0,
degreesLongitude: 0,
name: "noxleyss",
address: "Indonesia"
}
}
)
Pesan Kontak (vCard)
const vcard = 'BEGIN:VCARD\n'
+ 'VERSION:3.0\n'
+ 'FN:noxXza\n'
+ 'ORG:Ashoka Uni;\n'
+ 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n'
+ 'END:VCARD'
await sock.sendMessage(
id,
{
contacts: {
displayName: 'noxXza',
contacts: [{ vcard }]
}
}
)
Pesan Reaksi
await sock.sendMessage(
jid,
{
react: {
text: '👍🏻',
key: message.key
}
}
)
Pin/Sematkan Pesan
await sock.sendMessage(
jid,
{
pin: {
type: 1,
time: 86400,
key: message.key
}
}
)
Pesan Poll
await sock.sendMessage(
jid,
{
poll: {
name: 'Poll Saya',
values: ['Opsi 1', 'Opsi 2', 'Opsi 3'],
selectableCount: 1,
toAnnouncementGroup: false
}
}
)
Kirim dengan Pratinjau Tautan
Instal link-preview-js:
npm install link-preview-js
await sock.sendMessage(
jid,
{
text: 'Halo, ini dikirim menggunakan https://npmjs.com/noxleyss'
}
)
Pesan Media
Catatan: Di pesan media, bisa gunakan { stream: Stream }, { url: Url }, atau Buffer langsung.
Kirim Gambar
await sock.sendMessage(
jid,
{
image: {
url: './Media/ma_img.png'
},
caption: 'halo dunia'
}
)
Kirim Video
await sock.sendMessage(
jid,
{
video: {
url: './Media/ma_video.mp4'
},
caption: 'halo dunia',
ptv: false
}
)
Kirim GIF
await sock.sendMessage(
jid,
{
video: fs.readFileSync('Media/ma_gif.mp4'),
caption: 'halo dunia',
gifPlayback: true
}
)
Kirim Audio
await sock.sendMessage(
jid,
{
audio: {
url: './Media/audio.mp3'
},
mimetype: 'audio/mp4'
}
)
View Once
await sock.sendMessage(
jid,
{
image: {
url: './Media/ma_img.png'
},
viewOnce: true,
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 })
Edit Pesan
await sock.sendMessage(jid, {
text: 'teks terupdate di sini',
edit: response.key,
})
🖼️ Manipulasi Pesan Media
Unduh Pesan Media
import { createWriteStream } from 'fs'
import { downloadMediaMessage, getContentType } from 'noxleyss'
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',
{ },
{
logger,
reuploadRequest: sock.updateMediaMessage
}
)
const writeStream = createWriteStream('./my-download.jpeg')
stream.pipe(writeStream)
}
})
📞 Tolak Panggilan
await sock.rejectCall(callId, callFrom)
💬 Status Kirim di Obrolan
Baca Pesan
await sock.readMessages([key])
Update Kehadiran
await sock.sendPresenceUpdate('available', jid)
await sock.sendPresenceUpdate('composing', jid)
📁 Ubah Obrolan
Arsipkan Obrolan
const lastMsgInChat = await getLastMessageInChat(jid)
await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, jid)
Bisukan/Buka Bisukan Obrolan
await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)
await sock.chatModify({ mute: null }, jid)
Tandai Obrolan Dibaca/Tidak Dibaca
const lastMsgInChat = await getLastMessageInChat(jid)
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 }, jid)
await sock.chatModify({ pin: false }, jid)
Bintangi/Hapus Bintang Pesan
await sock.chatModify({
star: {
messages: [
{
id: 'messageID',
fromMe: true
}
],
star: true
}
}, jid)
Pesan Menghilang
await sock.sendMessage(
jid,
{ disappearingMessagesInChat: 604800 }
)
await sock.sendMessage(jid, { text: 'halo' }, { ephemeralExpiration: 604800 })
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
const msg = await getOldestMessageInChat(jid)
await sock.fetchMessageHistory(
50,
msg.key,
msg.messageTimestamp
)
Ambil Status
const status = await sock.fetchStatus(jid)
console.log('status: ' + status)
Ambil Foto Profil (grup juga)
const ppUrl = await sock.profilePictureUrl(jid)
console.log(ppUrl)
const ppUrlHigh = await sock.profilePictureUrl(jid, 'image')
Ambil Profil Bisnis
const profile = await sock.getBusinessProfile(jid)
console.log('deskripsi: ' + profile.description + ', kategori: ' + profile.category)
Ambil Kehadiran Seseorang
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)
await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' })
Hapus Foto Tampilan (grup juga)
await sock.removeProfilePicture(jid)
👥 Grup
Buat Grup
const group = await sock.groupCreate('Grup Saya', ['1234@s.whatsapp.net', '4564@s.whatsapp.net'])
console.log('grup dibuat dengan id: ' + group.gid)
Tambah/Hapus atau Turunkan/Naikkan
await sock.groupParticipantsUpdate(
jid,
['abcd@s.whatsapp.net', 'efgh@s.whatsapp.net'],
'add'
)
Ubah Subjek (nama)
await sock.groupUpdateSubject(jid, 'Subjek Baru!')
Ubah Deskripsi
await sock.groupUpdateDescription(jid, 'Deskripsi Baru!')
Ubah Pengaturan
await sock.groupSettingUpdate(jid, 'announcement')
await sock.groupSettingUpdate(jid, 'not_announcement')
await sock.groupSettingUpdate(jid, 'unlocked')
await sock.groupSettingUpdate(jid, 'locked')
Keluar Grup
await sock.groupLeave(jid)
Ambil Kode Undangan
const code = await sock.groupInviteCode(jid)
console.log('https://chat.whatsapp.com/' + code)
Cabut Kode Undangan
const code = await sock.groupRevokeInvite(jid)
console.log('Kode grup baru: ' + code)
Gabung Menggunakan Kode Undangan
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
const metadata = await sock.groupMetadata(jid)
console.log(metadata.id + ', judul: ' + metadata.subject + ', deskripsi: ' + metadata.desc)
Ambil Semua Metadata Grup yang Diikuti
const response = await sock.groupFetchAllParticipating()
console.log(response)
Toggle Ephemeral
await sock.groupToggleEphemeral(jid, 86400)
Ubah Mode Tambah
await sock.groupMemberAddMode(
jid,
'all_member_add'
)
🔒 Privasi
Blokir/Buka Blokir Pengguna
await sock.updateBlockStatus(jid, 'block')
await sock.updateBlockStatus(jid, 'unblock')
Ambil Pengaturan Privasi
const privacySettings = await sock.fetchPrivacySettings(true)
console.log(privacySettings)
Ambil Daftar Blokir
const blocklist = await sock.fetchBlocklist()
console.log(blocklist)
Update Privasi
await sock.updateLastSeenPrivacy('contacts')
await sock.updateOnlinePrivacy('all')
await sock.updateProfilePicturePrivacy('contacts')
await sock.updateStatusPrivacy('none')
await sock.updateReadReceiptsPrivacy('all')
await sock.updateGroupsAddPrivacy('contacts')
await sock.updateDefaultDisappearingMode(86400)
📢 Daftar Siaran & Cerita
Kirim Siaran & Cerita
await sock.sendMessage(
jid,
{
image: {
url: url
},
caption: caption
},
{
backgroundColor: backgroundColor,
font: font,
statusJidList: statusJidList,
broadcast: true
}
)
Query Penerima & Nama Daftar Siaran
const bList = await sock.getBroadcastListInfo('1234@broadcast')
console.log(`nama daftar: ${bList.name}, penerima: ${bList.recipients}`)
🛠️ Fungsi Kustom
Aktifkan Level Debug
const { P } = require('noxleyss')
const sock = makeWASocket({
logger: P({ level: 'debug' }),
})
Daftarkan Callback untuk Event Websocket
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) => { })
💡 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.
· Keamanan – Jangan bagikan kredensial auth; gunakan variabel lingkungan.
📄 Lisensi
Didistribusikan di bawah Lisensi GPL‑3.0. Lihat file LICENSE untuk informasi lebih lanjut.
noxleyss — noxleyss
WhatsApp API Modern dengan Perbaikan @lid Ke @pn