
Compartir:
Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.
Construye un bot de conversión de divisas para WhatsApp con Node.js
Tiempo de lectura: 9 minutos
En este tutorial, vamos a ver cómo construir un simple WhatsApp Chat Bot usando Node.js & Vonage. El Bot será responsable de convertir cualquier número dado de unidades en una moneda base al equivalente en la moneda preferida.
El bot se construirá utilizando la Messages API junto con Expressel Node Framework.
Aquí tienes un ejemplo de mí chateando con el Bot:

Requisitos previos
Ngrok que te permite exponer tu servidor web local a Internet. Para obtener más información sobre cómo configurar su entorno local con Ngrok, puede consultar nuestra documentación.
Ya sea una cuenta de WhatsApp Business o configurar el sandbox de Messages API como haremos en este tutorial para poner los números en la lista blanca.
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Configure su aplicación
Comienza clonando el repositorio en tu máquina local: https://github.com/Dotunj/vonage-whatsapp-bot.
A continuación cd en el directorio del proyecto y ejecuta el siguiente comando para instalar las dependencias del proyecto:
Construir el bot
Cada vez que nuestro bot reciba un mensaje en WhatsApp, Vonage realizará una solicitud HTTP Post Request a un endpoint. La solicitud contendrá la carga útil del mensaje.
app.post("/webhooks/inbound-message", (req, res) => {
eventEmitter.emit("inbound-message", req.body);
return res.send("Received Webhook successfully");
});
Anteriormente, definimos una ruta en /webhooks/inbound-message que emite el evento inbound-message evento utilizando el módulo Event de Node.js y luego devuelve una respuesta 200 a Vonage.
El módulo de Eventos de Node.js incluye la clase EventEmitter que se utiliza para generar y gestionar eventos. Puedes aprender más sobre el manejo y envío de eventos en Node.js aquí.
eventEmitter.on("inbound-message", (body) => {
performCurrencyConversion(body).catch((err) => console.log(err));
});
Cada vez que se emite el evento inbound-message el método eventEmitter.on() también se activa. Esta función registra una función de escucha, que simplemente invoca el método performCurrencyConversion() pasando el contenido del mensaje.
function standardResponse() {
let response = "Welcome to the WhatsApp Bot For Currency Conversion \n";
response += "Please use the following format to chat with the Bot \n";
response += "Convert 5 USD to CAD \n";
response +=
"Where 5 is the number of units to convert, USD is the base currency and CAD is the currency you would like to convert to.";
return response;
}La función standardResponse es una respuesta genérica que informa al usuario de cómo comunicarse con el bot.
El método performCurrencyConversion() se encarga de descifrar el contenido del mensaje enviado al Bot y de enviar una respuesta al usuario.
El contenido del mensaje recibido se convierte en una matriz utilizando split(). Según el formato de mensajería acordado, el número de elementos contenidos en la matriz debe ser 5.
Si después de dividir el contenido del mensaje en una matriz, el número de elementos contenidos en esa matriz es inferior a 5, se envía una respuesta estándar al usuario informándole de cómo hacer uso del Bot.
Si la comprobación de la longitud del contenido del mensaje tiene éxito, ahora podemos asumir con seguridad que los elementos contenidos en los índices 1, 2 y 4 de la matriz serán las unidades, la moneda base y la moneda a la que desea convertir.
Convertir con Coinbase
Ahora que tenemos la divisa base y la divisa a la que estás convirtiendo, podemos comprobar que esos códigos de divisa son válidos y están soportados por Coinbase.
La API de Coinbase proporciona puntos finales para operar con divisas, así como con tipos de cambio. Puede obtener más información sobre la API de Coinbase aquí.
async function getCurrencyCode(baseCurrency, toCurrency) {
try {
const currency = await axios.get(`${coinbaseUrl}/currencies`);
const currencyCode = currency.data.data;
const isSupportedCurrencyCodes = currencyCode.filter(
(c) => c.id === baseCurrency || c.id === toCurrency
);
if (isSupportedCurrencyCodes.length < 2) return;
return isSupportedCurrencyCodes;
} catch (error) {
console.error(error);
}
}
Aquí es donde entra en juego la función getCurrencyCode() entra en juego.
Acepta la baseCurrency junto con el toCurrency y luego hace una llamada a la API https://api.coinbase.com/v2/currencies para obtener una lista de todas las divisas admitidas. A continuación, se realiza una comprobación para asegurarse de que tanto el baseCurrency y el toCurrency se encuentran en la lista de divisas admitidas.
Si no se encuentra ninguno o ninguno de ellos, se envía una respuesta al usuario informándole de que debe proporcionar un código de moneda válido.
A continuación, tras validar los códigos de moneda con la función getCurrencyCode() se llama al método getBaseExchangeRate() se llama al método
async function getBaseExchangeRate(baseCurrency, toCurrency) {
try {
const response = await axios.get(
`${coinbaseUrl}/exchange-rates?currency=${baseCurrency}`
);
const rates = response.data.data.rates;
const baseRate = rates[toCurrency];
return baseRate;
} catch (error) {
console.error(error);
}
}Este método acepta el baseCurrency junto con el toCurrency también.
A continuación, se realiza una llamada API al https://api.coinbase.com/v2/exchange-rates pasando el código baseCurrency como valor del parámetro de consulta currency parámetro de consulta.
Este punto final devuelve los tipos para una unidad de la moneda base. A continuación, sólo tenemos que devolver el tipo equivalente para la moneda toCurrency.
A continuación se muestra un ejemplo de la respuesta recibida al llamar al endpoint utilizando USD como la variable baseCurrency:
"data": {
"currency": "USD",
"rates": {
"AED": "3.673015",
"AFN": "77.06341",
"ALGO": "1.5885623510722797",
"ALL": "104.873298",
"AMD": "481.616228",
"ANG": "1.794578",
"AOA": "589.0",
"ARS": "73.1365",
...Una vez obtenido el tipo de cambio base, basta con multiplicar las unidades por el tipo de cambio base para obtener el importe equivalente en la divisa a la que el usuario intenta convertir y, a continuación, redondear el valor a dos decimales. A continuación, se envía una respuesta al usuario informándole del tipo de cambio.
La función sendWhatsAppMessage() envía una respuesta al usuario a través de WhatsApp.
Se realiza una solicitud HTTP POST al punto final https://messages-sandbox.nexmo.com/v0.1/messages especificando el parámetro from, toy message .
El campo from es el número de WhatsApp API Sandbox. En breve te mostraré cómo obtenerlo y lo añadiremos como parte de nuestras variables de entorno. El campo to es el número que envió el mensaje inicial y se obtiene de la carga útil del mensaje.
Para autenticarnos con la API, especificamos nuestra clave de API de Vonage y nuestra clave secreta. Del mismo modo, obtendremos estos valores en breve y los agregaremos como parte de nuestras variables de entorno.
Configuración de Ngrok
Dado que nuestra aplicación es actualmente local, no hay forma de que Vonage pueda enviar solicitudes POST al punto final que acabamos de crear cada vez que nuestro bot reciba un mensaje. Podemos utilizar Ngrok para configurar una URL pública temporal para que nuestra aplicación sea accesible a través de la web.
Para iniciar la aplicación, ejecute el siguiente comando desde el terminal:
Con la aplicación en ejecución, ejecute el siguiente comando en una segunda ventana de terminal para iniciar ngrok:
En este comando, 3000 se refiere al puerto en el que está escuchando su aplicación Express.
Aparecerá una pantalla similar a la que se muestra a continuación:

Ten en cuenta la segunda URL de reenvío, ya que es la que se utilizará para configurar nuestro Webhook de Vonage.
Configuración de WhatsApp Sandbox
Utilizaremos el Vonage WhatsApp Sandbox para esta demostración, ya que tu empresa debe ser aprobada por WhatsApp antes de poder utilizar su API en producción.
Dirígete a Messages API Sandbox para incluir tu número de WhatsApp en la lista blanca y que podamos probar el bot.

Para añadir tu número de WhatsApp y poder empezar a recibir y enviar mensajes, puedes escanear el código QR a través de WhatsApp o hacer clic en el enlace que se te presenta y pulsar enviar en el mensaje precargado. Toma nota del número de WhatsApp Sandbox, ya que lo añadiremos a nuestra variable de entorno en breve.
A continuación, en la misma pantalla configure la URL para el Webhook de entrada pegando la URL de Ngrok que anotamos anteriormente. No olvides añadir /webhooks/inbound-message al final de la URL.

Vaya a Configuración del panel y tome nota de sus API Key y API Secret.
Añadir variables de entorno
Ya que hemos anotado todas las variables de entorno que necesitará nuestro Bot junto con sus valores, ahora podemos añadirlas a nuestro proyecto. Desde la raíz del directorio de tu proyecto, crea un archivo .env y añade los siguientes valores:
VONAGE_API_KEY=xxxx
VONAGE_API_SECRET=xxxx
VONAGE_FROM_NUMBER=xxxxNo olvides sustituir xxxx por los valores reales que hemos anotado antes.
Pruebas
Puedes probar la funcionalidad del bot enviándole mensajes desde tu smartphone a través de WhatsApp.
Conclusión
En este tutorial, hemos visto cómo podemos construir un sencillo Chatbot de WhatsApp para realizar conversiones de divisas utilizando los tipos de cambio proporcionados por Coinbase. Este tutorial puede servir como guía de inicio para aprender a recibir y enviar mensajes a través de WhatsApp utilizando la API de mensajes de Vonage.
