Logo Talberos

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

Imagen de fallback para artículos


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

  1. Node.js v17 o superior (recomendado).
  2. Instalar Baileys:
    npm install @whiskeysockets/baileys @hapi/boom qrcode-terminal pino dotenv
    

    Nota: qrcode-terminal, pino y dotenv se usan en el ejemplo de conexión. @hapi/boom maneja errores.

  3. 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

  1. No hagas spam: Mantén un uso razonable para evitar baneo.
  2. Protege tus credenciales: Los archivos de autenticación son sensibles.
  3. Verifica compatibilidad: WhatsApp cambia con frecuencia; mantén Baileys actualizado.
  4. 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.