Ruby-Baileys es una base robusta para bots y automatizaciones de WhatsApp Multi-Device, refinada para un flujo más limpio, mejor rendimiento y DX (experiencia de desarrollo) más cómoda.
Está pensada para:
- Bots de atención y soporte.
- Automatización de canales/newsletters.
- Sistemas de mensajería interactiva.
- Gestión avanzada de grupos y presencia.
- Integraciones con servicios externos.
- Envío de texto, imagen, video, audio, documentos y stickers.
- Botones e interacciones (
buttons,interactive). - Encuestas y respuestas de encuesta.
- Ubicación, contactos y mensajes contextuales.
- Envío tipo álbum/carrusel con múltiples imágenes/videos.
- Asociación correcta de cada media con el mensaje padre del álbum.
- Delay configurable para estabilidad en entrega masiva.
- Modo
aiStylepara marcar mensajes con estilo IA. - Integración con envío de metadatos AI en relay cuando corresponda.
- Nuevo
retryConfigensendMessagepara reintentos automáticos ante fallos transitorios. - Backoff exponencial + jitter para evitar ráfagas y mejorar entrega.
- Presencia
composing/pausedopcional durante los intentos para UX más natural. - Cola serial en cifrado de grupos (sender-key) para evitar carreras cuando varios sub-bots envían al mismo grupo al mismo tiempo.
- Crear newsletter.
- Actualizar nombre, descripción y foto.
- Seguir, dejar de seguir, silenciar/reactivar.
- Reaccionar mensajes del canal.
- Obtener metadatos y listados de participación.
- Sanitización del número telefónico para pairing.
- Validación de entradas inválidas.
- Soporte de código de emparejamiento personalizado alfanumérico.
- Reconstrucción correcta de claves de sincronización.
- Escrituras por lote (
bulkWrite) para mejor performance. - Fallback automático a
updateOne/deleteOnecuandobulkWriteno existe.
Ruby-Baileys acepta alias para facilitar uso en español:
albumoálbum➜ flujo de álbum.encuesta➜poll.ubicacion➜location.aiStyle: true➜ marca texto como estilo IA.
npm installRequiere Node.js >= 20.
const { default: makeWASocket } = require('./lib')
const sock = makeWASocket({
// tu config...
})const buttons = [
{ buttonId: 'btn_1', buttonText: { displayText: 'Haz clic en mí' }, type: 1 },
{ buttonId: 'btn_2', buttonText: { displayText: 'Visitar sitio' }, type: 1 }
]
await sock.sendMessage(jid, {
text: 'Elige una opción:',
footer: 'Con amor, Rubychan 💖',
buttons,
headerType: 1
})await sock.sendMessage(jid, {
album: [
{ image: { url: 'https://example.com/pic1.jpg' } },
{ video: { url: 'https://example.com/clip.mp4' } }
],
caption: 'Recuerdos ✨'
})await sock.sendMessage(jid, {
encuesta: {
nombre: '¿Color favorito?',
valores: ['Rojo', 'Azul', 'Verde'],
selectableCount: 1
}
})await sock.sendMessage(jid, {
ubicacion: {
gradosLatitud: 37.422,
gradosLongitud: -122.084,
nombre: 'Googleplex',
direccion: '1600 Amphitheatre Pkwy, Mountain View'
}
})const code = await sock.requestPairingCode('628xxxxxxxxx', 'RUBY2026')
console.log('Pairing code:', code)await sock.newsletterCreate('Ruby Updates', 'Novedades semanales')
await sock.newsletterUpdateDescription('canal@newsletter', 'Actualizaciones frescas ✨')
await sock.newsletterReactMessage('canal@newsletter', '175', '🔥')await sock.sendMessage(jid, {
text: 'Mensaje importante con tolerancia a fallos'
}, {
retryConfig: {
maxAttempts: 4,
delayMs: 700,
backoffMultiplier: 1.7,
jitterMs: 250,
presence: true
}
})- Usa almacenamiento persistente para
authStateen producción. - Activa logs estructurados para auditoría y debugging.
- Aísla reintentos de red y controla timeouts.
- Si envías multimedia intensiva, monitorea uso de CPU/RAM.
npm test
npm run lint- Más utilidades para plantillas interactivas.
- Helpers de flujo para bots conversacionales.
- Mejoras de observabilidad (métricas y tracing).
- Documentación avanzada de despliegue.