MANUAL
WhatsApp Baileys
Introducción
Qué es WhatsApp Baileys?
Baileys es una librería no oficial de código abierto que permite conectar a WhatsApp Web desde Node.js. Es completamente GRATUITA y no requiere ninguna cuenta de negocio ni verificación.
Arquitectura
+----------------+ +-----------------+ +----------------+ +----------------+
| Usuario | --> | WhatsApp Web | --> | Sidecar WA | --> | Fararoni |
| WhatsApp | | (Baileys) | | (:3000) | | Gateway |
+----------------+ +-----------------+ +----------------+ | (:7071) |
+----------------+
|
v
+----------------+
| Agentes LLM |
+----------------+Ventajas
| Característica | Valor |
|---|---|
| Costo | GRATIS |
| Requiere cuenta de negocio | NO |
| Setup | 15 minutos |
| Ideal para | Desarrollo, pruebas, uso personal |
Limitaciones (Advertencia)
| Limitación | Descripción |
|---|---|
| Riesgo de ban | Meta puede bloquear tu número si detecta automatización |
| API no oficial | Baileys puede dejar de funcionar si Meta cambia algo |
| Sin soporte | No hay soporte oficial de Meta |
| Un dispositivo | Solo puede estar vinculado a un dispositivo a la vez |
IMPORTANTE: Para producción empresarial, usa WhatsApp Enterprise.
Cuándo usar Baileys?
- Desarrollo y pruebas locales
- Proyectos personales
- POCs (Proof of Concept)
- Cuando no puedes pagar WhatsApp Enterprise
- Bots de uso moderado (no spam)
Requisitos Previos
Software Necesario
- Node.js 20 o superior
- npm (viene con Node.js)
- Fararoni Core instalado
- Java 25+ con --enable-preview
- Celular con WhatsApp instalado y funcionando
- Número de teléfono activo en WhatsApp
- El celular debe tener conexión a Internet
Puertos
| Puerto | Servicio | Estado Requerido |
|---|---|---|
| 7071 | Gateway REST | Abierto (local) |
| 3000 | Sidecar WhatsApp | Abierto (local) |
# Verificar Node.js (debe ser 20+)
node --version
# Verificar npm
npm --version
# Verificar Java
java --versionCifrado de Canales
| Escenario | Key env var | DEV_MODE | Resultado |
|---|---|---|---|
| Producción con key | "abc123..." | false | Usa la key del env |
| Producción sin key | (vacía) | false | LOG.severe advierte |
| Desarrollo sin key | (vacía) | true | Auto-genera key AES-256 persistente |
# Desarrollo local
export FARARONI_DEV_MODE=true
# La key se genera automáticamenteInstalar el Sidecar
cd /ruta/a/fararoni/fararoni-sidecar-wa
npm installEsto instalará: @whiskeysockets/baileys, express, axios, qrcode-terminal
Configurar Fararoni
Verificar modules.yml
Ubicación: ~/.fararoni/config/modules.yml
channels:
whatsapp:
enabled: true
trust_level: UNTRUSTED_EXTERNAL
egress_url: "http://localhost:3000/send"
capabilities:
- text
- audio
- image
timeout_ms: 5000
retry_count: 3Gateway REST
gateway:
rest:
enabled: true
port: 7071Puesta en Marcha
Orden de Inicio (IMPORTANTE)
1. Fararoni Core (Gateway) <-- PRIMERO
2. Sidecar WhatsApp <-- SEGUNDOTerminal 1: Iniciar Fararoni Core
cd /ruta/a/fararoni/fararoni-core/target
java --enable-preview -jar fararoni-core-1.0.0.jar --serverEsperar hasta ver:
[MODULE-REGISTRY] Loaded module: OmniChannelGatewayModule
[INGRESS] RestIngressServer listening on port 7071Terminal 2: Iniciar Sidecar WhatsApp
cd /ruta/a/fararoni/fararoni-sidecar-wa
npm startLa primera vez, verás un código QR en la terminal.
Escanear Código QR
Ver el QR en Terminal
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ █▀█ █▄ ▀▄█▀▄█ ▄▄▄▄▄ ████
████ █ █ █▀▀▀█ ▄▄▀ ▄█ █ █ ████
...
[INFO] Escanea el código QR con tu WhatsAppAbrir WhatsApp en el Celular
- Abre WhatsApp en tu celular
- Toca los tres puntos (menú) en la esquina superior derecha
- Selecciona "Dispositivos vinculados"
- Toca "Vincular un dispositivo"
- Apunta la cámara al QR en la terminal
Verificar Conexión Exitosa
[INFO] Conexión establecida
[INFO] Sesión guardada en ./baileys_auth_info/
[INFO] WhatsApp conectado. Listo para recibir mensajes.La Sesión se Guarda
La sesión se guarda en fararoni-sidecar-wa/baileys_auth_info/. La próxima vez NO necesitarás escanear de nuevo.
Cuándo Expira la Sesión
| Causa | Descripción |
|---|---|
| Inactividad prolongada | WhatsApp cierra la sesión tras varios días |
| Cierre manual | Si cierras desde "Dispositivos vinculados" |
| Nuevo dispositivo | Si vinculas otro y excedes el límite |
| Actualización de WhatsApp | Puede invalidar sesiones |
| Cambio de red | Cambios drásticos de IP |
Cómo Re-autenticar
cd fararoni-sidecar-wa && rm -rf baileys_auth_info && npm startEliminar baileys_auth_info/ fuerza una autenticación limpia desde cero, ya que las credenciales locales quedan desincronizadas con el servidor de WhatsApp.
Verificar Funcionamiento
Health Check del Gateway
curl http://localhost:7071/gateway/v1/health
# {"status": "healthy", "module": "gateway-rest-omnichannel"}Health Check del Sidecar
curl http://localhost:3000/health
# {"status": "connected", "phone": "+522291234567"}Prueba End-to-End
- Desde otro teléfono, envía un mensaje a tu número de WhatsApp
- Deberías recibir una respuesta automática de Fararoni
Verificar Logs
[INGRESS] +522299876543 -> "Hola, necesito ayuda"
[EGRESS] +522299876543 <- "Hola! Soy Fararoni, en que puedo ayudarte?"Seguridad
Filtro de Grupos
Por defecto, el sidecar SOLO responde a chats privados (1:1).
| Tipo de Chat | Procesado? |
|---|---|
| Chat privado (1:1) | SÍ |
| Grupo | NO |
| Lista de difusión | NO |
Cómo Funciona el Filtro
if (remoteJid.endsWith('@g.us')) {
console.log('[FILTRO] Ignorando mensaje de grupo:', remoteJid);
return;
}Habilitar Grupos Específicos
const ALLOWED_GROUPS = [
'123456789-1234567890@g.us',
'987654321-0987654321@g.us'
];
if (remoteJid.endsWith('@g.us') && !ALLOWED_GROUPS.includes(remoteJid)) {
return;
}Riesgo de Ban
| Práctica | Riesgo |
|---|---|
| Responder a mensajes entrantes | Bajo |
| Enviar mensajes masivos (spam) | MUY ALTO |
| Respuestas muy rápidas (< 1 segundo) | Medio |
| Uso moderado (< 100 mensajes/día) | Bajo |
| Uso intensivo (> 500 mensajes/día) | Alto |
Recomendaciones: Usa Baileys solo para desarrollo y pruebas. Para producción, considera WhatsApp Enterprise. No hagas spam.
Troubleshooting
El QR no aparece
rm -rf baileys_auth_info
npm startError "Session closed" o "Connection Failure"
Causa: La sesión de WhatsApp expiró o fue invalidada.
cd fararoni-sidecar-wa && rm -rf baileys_auth_info && npm startLuego escanea el nuevo QR.
Error "ECONNREFUSED"
Causa: El Gateway no está corriendo.
java --enable-preview -jar fararoni-core-1.0.0.jar --serverEl bot no responde
# Verificar Gateway
curl http://localhost:7071/gateway/v1/health
# Verificar Sidecar
curl http://localhost:3000/healthSi el health dice "disconnected", elimina la sesión y escanea QR de nuevo.
WhatsApp pide vincular de nuevo
rm -rf baileys_auth_info
npm start
# Escanear QR de nuevoError "Número baneado"
- Esperar 24-72 horas y reintentar
- Apelar el ban desde WhatsApp
- Usar otro número
- Considerar WhatsApp Enterprise (sin riesgo de ban)
Comandos Útiles
Health Checks
# Gateway
curl http://localhost:7071/gateway/v1/health
# Sidecar WhatsApp
curl http://localhost:3000/health
# Ver QR actual
curl http://localhost:3000/qrResetear Sesión
cd fararoni-sidecar-wa
rm -rf baileys_auth_info
npm startDetener Servicios
pkill -f "fararoni-core"
pkill -f "fararoni-sidecar-wa"Variables de Entorno
| Variable | Default | Descripción |
|---|---|---|
SIDECAR_PORT | 3000 | Puerto del servidor HTTP |
GATEWAY_URL | http://localhost:7071/gateway/v1/inbound | URL del Gateway |
AUTH_DIR | ./baileys_auth_info | Directorio para sesión |
LOG_LEVEL | info | Nivel de log |
Anexos
Checklist de Implementación
REQUISITOS
[ ] Node.js 20+ instalado
[ ] Fararoni Core instalado
[ ] Java 25+ con --enable-preview
[ ] Celular con WhatsApp
INSTALACIÓN
[ ] npm install ejecutado
[ ] modules.yml tiene whatsapp.enabled: true
PUESTA EN MARCHA
[ ] Gateway corriendo en puerto 7071
[ ] Sidecar corriendo en puerto 3000
[ ] Código QR visible en terminal
VINCULACIÓN
[ ] QR escaneado desde WhatsApp
[ ] Sesión guardada en baileys_auth_info/
PRUEBAS
[ ] Health checks OK
[ ] Mensaje enviado desde otro celular
[ ] Respuesta recibidaDiferencias con Enterprise
| Aspecto | Baileys | Enterprise |
|---|---|---|
| Costo | Gratis | Pago por mensaje |
| Riesgo de ban | Sí | No |
| API | No oficial | Oficial de Meta |
| Setup | 15 min | 2-5 días |
| Soporte | Comunidad | Meta oficial |
| Templates | No | Sí |
| Mensajes masivos | No recomendado | Sí |
| Ideal para | Desarrollo | Producción |
Autor: Equipo Fararoni | Versión: 1.0