Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/KevinhosUTP/Automatizacion-Lurwis/llms.txt

Use this file to discover all available pages before exploring further.

Descripción General

El flujo Receptor es el punto de entrada crítico de la automatización de Lurwis. Actúa como gateway entre Meta (WhatsApp Business API) y el sistema de procesamiento interno. Su función principal es recibir webhooks de manera instantánea, validar su autenticidad, filtrar eventos irrelevantes y agrupar mensajes múltiples de un mismo usuario usando Redis como buffer temporal.
Arquitectura asíncrona: Este flujo responde inmediatamente a Meta (200 OK) y delega el procesamiento al flujo Procesador, evitando timeouts.

Configuración del Webhook

El flujo utiliza un nodo Webhook de n8n configurado para recibir peticiones de la API de WhatsApp Business:
  • Ruta: /meta-verify
  • Métodos HTTP: GET (verificación) y POST (mensajes)
  • Modo de respuesta: responseNode (control manual de respuestas)
  • ID del Webhook: 44c93f39-fc17-4ae4-b36e-034e7bdd40c4
Este webhook debe estar expuesto públicamente con HTTPS válido para que Meta pueda enviar eventos. Se recomienda usar un proxy reverso (Caddy/Nginx) con certificado SSL.

Flujo de Trabajo Detallado

