ꕤ Esta librería está basada en Baileys. No está afiliada ni aprobada oficialmente por WhatsApp.
@fer2809fl/baileys y su desarrollador no se hacen responsables por el mal uso de esta librería. Úsala de forma responsable — nada de spam ni actividades maliciosas.
Puedes instalarla de varias formas, todas funcionan igual:
Opción 1 — Desde npm (recomendado)
npm install @fer2809fl/baileys
yarn add @fer2809fl/baileysOpción 2 — Desde GitHub directamente
npm install github:Fer2809fl/Baileys
yarn add github:Fer2809fl/BaileysOpción 3 — También funciona con el paquete original
npm install @whiskeysockets/baileys
yarn add @whiskeysockets/baileysOpción — En tu package.json (elige una de estas formas):
{
"dependencies": {
"@fer2809fl/baileys": "^1.4.5"
}
}{
"dependencies": {
"@whiskeysockets/baileys": "github:Fer2809fl/Baileys"
}
}const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
async function startBot() {
const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({
auth: state,
printQRInTerminal: true
})
melody.ev.on('connection.update', ({ connection }) => {
if (connection === 'open') console.log('✅ ¡Conectado con éxito!')
if (connection === 'close') console.log('❌ Conexión cerrada, reconectando...')
})
melody.ev.on('messages.upsert', async ({ messages }) => {
const m = messages[0]
if (!m.message) return
await melody.sendMessage(m.key.remoteJid, {
text: '¡Hola! Soy un bot de Delta!'
})
})
melody.ev.on('creds.update', saveCreds)
}
startBot()import makeWASocket, { useMultiFileAuthState, DisconnectReason } from '@fer2809fl/baileys'
import { Boom } from '@hapi/boom'
async function startBot(): Promise<void> {
const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({
auth: state,
printQRInTerminal: true
})
melody.ev.on('connection.update', ({ connection, lastDisconnect }) => {
if (connection === 'close') {
const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
if (shouldReconnect) startBot()
}
if (connection === 'open') console.log('✅ ¡Conectado!')
})
melody.ev.on('messages.upsert', async ({ messages }) => {
const m = messages[0]
if (!m.message) return
await melody.sendMessage(m.key.remoteJid!, {
text: '¡Hola! Soy un bot de Delta!'
})
})
melody.ev.on('creds.update', saveCreds)
}
startBot()- 🚀 Optimizado para mayor velocidad y estabilidad
- 📸 Mensajes multimedia (imágenes, video, audio, documentos)
- 🤖 Comandos personalizados fáciles de implementar
- 👥 Soporte para grupos y chats privados
- 🔘 Mensajes interactivos con botones y listas
- ⚡ Sin Selenium — Conexión directa vía WebSocket
- 💾 Super eficiente — Bajo consumo de RAM
- 📱 Soporte multi-dispositivo — Compatible con WhatsApp Web
- 🔷 Totalmente tipado — TypeScript y JavaScript
- 🔄 Reconexión automática ante desconexiones
- 🔐 Sesiones persistentes guardadas localmente
- 🌐 API completa de WhatsApp Web
// JavaScript
const { makeWASocket, useMultiFileAuthState } = require('@fer2809fl/baileys')
const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({ auth: state, printQRInTerminal: true })
melody.ev.on('creds.update', saveCreds)// TypeScript
import makeWASocket, { useMultiFileAuthState } from '@fer2809fl/baileys'
const { state, saveCreds } = await useMultiFileAuthState('session-mymelody')
const melody = makeWASocket({ auth: state, printQRInTerminal: true })
melody.ev.on('creds.update', saveCreds)// Texto simple
await melody.sendMessage(jid, { text: '¡Hola mundo!' })
// Imagen con caption
await melody.sendMessage(jid, {
image: { url: './images/mymelody.jpg' },
caption: '¡Mira mi nueva foto!'
})
// Video con caption
await melody.sendMessage(jid, {
video: { url: './videos/clip.mp4' },
caption: '¡Nuevo video!'
})
// Audio (PTT = nota de voz)
await melody.sendMessage(jid, {
audio: { url: './audio/nota.mp3' },
mimetype: 'audio/mp4',
ptt: true
})
// Sticker
await melody.sendMessage(jid, {
sticker: { url: './stickers/melody.webp' }
})
// Documento
await melody.sendMessage(jid, {
document: { url: './archivo.pdf' },
mimetype: 'application/pdf',
fileName: 'archivo.pdf'
})
// Reaccionar a un mensaje
await melody.sendMessage(jid, {
react: { text: '💖', key: m.key }
})melody.ev.on('messages.upsert', async ({ messages }) => {
const m = messages[0]
const body = m.message?.conversation
|| m.message?.extendedTextMessage?.text
|| ''
const prefix = '!'
if (!body.startsWith(prefix)) return
const [cmd, ...args] = body.slice(prefix.length).trim().split(' ')
switch (cmd.toLowerCase()) {
case 'hola':
await melody.sendMessage(m.key.remoteJid, {
text: '¡Hola! Soy Delta, ¿en qué puedo ayudarte?'
})
break
case 'ping':
await melody.sendMessage(m.key.remoteJid, {
text: '🏓 Pong!'
})
break
case 'stickers':
await melody.sendMessage(m.key.remoteJid, {
text: '¡Aquí tienes stickers lindos!'
})
break
default:
await melody.sendMessage(m.key.remoteJid, {
text: `Comando desconocido: ${cmd}`
})
}
})melody.ev.on('messages.upsert', async ({ messages }) => {
const m = messages[0]
const body: string = m.message?.conversation
?? m.message?.extendedTextMessage?.text
?? ''
const prefix = '!'
if (!body.startsWith(prefix)) return
const [cmd, ...args]: string[] = body.slice(prefix.length).trim().split(' ')
const commands: Record<string, () => Promise<void>> = {
hola: async () => {
await melody.sendMessage(m.key.remoteJid!, {
text: '¡Hola! Soy My Melody, ¿en qué puedo ayudarte?'
})
},
ping: async () => {
await melody.sendMessage(m.key.remoteJid!, { text: '🏓 Pong!' })
},
info: async () => {
await melody.sendMessage(m.key.remoteJid!, {
text: `📌 JID: ${m.key.remoteJid}\n👤 Sender: ${m.key.participant ?? m.key.remoteJid}`
})
}
}
await commands[cmd.toLowerCase()]?.()
})const melody = makeWASocket({
auth: state,
printQRInTerminal: true,
markOnlineOnConnect: false,
browser: ["Delta", "Chrome", "1.0.0"],
logger: require('pino')({ level: 'silent' }),
syncFullHistory: false,
generateHighQualityLinkPreview: true
})import pino from 'pino'
const melody = makeWASocket({
auth: state,
printQRInTerminal: true,
markOnlineOnConnect: false,
browser: ["Delta", "Chrome", "1.0.0"] as [string, string, string],
logger: pino({ level: 'silent' }),
syncFullHistory: false,
generateHighQualityLinkPreview: true
})async function broadcastMessage(jids, message) {
for (const jid of jids) {
await melody.sendMessage(jid, { text: message })
await new Promise(r => setTimeout(r, 1000)) // delay para evitar ban
}
}const { downloadMediaMessage } = require('@fer2809fl/baileys')
melody.ev.on('messages.upsert', async ({ messages }) => {
const m = messages[0]
if (!m.message?.imageMessage) return
const buffer = await downloadMediaMessage(m, 'buffer', {})
require('fs').writeFileSync('./imagen_recibida.jpg', buffer)
console.log('✅ Imagen guardada')
})const metadata = await melody.groupMetadata(jid)
console.log('Nombre:', metadata.subject)
console.log('Participantes:', metadata.participants.length)await melody.sendMessage(jid, {
text: '@1234567890 ¡Hola!',
mentions: ['1234567890@s.whatsapp.net']
})import makeWASocket, { WASocket, proto } from '@fer2809fl/baileys'
// Tipo para un mensaje con datos del remitente
type MessageWithSender = proto.IWebMessageInfo & {
senderName?: string
isGroup?: boolean
}
// Función tipada para procesar mensajes
async function processMessage(
sock: WASocket,
msg: MessageWithSender
): Promise<void> {
const jid = msg.key.remoteJid!
const text = msg.message?.conversation ?? ''
if (text === '!tipo') {
await sock.sendMessage(jid, {
text: `Tipo de chat: ${msg.isGroup ? 'Grupo' : 'Privado'}`
})
}
}mi-bot/
├── index.js # Entrada principal
├── config.js # Configuración general
├── commands/
│ ├── hola.js
│ ├── ping.js
│ └── stickers.js
├── events/
│ ├── messages.js
│ └── connection.js
├── utils/
│ └── helpers.js
└── session-mymelody/ # Sesión guardada automáticamente
- 📦 npm: npmjs.com/package/@fer2809fl/baileys
- 💻 Repositorio: github.com/Fer2809fl/Baileys
- 🐛 Issues: github.com/Fer2809fl/Baileys/issues
Desarrollado con 🤍 por Fer2809fl
