Hay muchos escenarios donde el envío de SMS y llamadas automatizadas puede ser necesaria, se le puede recordar a un usuario que su subscripción está por vencer, recordarle que su cita con el Doctor es el dia siguiente e incluso, permitir al usuario responder a dichos eventos por el mismo medio, “responda 2 para cancelar la cita o reagendarla”.
Hoy veremos un ejemplo de cómo podemos automatizar estas notificaciones usando Node.js, Mongodb-cron y Twilio.
¿Cuándo enviar las notificaciones?
El primer problema que debemos resolver para el envío de SMS y llamadas automatizadas es, ¿Cómo automatizar los envíos definiendo la hora y fecha en la que se deben enviar?, el concepto de trabajos que se ejecutan cada cierto tiempo en un horario específico en Unix es resuelto por un proceso llamado “cron” en donde un proceso o demonio lee un archivo de configuración que indica que proceso se debe ejecutar a que hora.
Para nuestra solución usaremos una implementación de crons de más alto nivel que se ejecutan de acuerdo a los documentos en una colección específica de una base de datos MongoDb, mongodb-cron.
Para seguir con este tutorial se recomienda tener instalado mongodb o tener acceso a un servidor que lo tenga ya que necesitaremos una URI de conección.
¿ Como enviar SMS o hacer llamadas desde node.js?
Para realizar llamadas o envíos de SMS vamos a usar el servicio Twilio que nos permite realizar y recibir llamadas y SMS con un API Restful y tienen muy buena documentación en su sitio de desarrollador. El registro es sencillo e incluso dan unos cuantos dólares para pruebas, un ambiente sandbox para en envío de SMS y numeros de prueba para poder hacer las validaciones de los diferentes tipos de error sin tener que gastar.
Usaremos el SDK de Twilio para node.js que se puede encontrar en NPM.
Para seguir con este tutorial se recomienda que se cree una cuenta en Twilio y se tenga a la mano sus credenciales de desarrollo (accountSid y authToken) que aparecen en la página principal del panel de su cuenta.
La solución
Para no extender demasiado la explicación nos enfocaremos en las partes esenciales desde las cuales se puede extender una solución a la medida.
Instalar nuestras dependencias
$ npm i –save mongodb mongodb-cron twilio |
Inicializar coneccion con la base de datos
import { MongoClient } from ‘mongodb’;
const mongo = await MongoClient.connect(process.env.MONGODB_URI); const db = mongo.db(process.env.MONGODB_DB); |
Donde las variables de entorno MONGODB_URI y MONGODB_DB tiene la URI de coneccion a la base de datos de mongodb y el nombre de la base de datos respectivamente.
Inicializar la librería de Twilio.
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const twilioClient = require(‘twilio’)(accountSid, authToken); |
Las variables de entorno TWILIO_ACCOUNT_SID y TWILIO_AUTH_TOKEN tienen las credenciales que se obtienen en el panel de desarrollo de Twilio, se pueden usar las de prueba.
Inicializar los trabajos programados y ejecutar el demonio
import { MongoCron } from ‘mongodb-cron’;
const collection = db.collection(‘jobs’); const cron = new MongoCron({ collection, onDocument, // funcion definida mas adelante onError: async (err) => console.log(“error al procesar un trabajo”, err) });
cron.start(); |
Insertar una tarea (enviar un sms) en la colección de trabajos.
const job = await collection.insert({
sleepUntil: new Date(’25 Dec 2020 12:00:00 GMT’), phoneNumber : “+525551231234”, type : “sms”, // sms | call message : “Hola, solo queremos desearte una feliz navidad!” }); |
El campo sleepUntil indica a mongo-cron que este trabajo debe ejecutarse solo una vez en la fecha especificada, para enviarla de inmediato puede probar con el valor “new Date()” y para trabajos recurrentes se puede usar el campo interval. Más información en la documentación de mongo-cron.
Definir el método que hace el envío de SMS usando Twilio.
sendSMS = function(phoneNumber, message){
twilioClient.messages.create({ body: message, to: phoneNumber from: ‘+15005550006’ }) .then(message => console.log(message.sid)); } |
El número usado en el campo from deberá ser un número de Twilio que esté habilitado para envío de SMS, en el ejemplo se usa un número mágico que siempre responde que el mensaje fue enviado correctamente (solo para desarrollo).
Definir el método que hace una llamada de voz usando Twilio.
makeCall = function(phoneNumber, message){
twilioClient.calls.create({ twiml: ‘<Response><Say>’ + message + ’</Say></Response>’, to: phoneNumber, from: ‘+15005550006’ }) .then(call => console.log(call.sid)); } |
El número usado en el campo from deberá ser un número de Twilio que esté habilitado para envío de llamadas de voz. Más información sobre el formato de XML para voz en la documentación de Twiml.
Definir la función que se encarga de procesar un trabajo
onDocument = function(job){
switch(job.type){ case ‘sms’: sendSMS(job.phoneNumber, job.message); break; case ‘call’: makeCall(job.phoneNumber, job.message); break; } } |
Siguiendo este sencillo ejemplo se puede usar como base para soluciones mucho más complejas, como recibir respuesta del usuario, enviar mensajes multimedia, reintentar en caso de que algo falle o lo que nuestras aplicaciones necesiten, espero les sea útil.
Este artículo puede interesarle ¿Qué es Slenium y para que sirve?