https://d226lax1qjow5r.cloudfront.net/blog/blogposts/forward-nexmo-sms-to-slack-using-express-and-node-dr/E_SMS-to-Slack_1200x600.jpg

Reenvío de SMS de Nexmo a Slack mediante Express y Node

Publicado el May 18, 2021

Tiempo de lectura: 9 minutos

Introducción

Los Numbers virtuales de Nexmo le permiten enviar o recibir mensajes de texto y llamadas telefónicas, lo que puede servirle como medio para comunicarse eficazmente con sus usuarios o clientes.

En este tutorial usando Node y Express, veremos cómo podemos notificar automáticamente a un canal de Slack cada vez que un número virtual de Nexmo reciba un mensaje de texto. La notificación contendrá el contenido del mensaje de texto recibido. Esto puede ser muy útil ya que significa que siempre seremos notificados cuando recibamos un mensaje de texto, y el canal de Slack puede funcionar como un lugar central para el seguimiento de los mensajes de texto entrantes.

Requisitos previos

  • Node.js

  • 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 la documentación aquí.

  • Slack

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.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Instalar dependencias de Node

En la raíz del directorio de su proyecto, ejecute el siguiente comando para crear un archivo package.json archivo.

npm init

Esto le pedirá con una serie de preguntas para que usted responda; el valor predeterminado funciona bien para este tutorial. Para instalar todas las dependencias de nuestro proyecto, ejecute el siguiente comando:

npm install express body-parser slack-notify
  • express es un framework de aplicaciones web Node.

  • analizador de cuerpos es un middleware express para analizar los cuerpos de las peticiones entrantes.

  • slack-notify es una envoltura de Node alrededor de la Slack Webhook API que facilita el envío de notificaciones a Slack desde tu aplicación.

A continuación, ejecute el siguiente comando para crear un archivo index.js en la raíz del directorio del proyecto:

touch index.js

Añade el siguiente código al archivo que acabamos de crear:

const express = require('express');
const app = express();
const bodyParser = require('body-parser')
const port = 3000;

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended: true}));

app.listen(port, () => {
    console.log(`Listening on ${port}`);
})

Esto crea una aplicación express con un servidor web que escucha en el puerto 3000. También hemos ordenado a la aplicación que utilice el analizador JSON del paquete body-parser que instalamos anteriormente y hemos puesto la opción urlencoded a true. Vamos a añadir un comando para ejecutar este servidor.

En el archivo package.json añada el siguiente código a la sección scripts sección

"scripts": {
    "start": "node index.js"
  },

Ahora podemos ejecutar la aplicación utilizando el siguiente comando

npm run start

Creación de Webhooks entrantes en Slack

Para poder enviar mensajes a Slack, necesitamos crear una URL de webhook entrante. Para empezar, dirígete a Slack y crea una aplicación si aún no tienes una.

Creating a Slack App

Selecciona un nombre para tu aplicación y asóciala al área de trabajo a la que deseas enviar notificaciones. Una vez creada la aplicación, aparecerá una pantalla similar a la siguiente:

Build an App for Slack

Seleccione la pestaña de webhooks entrantes y haga clic en el botón Activate incoming webhooks para activarlo. A continuación, pulse el botón Add New Webhook to Workspace botón . Seleccione el canal en el que desea publicar las notificaciones y, a continuación, haga clic en allow para autorizar la aplicación. Se te redirigirá de nuevo a la página de configuración con una nueva URL de Webhook creada para ti.

Defining the Webhook URL

Toma nota de la URL del Webhook ya que la necesitaremos en breve.

Crear Webhook para mensajes entrantes

Necesitamos definir un route en nuestra aplicación donde Nexmo hará una petición POST cada vez que nuestro número virtual reciba un mensaje de texto. Este route será responsable de activar las notificaciones de Slack. Antes de crear el routenecesitamos require el paquete slack-notify que instalamos anteriormente.

Añada el siguiente código al archivo index.js en la sección require sección :

const webhookUrl = 'https://hooks.slack.com/services/xxxx/xxx';
const slack = require('slack-notify')(webhookUrl)

Sustituya webhookUrl con la URL del Webhook que Slack generó para usted en la sección anterior.

Console output showing the webhook response

Cada vez que recibamos un mensaje entrante, Nexmo enviará una carga útil parecida a la captura de pantalla anterior. El text contiene el contenido del mensaje recibido.

Añadamos ahora la ruta. Edite el archivo index.js con el siguiente código:

app.post("/webhooks/inbound-message", (req, res) => {
    const { text } = req.body
    slack.alert({
        text: 'New SMS message',
        fields: {
            'Message' : text
        }
    });
    res.status(200).end();
})

La clave text del cuerpo de la petición contendrá el contenido del mensaje recibido. Mediante la desestructuración, asignamos la text a una text const y, a su vez, activamos el envío de la notificación a Slack mediante el método alert() de Slack. Puedes encontrar los diferentes métodos slack-notify que soporta aquí.

La estructura final del archivo index.js debería ser la siguiente:

const express = require('express');
const app = express();
const bodyParser = require('body-parser')
const port = 3000;
const webhookUrl = 'https://hooks.slack.com/services/xxxx/xxx';
const slack = require('slack-notify')(webhookUrl)

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended: true}));

app.post("/webhooks/inbound-message", (req, res) => {
    const { text } = req.body
    slack.alert({
        text: 'New SMS message',
        fields: {
            'Message' : text
        }
    });
    res.status(200).end();
})

app.listen(port, () => {
    console.log(`Listening on ${port}`);
})

Configuración de ngrok

Para que nuestra aplicación sea accesible públicamente a través de la web, necesitaremos configurar ngrok. Usted puede aprender cómo configurar ngrok aquí. Dado que nuestra aplicación se está ejecutando actualmente en el puerto 3000, todo lo que tenemos que hacer es ejecutar el siguiente comando:

ngrok http 3000

Debería ver una pantalla similar a la siguiente:

Screenshot showing example of Ngrok running

Copie la primera URL de reenvío, ya que la utilizaremos en breve en nuestra Account de Nexmo.

Añadir URL de entrada Webhook a Nexmo

En la sección Numbers del Panel de control de Nexmo, haz clic en el icono del engranaje del número que deseas que reciba notificaciones de Slack. Si no tienes ningún número virtual, tendrás que comprar uno.

Screenshot showing the Nexmo dashboard with a list of your numbers

Aparecerá un modal similar al que se muestra a continuación:

Screenshot showing how to configure your Webhook URLS

Configure la URL del Webhook de entrada con la ngrok que hemos indicado anteriormente. (http://1e389185.ngrok.io/webhooks/inbound-message)

Pruebas

Para probar que nuestra aplicación funciona como se espera, reinicie su servidor de nodos y envíe un mensaje desde su teléfono a su número Nexmo.

Screenshot showing an example text message received

Comprueba tu canal de Slack y deberías ver la notificación.

Screenshot showing Slack bot receiving the SMS

Conclusión

En este tutorial, hemos visto como podemos recibir Notificaciones de Slack usando Nexmo. Este tutorial puede servir como una gran guía de inicio para la construcción de aplicaciones con Nexmo y Slack. Puedes encontrar el repo de este tutorial aquí.

Compartir:

https://a.storyblok.com/f/270183/250x250/d288ec8a73/dotun.png
Dotun Jolaoso

Software Developer who loves building awesome tools and products. I currently work with Laravel, PHP and Vue.