1
Paso 1: Verificación de Meta (Challenge)
2
Cuando Meta intenta verificar el webhook (suscripción inicial), envía una petición GET con parámetros específicos:
3
{
  "hub.mode": "subscribe",
  "hub.verify_token": "meta-verify",
  "hub.challenge": "1234567890"
}
4
Nodo: Catch de errores (If)
5
  • Condiciones verificadas:
    • hub.mode === “subscribe”
    • hub.verify_token === “meta-verify”
  • Respuesta exitosa: Devuelve el valor de hub.challenge con código 200
  • Respuesta fallida: Devuelve 403 Forbidden
  • 6
    Paso 2: Identificación de Mensajes Válidos
    7
    El nodo Identificador de vacíos (If) filtra los eventos para procesar solo mensajes de texto reales:
    8
    Condiciones que deben cumplirse (AND):
    9
  • body.entry[0].changes[0].value.messages no está vacío
  • body.entry[0].changes[0].value.messages[0].text.body contiene texto
  • body.entry[0].changes[0].value.statuses está vacío (no es un estado de “leído”/“entregado”)
  • 10
    Eventos filtrados automáticamente:
    • Actualizaciones de estado (mensaje entregado, leído)
    • Webhooks de confirmación vacíos
    • Mensajes multimedia sin texto (imágenes, videos, audios)
    11
    Paso 3: Extracción de Datos
    12
    Nodo: Extractormensajes (Set)
    13
    Transforma el payload complejo de Meta en un objeto simple con los datos esenciales:
    14
    {
      "from": "51900769907",              // Número del remitente
      "text.body": "Quiero hacer un pedido", // Contenido del mensaje
      "id cliente": "wamid.HBgL...",      // ID único del mensaje
      "id mensajero": "947279508470714",  // Phone Number ID de Meta
      "profile_name": "Kevin",            // Nombre del perfil de WhatsApp
      "mensaje_real": true                // Flag de validación
    }
    
    15
    Campos extraídos del webhook de Meta:
    16
  • body.entry[0].changes[0].value.messages[0].fromfrom
  • body.entry[0].changes[0].value.messages[0].text.bodytext.body
  • body.entry[0].changes[0].value.messages[0].idid cliente
  • body.entry[0].changes[0].value.metadata.phone_number_idid mensajero
  • body.entry[0].changes[0].value.contacts[0].profile.nameprofile_name
  • 17
    Paso 4: Sistema de Buffer en Redis
    18
    Objetivo: Evitar que el bot responda múltiples veces si el cliente envía varios mensajes cortos seguidos (ej: “Hola”, “Quiero”, “Un ceviche”).
    19
    4.1 Búsqueda de Buffer Existente
    20
    Nodo: Buffer: Buscar (Redis GET)
    21
  • Clave: buffer_<número_teléfono> (ej: buffer_51900769907)
  • Operación: Intenta leer el buffer existente
  • Resultado: Devuelve el contenido anterior o null si no existe
  • 22
    4.2 Concatenación de Mensajes
    23
    Nodo: Buffer: Agregar Mensaje (Code)
    24
    Lógica en JavaScript que consolida mensajes:
    25
    let existingBuffer = '';
    try {
      const redisResult = $input.first()?.json;
      existingBuffer = redisResult?.value || '';
    } catch (e) {
      existingBuffer = '';
    }
    
    const newMessage = extractorData?.text?.body || '';
    const userId = extractorData.from;
    
    // Concatenar con salto de línea
    const updatedBuffer = existingBuffer
      ? `${existingBuffer}\n${newMessage}`
      : newMessage;
    
    const now = Date.now();
    
    return {
      json: {
        bufferKey: `buffer_${userId}`,
        timestampKey: `ts_${userId}`,
        metaKey: `meta_${userId}`,
        bufferContent: updatedBuffer,
        timestamp: now,
        userId: userId,
        idMensajero: extractorData['id mensajero'],
        profileName: extractorData.profile_name,
        messageCount: updatedBuffer.split('\n').length
      }
    };
    
    26
    Ejemplo de concatenación:
    27
  • Mensaje 1: “Hola”
  • Mensaje 2: “Quiero un ceviche”
  • Buffer resultante: “Hola\nQuiero un ceviche”
  • 28
    4.3 Almacenamiento en Redis
    29
    Tres claves se guardan en Redis:
    30
  • Buffer de mensajes (Buffer: Guardar)
    • Clave: buffer_<userId>
    • Valor: Mensajes concatenados con \n
    • TTL: 30 segundos
  • Timestamp (Buffer: Timestamp)
    • Clave: ts_<userId>
    • Valor: Timestamp del último mensaje (milisegundos)
    • TTL: 30 segundos
  • Metadatos de Meta (Buffer: Meta)
    • Clave: meta_<userId>
    • Valor: id mensajero (Phone Number ID)
    • TTL: 120 segundos (más largo para mantener contexto)
  • 31
    TTL de 30 segundos: Si el cliente no envía más mensajes en 30 segundos, Redis expira automáticamente las claves. El flujo Procesador debe consumir el buffer antes de que expire.
    32
    Paso 5: Respuesta a Meta
    33
    Nodo: Respond to Webhook2
    34
    Devuelve inmediatamente una respuesta HTTP 200 OK a Meta:
    35
    HTTP/1.1 200 OK
    Content-Type: text/plain
    
    OK
    
    36
    Timeout de Meta: Si el webhook no responde en menos de 20 segundos, Meta marca el endpoint como fallido y puede deshabilitar el webhook tras varios fallos consecutivos.

    Diagrama de Flujo

    Tecnologías Utilizadas

    ComponenteTecnologíaPropósito
    Webhook Servern8n Webhook NodeRecibir peticiones HTTP de Meta
    Buffer TemporalRedisAgrupar mensajes del mismo usuario
    Validaciónn8n If NodeFiltrar eventos no deseados
    Transformaciónn8n Set/Code NodesLimpiar y estructurar datos
    Respuestas HTTPn8n Respond to WebhookComunicación con Meta

    Conexión con Credenciales

    Redis Credential:
    • Nombre: “Buffer Lurwis”
    • ID: LuOIeLYx2ps0SCoP
    • Configuración: Host, puerto, password, DB index
    Asegúrate de que la instancia de Redis esté siempre disponible, ya que caídas del servicio romperían la cadena de procesamiento.

    Manejo de Errores

    Estrategia de Error Handling

    1. Webhook inválido: Responde 403 sin procesar
    2. Mensaje vacío: Ejecuta “No Operation” y responde 403
    3. Error en Redis: El flujo no captura errores de Redis intencionalmente, dejando que falle visiblemente para alertar problemas de infraestructura
    4. Error global: Conectado a un “Error Workflow” que notifica al WhatsApp personal del administrador
    Nota de desarrollo: El código incluye comentarios indicando que el sistema tiene un “Gateway” de notificación de errores conectado al teléfono personal del desarrollador.

    Consideraciones de Seguridad

    1
    Validar Token de Verificación
    2
    El token meta-verify debe coincidir exactamente con el configurado en Meta. Este valor debe guardarse como secreto.
    3
    Validar Firma de Webhook (Pendiente)
    4
    Meta envía headers x-hub-signature y x-hub-signature-256 para verificar autenticidad. Actualmente no implementado en el flujo.
    5
    Recomendación de seguridad: Implementar validación de firma HMAC usando el App Secret de Meta para evitar webhooks falsificados.
    6
    HTTPS Obligatorio
    7
    Meta solo permite webhooks HTTPS. El servidor usa Caddy como proxy reverso para TLS.

    Métricas y Monitoreo

    Indicadores clave del flujo:
    • Tasa de webhooks recibidos vs. procesados
    • TTL expirado (mensajes que no fueron consumidos por el Procesador)
    • Mensajes concatenados por buffer (promedio)
    • Tiempo de respuesta a Meta (debe ser < 5s)

    Flujo Siguiente

    Una vez que los mensajes están en Redis, el flujo Procesador se encarga de:
    1. Leer los buffers cada 10 segundos
    2. Validar el tiempo de espera (8 segundos desde el último mensaje)
    3. Consumir el buffer y procesar con agentes de IA
    4. Enviar respuestas al cliente por WhatsApp

    Código de Ejemplo: Payload de Meta

    {
      "object": "whatsapp_business_account",
      "entry": [
        {
          "id": "746650594705809",
          "changes": [
            {
              "value": {
                "messaging_product": "whatsapp",
                "metadata": {
                  "display_phone_number": "15551933641",
                  "phone_number_id": "947279508470714"
                },
                "contacts": [
                  {
                    "profile": {
                      "name": "Kevin"
                    },
                    "wa_id": "51900769907"
                  }
                ],
                "messages": [
                  {
                    "from": "51900769907",
                    "id": "wamid.HBgLNTE5MDA3Njk5MDcVAgASGBYzRUIwNDRDRDQ4MzBCQ0U5MjE0QTI2AA==",
                    "timestamp": "1771142227",
                    "text": {
                      "body": "Quiero hacer un pedido"
                    },
                    "type": "text"
                  }
                ]
              },
              "field": "messages"
            }
          ]
        }
      ]
    }
    

    Próximos Pasos

    Continúa con la documentación del Procesador para entender cómo se consumen estos buffers y se ejecutan los agentes de IA.

    Build docs developers (and LLMs) love