Ejercicio: Otros proveedores y alternativas a la API directa
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).
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.
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 } };
}