Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: Otros proveedores y alternativas a la API directa

  • ⏱ 40 minutos
  • 📶 Nivel: intermedio

Objetivo

Comparar proveedores con números, recomendar un camino según el perfil del proyecto y escribir el adaptador de entrada de Twilio, para comprobar que cambiar de proveedor solo toca la carcasa del bot.

Cómo se trabaja

La parte A es de investigación en las páginas oficiales. La parte B son cuatro funciones de JavaScript puro que se comprueban en esta página. Los precios que uses en la parte B son inventados y solo sirven para practicar la cuenta: nunca cotices con ellos.

💡 Reto extra

Añade salidaATwilio(para, respuesta) que convierta una respuesta de tipo texto del motor en el cuerpo { To: "whatsapp:+<para>", Body: texto }, y que lance un error para los demás tipos (explica en un comentario por qué los botones necesitan plantillas o contenido especial en ese proveedor: revisa su documentación antes de decidir).

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: La suma de costos

Usa valores por defecto al desestructurar: { cuotaFija = 0, tarifaProveedor = 0, ... }. Para redondear a 2 decimales: Math.round(x * 100) / 100.

💡 Pista 2: Orden de las reglas

Las reglas se evalúan de arriba abajo con if ... return. Si el cliente usa una librería no oficial, nada más importa: devuelves "rechazar" primero.

💡 Pista 3: Limpiar el número de Twilio

form.From.replace("whatsapp:", "").replace("+", "") deja solo los dígitos. Revisa typeof form.Body === "string" y que, ya recortado, no esté vacío.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    funciones.js
    function costoMensual({ cuotaFija = 0, tarifaProveedor = 0, mensajes = 0, tarifaMeta = 0, plantillas = 0 } = {}) {
      const total = cuotaFija + tarifaProveedor * mensajes + tarifaMeta * plantillas;
      return Math.round(total * 100) / 100;
    }
    
    function recomendarOpcion({ sabeProgramar, numClientes, quiereSoporte, usaLibreriaNoOficial }) {
      if (usaLibreriaNoOficial) return "rechazar";
      if (!sabeProgramar) return "bsp";
      if (quiereSoporte || numClientes > 5) return "bsp";
      return "api-directa";
    }
    
    const RIESGOS = {
      "api-directa": "bajo",
      "bsp": "bajo",
      "baileys": "alto",
      "whatsapp-web.js": "alto",
    };
    
    function riesgoDeBloqueo(opcion) {
      return RIESGOS[opcion] ?? "desconocido";
    }
    
    function entradaDeTwilio(form) {
      if (!form || typeof form.From !== "string" || typeof form.Body !== "string") return null;
      const texto = form.Body.trim();
      if (!texto) return null;
      const de = form.From.replace("whatsapp:", "").replace("+", "");
      return { de, entrada: { tipo: "texto", texto } };
    }