Guía Completa de Baileys para WhatsApp en Node.js (JavaScript)
Aprende a usar la biblioteca Baileys para automatizar WhatsApp en Node.js con ejemplos en JavaScript. Descubre la instalación, autenticación, envío de mensajes, gestión de grupos y más.
2 de abril de 2025

Guia Completa de Baileys para WhatsApp en Node.js (JavaScript)
La biblioteca Baileys es una potente librería para interactuar con WhatsApp utilizando Node.js. En esta guía aprenderás a instalarla, configurar la conexión por código QR, enviar y recibir mensajes, administrar grupos y otras funciones clave.
¿Que es Baileys?
Baileys es una API no oficial de WhatsApp que se conecta mediante WhatsApp Web usando WebSockets. Te permite automatizar acciones como enviar texto, multimedia y administrar grupos, incluso simular estados de presencia. Usa Baileys con responsabilidad para evitar suspensiones de cuenta.
Requisitos e Instalacion
- Node.js v17 o superior (recomendado).
- Instalar Baileys:
npm install @whiskeysockets/baileys @hapi/boom qrcode-terminal pino dotenv
Nota:
qrcode-terminal
,pino
ydotenv
se usan en el ejemplo de conexión.@hapi/boom
maneja errores. - Dependencias opcionales para procesar imágenes, videos o stickers:
sharp
,jimp
,ffmpeg
, etc.
Ejemplo de Conexion
A continuación, un archivo conecion.js
completo para conectarse a WhatsApp, mostrar el código QR en consola y escuchar los mensajes entrantes.
/*****************************************************************************
* Archivo: ./conecion.js
*-----------------------------------------------------------------------------
* Descripción:
* Versión simplificada del script de conexión a WhatsApp usando Baileys.
* Muestra el código QR en la terminal y escucha mensajes entrantes.
*
* Ejecución:
* node conecion.js [nombreSesion]
*
*****************************************************************************/
require('dotenv').config({ path: '.env.local' });
const fs = require('fs');
const path = require('path');
const qrcode = require('qrcode-terminal');
const pino = require('pino');
const { Boom } = require('@hapi/boom');
const {
default: makeWASocket,
useMultiFileAuthState,
DisconnectReason
} = require('@whiskeysockets/baileys');
// Nombre de la sesión o "mi-sesion" por defecto
const sessionName = process.argv[2] || 'mi-sesion';
const authFolder = path.join(__dirname, 'auth', sessionName);
(async function main() {
try {
// Crear carpeta de credenciales si no existe
if (!fs.existsSync(authFolder)) {
fs.mkdirSync(authFolder, { recursive: true });
}
// Manejo interno de credenciales (Baileys)
const { state, saveCreds } = await useMultiFileAuthState(authFolder);
// Crear socket con logger minimal
const sock = makeWASocket({
auth: state,
logger: pino({ level: 'error' }),
printQRInTerminal: false
});
// Listener de conexión
sock.ev.on('connection.update', (update) => {
const { connection, lastDisconnect, qr } = update;
// Mostrar QR en consola
if (qr) {
console.clear();
console.log(`\n[Sesión: ${sessionName}] Escanea este código QR:\n`);
qrcode.generate(qr, { small: true });
}
// Desconexión
if (connection === 'close') {
const isBoom = lastDisconnect?.error instanceof Boom;
const reasonCode = isBoom ? lastDisconnect.error.output?.statusCode : 0;
const shouldReconnect = reasonCode !== DisconnectReason.loggedOut;
console.error(`[WARN] Conexión cerrada (sesión: ${sessionName}). Reconectar: ${shouldReconnect}`);
if (shouldReconnect) {
setTimeout(() => main(), 5000);
} else {
console.log(`[INFO] Sesión cerrada definitivamente. Elimina /auth/${sessionName} para reiniciar.`);
}
} else if (connection === 'open') {
console.log(`\n[OK] Sesión WhatsApp "${sessionName}" conectada.`);
}
});
// Guardar credenciales cuando cambien
sock.ev.on('creds.update', saveCreds);
// Listener de mensajes entrantes
sock.ev.on('messages.upsert', async ({ messages, type }) => {
for (const msg of messages) {
console.log(`[MENSAJE] Tipo de evento: ${type}\n`, msg);
// Aquí implementas la lógica deseada para cada mensaje
}
});
} catch (error) {
console.error(`[ERROR] No se pudo inicializar la sesión "${sessionName}":`, error);
process.exit(1);
}
})();
Ejecuta con:
node conecion.js
Si deseas múltiples sesiones simultáneas, usa:
node conecion.js sesion2
Enviar Mensajes
Una vez conectado, puedes enviar mensajes de texto, multimedia, etc.
Enviar Texto
// Asumiendo "sock" es tu socket ya conectado
await sock.sendMessage('12345678901@s.whatsapp.net', {
text: 'Hola desde Baileys en JavaScript!'
});
Enviar Imagenes
const fs = require('fs');
await sock.sendMessage('12345678901@s.whatsapp.net', {
image: fs.readFileSync('./ruta/imagen.jpg'),
caption: 'Foto de prueba'
});
Responder con Cita
// "quoted" se refiere a un mensaje previo
await sock.sendMessage('12345678901@s.whatsapp.net', {
text: 'Respuesta citada',
}, {
quoted: mensajeRecibido
});
Menciones
await sock.sendMessage('12345678901@s.whatsapp.net', {
text: 'Hola @12345678901',
mentions: ['12345678901@s.whatsapp.net']
});
Gestion de Grupos
Puedes crear grupos, añadir usuarios, actualizar el asunto, etc.
// Crear grupo
const group = await sock.groupCreate('Nombre del Grupo', [
'12345678901@s.whatsapp.net',
'11122233344@s.whatsapp.net'
]);
console.log('Grupo creado con ID:', group.id);
// Cambiar asunto
await sock.groupUpdateSubject(group.id, 'Asunto Actualizado');
Estados de Presencia
Baileys soporta presencia (online/offline, escribiendo, grabando audio). Sin embargo, usarlo excesivamente puede ser sospechoso para WhatsApp.
Suscribirse a la presencia de un contacto
await sock.presenceSubscribe('12345678901@s.whatsapp.net');
sock.ev.on('presence.update', ({ id, presences }) => {
console.log('Presencia actualizada:', id, presences[id]);
});
Simular que estas escribiendo
await sock.sendPresenceUpdate('composing', '12345678901@s.whatsapp.net');
// Luego
await sock.sendPresenceUpdate('paused', '12345678901@s.whatsapp.net');
Otras Funciones Relevantes
Bloquear Contactos
await sock.updateBlockStatus('12345678901@s.whatsapp.net', 'block');
Archivar/Desarchivar Chat
await sock.chatModify({ archive: true }, '12345678901@s.whatsapp.net');
Borrar Mensaje
await sock.sendMessage('12345678901@s.whatsapp.net', {
delete: {
id: 'ID_DEL_MENSAJE',
fromMe: true
}
});
Consejos y Buenas Practicas
- No hagas spam: Mantén un uso razonable para evitar baneo.
- Protege tus credenciales: Los archivos de autenticación son sensibles.
- Verifica compatibilidad: WhatsApp cambia con frecuencia; mantén Baileys actualizado.
- Evita usar cuentas nuevas sólo para bots. Usa una cuenta con historial de chats.
Conclusion
La biblioteca Baileys te brinda acceso completo a la funcionalidad de WhatsApp Web mediante Node.js en JavaScript puro. Desde enviar mensajes de texto y multimedia, hasta la gestión de grupos y presencia, es ideal para desarrollar bots y automatizaciones.
Recuerda utilizarla de manera responsable, respetar los términos de servicio de WhatsApp y ofrecer valor real sin incurrir en spam. ¡Explora todo lo que Baileys puede hacer por tu proyecto!
© 2025 Gabriel - Proyecto Open Source.