@itsliaaa/baileys
v0.1.15
Published
A simple fork of Baileys for WhatsApp automation
Maintainers
Readme
🌱 @itsliaaa/baileys

A lightweight fork of Baileys with a few fixes and a small adjustment.
⚙️ Changes
🛠️ Internal Adjustments
- 🖼️ Fixed an issue where media could not be sent to newsletters due to an upstream issue.
- 📁 Reintroduced
makeInMemoryStorewith a minimal ESM adaptation and small adjustments for Baileys v7. - 📦 Switched FFmpeg execution from
exectospawnfor safer process handling. - 🗃️ Added
@napi-rs/imageas a supported image processing backend ingetImageProcessingLibrary(), offering a balance between performance and compatibility.
📨 Message Handling & Compatibility
- 👉🏻 Added support for sending interactive message types (button, list, interactive, template, carousel).
- 📩 Added support for album messages, group status messages, status mention messages, sticker pack messages, and several payment-related messages (request payment, payment invite, order, invoice).
- 📰 Simplified sending messages with ad thumbnails via
externalAdReplywithout requiring manualcontextInfo.
🧩 Additional Message Options
- 👁️ Added optional boolean flags for message handling:
ai- AI label on messagementionAll- Mentions all group participants without requiring their JIDs inmentionsormentionedJidephemeral,groupStatus,viewOnceV2,viewOnceV2Extension,interactiveAsTemplate- Message wrappersraw- Build your message manually (DO NOT USE FOR EXPLOITATION)
[!NOTE] 📄 This project is maintained with limited scope and is not intended to replace upstream Baileys.
😞 And, really sorry for my bad english.
📥 Installation
- 📄 Via
package.json
# NPM
"dependencies": {
"@itsliaaa/baileys": "latest"
}
# GitHub
"dependencies": {
"@itsliaaa/baileys": "github:itsliaaa/baileys"
}- ⌨️ Via terminal
# NPM
npm i @itsliaaa/baileys@latest
# GitHub
npm i github:itsliaaa/baileys🧩 Import (ESM & CJS)
// --- ESM
import { makeWASocket } from '@itsliaaa/baileys'
// --- CJS (tested and working on Node.js 24 ✅)
const { makeWASocket } = require('@itsliaaa/baileys')🔧 Usage
🌐 Connect to WhatsApp (Quick Step)
import { makeWASocket, delay, DisconnectReason, useMultiFileAuthState } from '@itsliaaa/baileys'
import { Boom } from '@hapi/boom'
import pino from 'pino'
// --- Connect with pairing code
const myPhoneNumber = '6288888888888'
const logger = pino({ level: 'silent' })
const connectToWhatsApp = async () => {
const { state, saveCreds } = await useMultiFileAuthState('session')
const sock = makeWASocket({
logger,
auth: state
})
sock.ev.on('creds.update', saveCreds)
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if (connection === 'connecting' && !sock.authState.creds.registered) {
await delay(1500)
const code = await sock.requestPairingCode(myPhoneNumber)
console.log('🔗 Pairing code', ':', code)
}
else if (connection === 'close') {
const shouldReconnect = new Boom(connection?.lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut
console.log('⚠️ Connection closed because', lastDisconnect.error, ', reconnecting ', shouldReconnect)
if (shouldReconnect) {
connectToWhatsApp()
}
}
else if (connection === 'open') {
console.log('✅ Successfully connected to WhatsApp')
}
})
sock.ev.on('messages.upsert', async ({ messages }) => {
for (const message of messages) {
if (!message.message) continue
console.log('🔔 Got new message', ':', message)
await sock.sendMessage(message.key.remoteJid, {
text: '👋🏻 Hello world'
})
}
})
}
connectToWhatsApp()🗄️ Implementing a Data Store
[!CAUTION] I highly recommend building your own data store, as keeping an entire chat history in memory can lead to excessive RAM usage.
import { makeWASocket, makeInMemoryStore, delay, DisconnectReason, useMultiFileAuthState } from '@itsliaaa/baileys'
import { Boom } from '@hapi/boom'
import pino from 'pino'
const myPhoneNumber = '6288888888888'
// --- Create your store path
const storePath = './store.json'
const logger = pino({ level: 'silent' })
const connectToWhatsApp = async () => {
const { state, saveCreds } = await useMultiFileAuthState('session')
const sock = makeWASocket({
logger,
auth: state
})
const store = makeInMemoryStore({
logger,
socket: sock
})
store.bind(sock.ev)
sock.ev.on('creds.update', saveCreds)
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect } = update
if (connection === 'connecting' && !sock.authState.creds.registered) {
await delay(1500)
const code = await sock.requestPairingCode(myPhoneNumber)
console.log('🔗 Pairing code', ':', code)
}
else if (connection === 'close') {
const shouldReconnect = new Boom(connection?.lastDisconnect?.error)?.output?.statusCode !== DisconnectReason.loggedOut
console.log('⚠️ Connection closed because', lastDisconnect.error, ', reconnecting ', shouldReconnect)
if (shouldReconnect) {
connectToWhatsApp()
}
}
else if (connection === 'open') {
console.log('✅ Successfully connected to WhatsApp')
}
})
sock.ev.on('chats.upsert', () => {
console.log('✉️ Got chats', store.chats.all())
})
sock.ev.on('contacts.upsert', () => {
console.log('👥 Got contacts', Object.values(store.contacts))
})
// --- Read store from file
store.readFromFile(storePath)
// --- Save store every 3 minutes
setInterval(() => {
store.writeToFile(storePath)
}, 180000)
}
connectToWhatsApp()🪪 WhatsApp IDs Explain
id is the WhatsApp ID, called jid and lid too, of the person or group you're sending the message to.
- It must be in the format
[country code][phone number]@s.whatsapp.net- Example for people:
[email protected]and12699999999@lid. - For groups, it must be in the format
[email protected].
- Example for people:
- For Meta AI, it's
11111111111@bot. - For broadcast lists, it's
[timestamp of creation]@broadcast. - For stories, the ID is
status@broadcast.
✉️ Sending Messages
[!NOTE] You can get the
jidfrommessage.key.remoteJidin the first example.
🔠 Text
sock.sendMessage(jid, {
text: '👋🏻 Hello'
}, {
quoted: message
})🔔 Mention
// --- Regular mention
sock.sendMessage(jid, {
text: '👋🏻 Hello @628123456789',
mentions: ['[email protected]']
}, {
quoted: message
})
// --- Mention all
sock.sendMessage(jid, {
text: '👋🏻 Hello @all',
mentionAll: true
}, {
quoted: message
})😁 Reaction
sock.sendMessage(jid, {
react: {
key: message.key,
text: '✨'
}
}, {
quoted: message
})📌 Pin Message
sock.sendMessage(jid, {
pin: message.key,
time: 86400, // --- Set the value in seconds: 86400 (1d), 604800 (7d), or 2592000 (30d)
type: 1 // --- Or 0 to remove
}, {
quoted: message
})👤 Contact
const vcard = 'BEGIN:VCARD\n'
+ 'VERSION:3.0\n'
+ 'FN:Lia Wynn\n'
+ 'ORG:Waitress;\n'
+ 'TEL;type=CELL;type=VOICE;waid=628123456789:+62 8123 4567 89\n'
+ 'END:VCARD'
sock.sendMessage(jid, {
contacts: {
displayName: 'Lia',
contacts: [
{ vcard }
]
}
}, {
quoted: message
})📍 Location
sock.sendMessage(jid, {
location: {
degreesLatitude: 24.121231,
degreesLongitude: 55.1121221,
name: '👋🏻 I am here'
}
}, {
quoted: message
})📊 Poll
// --- Regular poll message
sock.sendMessage(jid, {
poll: {
name: '🔥 Voting time',
values: ['Yes', 'No'],
selectableCount: 1,
toAnnouncementGroup: false
}
}, {
quoted: message
})
// --- Quiz (only for newsletter)
sock.sendMessage('1211111111111@newsletter', {
poll: {
name: '🔥 Quiz',
values: ['Yes', 'No'],
correctAnswer: 'Yes',
pollType: 1
}
}, {
quoted: message
})
// --- Poll result
sock.sendMessage(jid, {
pollResult: {
name: '📝 Poll Result',
votes: [{
name: 'Nice',
voteCount: 10
}, {
name: 'Nah',
voteCount: 2
}],
pollType: 0 // Or 1 for quiz
}
}, {
quoted: message
})
// --- Poll update
sock.sendMessage(jid, {
pollUpdate: {
metadata: {},
key: message.key,
vote: {
enclv: /* <Buffer> */,
encPayload: /* <Buffer> */
}
}
}, {
quoted: message
})🎞️ Status Mention
sock.sendMessage([jidA, jidB, jidC], {
text: 'Hello! 👋🏻'
})📁 Sending Media Messages
[!NOTE] For media messages, you can pass a
Bufferdirectly, or an object with either{ stream: Readable }or{ url: string }(local file path or HTTP/HTTPS URL).
🖼️ Image
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '🔥 Superb'
}, {
quoted: message
})🎥 Video
sock.sendMessage(jid, {
video: {
url: './path/to/video.mp4'
},
gifPlayback: false, // --- Set true if you want to send video as GIF
ptv: false, // --- Set true if you want to send video as PTV
caption: '🔥 Superb'
}, {
quoted: message
})📃 Sticker
sock.sendMessage(jid, {
sticker: {
url: './path/to/sticker.webp'
}
}, {
quoted: message
})💽 Audio
sock.sendMessage(jid, {
audio: {
url: './path/to/audio.mp3'
},
ptt: false, // --- Set true if you want to send audio as Voice Note
}, {
quoted: message
})🖼️ Album (Image & Video)
sock.sendMessage(jid, {
album: [{
image: {
url: './path/to/image.jpg'
},
caption: '1st image'
}, {
video: {
url: './path/to/video.mp4'
},
caption: '1st video'
}, {
image: {
url: './path/to/image.jpg'
},
caption: '2nd image'
}, {
video: {
url: './path/to/video.mp4'
},
caption: '2nd video'
}]
}, {
quoted: message
})📦 Sticker Pack
[!IMPORTANT] If
sharpor@napi-rs/imageis not installed, thecoverandstickersmust already be in WebP format.
sock.sendMessage(jid, {
cover: {
url: './path/to/image.webp'
},
stickers: [{
data: {
url: './path/to/image.webp'
}
}, {
data: {
url: './path/to/image.webp'
}
}, {
data: {
url: './path/to/image.webp'
}
}],
name: '📦 My Sticker Pack',
publisher: '🌟 Lia Wynn',
description: '@itsliaaa/baileys'
}, {
quoted: message
})👉🏻 Sending Interactive Messages
1️⃣ Buttons
// --- Regular buttons message
sock.sendMessage(jid, {
text: '👆🏻 Buttons!',
footer: '@itsliaaa/baileys',
buttons: [{
text: '👋🏻 SignUp',
id: '#SignUp'
}]
}, {
quoted: message
})
// --- Buttons with Media & Native Flow
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👆🏻 Buttons and Native Flow!',
footer: '@itsliaaa/baileys',
buttons: [{
text: '👋🏻 Rating',
id: '#Rating'
}, {
text: '📋 Select',
sections: [{
title: '✨ Section 1',
rows: [{
header: '',
title: '💭 Secret Ingredient',
description: '',
id: '#SecretIngredient'
}]
}, {
title: '✨ Section 2',
highlight_label: '🔥 Popular',
rows: [{
header: '',
title: '🏷️ Coupon',
description: '',
id: '#CouponCode'
}]
}]
}]
}, {
quoted: message
})2️⃣ List
[!NOTE] It only works in private chat (
@s.whatsapp.net).
sock.sendMessage(jid, {
text: '📋 List!',
footer: '@itsliaaa/baileys',
buttonText: '📋 Select',
title: '👋🏻 Hello',
sections: [{
title: '🚀 Menu 1',
rows: [{
title: '✨ AI',
description: '',
rowId: '#AI'
}]
}, {
title: '🌱 Menu 2',
rows: [{
title: '🔍 Search',
description: '',
rowId: '#Search'
}]
}]
}, {
quoted: message
})3️⃣ Interactive
// --- Native Flow
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '🗄️ Interactive!',
footer: '@itsliaaa/baileys',
optionText: '👉🏻 Select Options', // --- Optional, wrap all native flow into a single list
optionTitle: '📄 Select Options', // --- Optional
couponText: '🏷️ Newest Coupon!', // --- Optional, add coupon into message
couponCode: '@itsliaaa/baileys', // --- Optional
nativeFlow: [{
text: '👋🏻 Greeting',
id: '#Greeting'
}, {
text: '📞 Call',
call: '628123456789'
}, {
text: '📋 Copy',
copy: '@itsliaaa/baileys'
}, {
text: '🌐 Source',
url: 'https://www.npmjs.com/package/baileys'
}, {
text: '📋 Select',
sections: [{
title: '✨ Section 1',
rows: [{
header: '',
title: '🏷️ Coupon',
description: '',
id: '#CouponCode'
}]
}, {
title: '✨ Section 2',
highlight_label: '🔥 Popular',
rows: [{
header: '',
title: '💭 Secret Ingredient',
description: '',
id: '#SecretIngredient'
}]
}]
}],
interactiveAsTemplate: false, // --- Optional, wrap the interactive message into a template
}, {
quoted: message
})
// --- Carousel & Native Flow
sock.sendMessage(jid, {
text: '🗂️ Interactive with Carousel!',
footer: '@itsliaaa/baileys',
cards: [{
image: {
url: './path/to/image.jpg'
},
caption: '🖼️ Image 1',
footer: '🏷️️ Pinterest',
nativeFlow: [{
text: '🌐 Source',
url: 'https://www.npmjs.com/package/baileys'
}]
}, {
image: {
url: './path/to/image.jpg'
},
caption: '🖼️ Image 2',
footer: '🏷️ Pinterest',
couponText: '🏷️ New Coupon!',
couponCode: '@itsliaaa/baileys',
nativeFlow: [{
text: '🌐 Source',
url: 'https://www.npmjs.com/package/baileys'
}]
}, {
image: {
url: './path/to/image.jpg'
},
caption: '🖼️ Image 3',
footer: '🏷️ Pinterest',
optionText: '👉🏻 Select Options',
optionTitle: '📄 Select Options',
couponText: '🏷️ New Coupon!',
couponCode: '@itsliaaa/baileys',
nativeFlow: [{
text: '🛒 Product',
id: '#Product'
}, {
text: '🌐 Source',
url: 'https://www.npmjs.com/package/baileys'
}]
}]
}, {
quoted: message
})4️⃣ Hydrated Template
sock.sendMessage(jid, {
title: '👋🏻 Hello',
image: {
url: './path/to/image.jpg'
},
caption: '🫙 Template!',
footer: '@itsliaaa/baileys',
templateButtons: [{
text: '👉🏻 Tap Here',
id: '#Order'
}, {
text: '🌐 Source',
url: 'https://www.npmjs.com/package/baileys'
}, {
text: '📞 Call',
call: '628123456789'
}]
}, {
quoted: message
})💳 Sending Payment Messages
1️⃣ Invite Payment
sock.sendMessage(jid, {
paymentInviteServiceType: 3 // 1, 2, or 3
})2️⃣ Invoice
[!NOTE] Invoice message are not supported yet.
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
invoiceNote: '🏷️ Invoice'
})3️⃣ Order
sock.sendMessage(chat, {
orderText: '🛍️ Order',
thumbnail: fs.readFileSync('./path/to/image.jpg') // --- Must in buffer format
}, {
quoted: message
})4️⃣ Product
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
product: {
title: '🛒 My Product'
},
businessOwnerJid: '[email protected]' // --- Must included
}, {
quoted: message
})5️⃣ Request Payment
sock.sendMessage(jid, {
text: '💳 Request Payment',
requestPaymentFrom: '[email protected]'
})👁️ Other Message Options
1️⃣ AI Label
[!NOTE] It only works in private chat (
@s.whatsapp.net).
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '🤖 AI Labeled!',
ai: true
}, {
quoted: message
})2️⃣ Ephemeral
[!NOTE] Wrap message into
ephemeralMessage
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👁️ Ephemeral',
ephemeral: true
})3️⃣ External Ad Reply
[!NOTE] Add an ad thumbnail to messages (may not be displayed on some WhatsApp versions).
sock.sendMessage(jid, {
text: '📰 External Ad Reply',
externalAdReply: {
title: '📝 Did you know?',
body: '❓ I dont know',
thumbnail: fs.readFileSync('./path/to/image.jpg'), // --- Must in buffer format
largeThumbnail: false, // --- Or true for bigger thumbnail
url: 'https://www.npmjs.com/package/baileys' // --- Optional, used for WhatsApp internal thumbnail caching and direct URL
}
}, {
quoted: message
})4️⃣ Group Status
[!NOTE] It only works in group chat (
@g.us)
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👥 Group Status!',
groupStatus: true
})5️⃣ Raw
sock.sendMessage(jid, {
extendedTextMessage: {
text: '📃 Built manually from scratch using the raw WhatsApp proto structure',
contextInfo: {
externalAdReply: {
title: '@itsliaaa/baileys',
thumbnail: fs.readFileSync('./path/to/image.jpg'),
sourceApp: 'whatsapp',
showAdAttribution: true,
mediaType: 1
}
}
},
raw: true
}, {
quoted: message
})6️⃣ View Once
[!NOTE] Wrap message into
viewOnceMessage
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👁️ View Once',
viewOnce: true
})7️⃣ View Once V2
[!NOTE] Wrap message into
viewOnceMessageV2
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👁️ View Once V2',
viewOnceV2: true
})8️⃣ View Once V2 Extension
[!NOTE] Wrap message into
viewOnceMessageV2Extension
sock.sendMessage(jid, {
image: {
url: './path/to/image.jpg'
},
caption: '👁️ View Once V2 Extension',
viewOnceV2Extension: true
})🧰 Additional Contents
🏷️ Find User ID (JID|PN/LID)
[!NOTE] The ID must contain numbers only (no +, (), or -) and must include the country code with WhatsApp ID format.
// --- PN (Phone Number)
const phoneNumber = '[email protected]'
const ids = await sock.findUserId(phoneNumber)
console.log('🏷️ Got user ID', ':', ids)
// --- LID (Local Identifier)
const lid = '43411111111111@lid'
const ids = await sock.findUserId(lid)
console.log('🏷️ Got user ID', ':', ids)
// --- Output
// {
// phoneNumber: '[email protected]',
// lid: '43411111111111@lid'
// }
// --- Output when failed
// {
// phoneNumber: '[email protected]',
// lid: 'id-not-found'
// }
// --- Same output shape regardless of input type🔑 Request Custom Pairing Code
[!NOTE] The phone number must contain numbers only (no +, (), or -) and must include the country code.
const phoneNumber = '6281111111111'
const customPairingCode = 'STARFALL'
await sock.requestPairingCode(phoneNumber, customPairingCode)
console.log('🔗 Pairing code', ':', customPairingCode)📣 Newsletter Management
// --- Create a new one
sock.newsletterCreate('@itsliaaa/baileys')
// --- Get info
sock.newsletterMetadata('1231111111111@newsletter')
// --- Demote admin
sock.newsletterDemote('1231111111111@newsletter', '[email protected]')
// --- Change owner
sock.newsletterChangeOwner('1231111111111@newsletter', '[email protected]')
// --- Change name
sock.newsletterUpdateName('1231111111111@newsletter', '📦 @itsliaaa/baileys')
// --- Change description
sock.newsletterUpdateDescription('1231111111111@newsletter', '📣 Fresh updates weekly')
// --- Change photo
sock.newsletterUpdatePicture('1231111111111@newsletter', {
url: 'path/to/image.jpg'
})
// --- Remove photo
sock.newsletterRemovePicture('1231111111111@newsletter')
// --- React to a message
sock.newsletterReactMessage('1231111111111@newsletter', '100', '💛')
// --- Get all subscribed newsletters
const newsletters = await sock.newsletterSubscribed()
console.dir(newsletters, { depth: null })👥 Group Management
// --- Create a new one and add participants using their JIDs
sock.groupCreate('@itsliaaa/baileys', ['[email protected]'])
// --- Get info
sock.groupMetadata(jid)
// --- Get invite code
sock.groupInviteCode(jid)
// --- Revoke invite link
sock.groupRevokeInvite(jid)
// --- Leave group
sock.groupLeave(jid)
// --- Add participants
sock.groupParticipantsUpdate(jid, ['[email protected]'], 'add')
// --- Remove participants
sock.groupParticipantsUpdate(jid, ['[email protected]'], 'remove')
// --- Promote to admin
sock.groupParticipantsUpdate(jid, ['[email protected]'], 'promote')
// --- Demote from admin
sock.groupParticipantsUpdate(jid, ['[email protected]'], 'demote')
// --- Change name
sock.groupUpdateSubject(jid, '📦 @itsliaaa/baileys')
// --- Change description
sock.groupUpdateDescription(jid, 'Updated description')
// --- Change photo
sock.updateProfilePicture(jid, {
url: 'path/to/image.jpg'
})
// --- Remove photo
sock.removeProfilePicture(jid)
// --- Set group as admin only for chatting
sock.groupSettingUpdate(jid, 'announcement')
// --- Set group as open to all for chatting
sock.groupSettingUpdate(jid, 'not_announcement')
// --- Set admin only can edit group info
sock.groupSettingUpdate(jid, 'locked')
// --- Set all participants can edit group info
sock.groupSettingUpdate(jid, 'unlocked')
// --- Set admin only can add participants
sock.groupMemberAddMode(jid, 'admin_add')
// --- Set all participants can add participants
sock.groupMemberAddMode(jid, 'all_member_add')
// --- Enable or disable temporary messages with seconds format
sock.groupToggleEphemeral(jid, 86400)
// --- Disable temporary messages
sock.groupToggleEphemeral(jid, 0)
// --- Enable or disable membership approval mode
sock.groupJoinApprovalMode(jid, 'on')
sock.groupJoinApprovalMode(jid, 'off')
// --- Get all groups metadata
const groups = await sock.groupFetchAllParticipating()
console.dir(groups, { depth: null })
// --- Get pending invites
const invites = await sock.groupGetInviteInfo(code)
console.dir(invites, { depth: null })
// --- Accept group invite
sock.groupAcceptInvite(code)
// --- Get group info from link
const group = await sock.groupGetInviteInfo('https://chat.whatsapp.com/ABC123')
console.log('👥 Got group info from link', ':', group)📦 Fork Base
[!NOTE] This fork is based on Baileys (GitHub)
📣 Credits
[!IMPORTANT] This fork uses Protocol Buffer definitions maintained by WPP Connect via
wa-protoAll rights belong to the original Baileys maintainers and contributors:
