Custom WhatsApp Multi-Device Bot Library β built from scratch, architecturally compatible with
@whiskeysockets/baileys.
| Fitur | Status |
|---|---|
| WebSocket WA Multi-Device | β |
| QR Code login | β |
| Multi-file auth state | β |
| Kirim pesan teks | β |
| Kirim gambar / video / audio | β |
| Kirim dokumen / stiker | β |
| Button Message (patched) | β |
| List Message (patched) | β |
| Template Message β URL & Call (patched) | β |
| Reaction message | β |
| Location message | β |
| Manajemen grup | β |
| Auto-reconnect | β |
| Presence update | β |
| Read receipt | β |
npm installNode.js β₯ 18 diperlukan.
const {
makeWASocket,
useMultiFileAuthState,
DisconnectReason,
} = require('custom-baileys');
async function start() {
const { state, saveCreds } = await useMultiFileAuthState('./auth_info');
const sock = makeWASocket({
auth: state,
saveCreds,
printQRInTerminal: true,
});
sock.on('connection.update', ({ connection, lastDisconnect, qr }) => {
if (connection === 'open') console.log('β
Bot terhubung!');
if (connection === 'close') {
const shouldReconnect =
lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut;
if (shouldReconnect) start();
}
});
sock.on('creds.update', saveCreds);
sock.on('messages.upsert', async ({ messages, type }) => {
if (type !== 'notify') return;
const msg = messages[0];
const from = msg.key.remoteJid;
const body = msg.message?.conversation || '';
console.log('Pesan:', body);
await sock.sendMessage(from, { text: 'Halo!' }, { quoted: msg });
});
}
start();await sock.sendMessage(jid, { text: 'Halo Dunia!' });await sock.sendMessage(jid, { text: 'Ini balasan!' }, { quoted: msg });await sock.sendMessage(jid, {
text: '@628123456789 Halo!',
}, {
mentions: ['628123456789@s.whatsapp.net'],
});await sock.sendMessage(jid, {
text: 'Pilih salah satu opsi:',
footer: 'π€ custom-baileys',
header: 'Menu Utama',
buttons: [
{ buttonId: 'btn_1', displayText: 'β
Ya, Lanjutkan' },
{ buttonId: 'btn_2', displayText: 'β Tidak, Batal' },
{ buttonId: 'btn_3', displayText: 'π Nanti Saja' },
],
}, { quoted: msg });Menangkap balasan button:
sock.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
const body = msg.message?.buttonsResponseMessage?.selectedButtonId;
if (body === 'btn_1') {
await sock.sendMessage(msg.key.remoteJid, { text: 'Kamu memilih Ya!' });
}
});await sock.sendMessage(jid, {
title: 'Pilih Menu',
text: 'Silakan pilih salah satu menu di bawah ini:',
footer: 'π€ Powered by custom-baileys',
buttonText: 'π Buka Daftar Menu',
sections: [
{
title: 'π οΈ Utilitas',
rows: [
{ rowId: 'ping', title: 'π Ping', description: 'Cek status bot' },
{ rowId: 'info', title: 'π Info', description: 'Info bot' },
{ rowId: 'help', title: 'β Help', description: 'Bantuan penggunaan' },
],
},
{
title: 'π΅ Downloader',
rows: [
{ rowId: 'tiktok', title: 'π΅ TikTok', description: 'Download video TikTok' },
{ rowId: 'ytmp3', title: 'π§ YouTube MP3', description: 'Download audio YouTube' },
{ rowId: 'ytmp4', title: 'π¬ YouTube MP4', description: 'Download video YouTube' },
],
},
],
}, { quoted: msg });Menangkap balasan list:
const selectedRowId = msg.message?.listResponseMessage?.singleSelectReply?.selectedRowId;
if (selectedRowId === 'ping') { /* handle ping */ }Template message mendukung tombol URL, tombol Call, dan Quick Reply.
await sock.sendMessage(jid, {
text: 'Hubungi atau kunjungi kami sekarang!',
footer: 'π€ custom-baileys',
header: 'π Informasi Kontak',
templateButtons: [
{
type: 'url',
displayText: 'π Kunjungi Website',
url: 'https://example.com',
},
{
type: 'call',
displayText: 'π Telepon Kami',
phoneNumber: '+6281234567890',
},
{
type: 'quickReply',
displayText: 'β
Saya Tertarik',
id: 'interested',
},
],
}, { quoted: msg });Menangkap balasan template:
const selectedId = msg.message?.templateButtonReplyMessage?.selectedId;
if (selectedId === 'interested') { /* handle */ }// Dari file lokal
await sock.sendMessage(jid, {
image: './foto.jpg',
caption: 'Ini gambar dari file lokal',
});
// Dari URL
await sock.sendMessage(jid, {
image: 'https://example.com/foto.jpg',
caption: 'Ini gambar dari URL',
});
// Dari Buffer
const buf = require('fs').readFileSync('./foto.jpg');
await sock.sendMessage(jid, { image: buf, caption: 'Buffer image' });await sock.sendMessage(jid, {
video: './video.mp4',
caption: 'Video keren!',
});await sock.sendMessage(jid, {
audio: './audio.ogg',
ptt: true, // Voice note (push-to-talk)
});await sock.sendMessage(jid, {
document: './laporan.pdf',
mimetype: 'application/pdf',
fileName: 'Laporan Q3 2024.pdf',
});await sock.sendMessage(jid, {
sticker: './stiker.webp',
});// Metadata grup
const meta = await sock.groupMetadata('1234567890@g.us');
console.log(meta.subject, meta.participants);
// Buat grup
await sock.groupCreate('Nama Grup', [
'628111111111@s.whatsapp.net',
'628222222222@s.whatsapp.net',
]);
// Tambah/hapus/promosi/demosi peserta
await sock.groupParticipantsUpdate('1234567890@g.us', ['628xxx@s.whatsapp.net'], 'add');
await sock.groupParticipantsUpdate('1234567890@g.us', ['628xxx@s.whatsapp.net'], 'remove');
await sock.groupParticipantsUpdate('1234567890@g.us', ['628xxx@s.whatsapp.net'], 'promote');
await sock.groupParticipantsUpdate('1234567890@g.us', ['628xxx@s.whatsapp.net'], 'demote');
// Keluar dari grup
await sock.groupLeave('1234567890@g.us');
// Ubah deskripsi grup
await sock.groupUpdateDescription('1234567890@g.us', 'Deskripsi baru');
// Ubah nama grup
await sock.groupUpdateSubject('1234567890@g.us', 'Nama Baru');
// Dapatkan invite link
const code = await sock.groupInviteCode('1234567890@g.us');
console.log(`https://chat.whatsapp.com/${code}`);custom-baileys/
βββ index.js β Entry point (semua export)
βββ package.json
βββ README.md
βββ src/
β βββ Socket/
β β βββ index.js β WASocket class + makeWASocket()
β β βββ noise.js β Noise protocol (WA MD handshake)
β β βββ binary.js β Binary stanza encode/decode
β β βββ groups.js β Group IQ stanza builders
β βββ Auth/
β β βββ index.js
β β βββ useMultiFileAuthState.js β Session persistence
β β βββ registration.js β Key generation
β βββ Message/
β β βββ index.js
β β βββ builder.js β buildButtonMessage β
buildListMessage β
buildTemplateMessage β
β β βββ media.js β Media upload/download helpers
β βββ Types/
β β βββ index.js β Constants, enums, JID helpers
β βββ Utils/
β βββ index.js β Crypto, ID gen, sleep, backoff
βββ example/
βββ bot.js β Contoh bot lengkap
| Parameter | Default | Keterangan |
|---|---|---|
auth |
(wajib) | Auth state dari useMultiFileAuthState |
saveCreds |
(wajib) | Callback untuk menyimpan credentials |
logger |
null logger | Objek logger (pino-compatible) |
printQRInTerminal |
true |
Print QR ke stdout |
markOnlineOnConnect |
false |
Kirim presence 'available' saat connect |
connectTimeoutMs |
20000 |
Timeout koneksi (ms) |
defaultQueryTimeoutMs |
60000 |
Timeout query IQ (ms) |
- Signal Encryption: Stub implementasi β untuk production, integrasikan
libsignaluntuk enkripsi end-to-end yang sesungguhnya. - Media CDN: Download media dari CDN WA memerlukan implementasi
mediaKeydecryption (AES-256-CBC + HMAC-SHA256). - QR Code: QR yang dihasilkan adalah struktural demo. Untuk QR yang bisa di-scan, diperlukan
refdari server WA dan signing dengan identity key. - Button/List/Template: Protobuf telah di-patch sedemikian rupa agar compatible dengan klien WA MD. Render interaktif bergantung pada versi WA klien pengguna.
MIT Β© custom-baileys contributors