
Compartir:
Julia está comprometida con la capacitación de los desarrolladores mediante la creación de tutoriales, guías y recursos prácticos. Con experiencia en divulgación y educación, su objetivo es hacer que la tecnología sea más accesible y mejorar la experiencia general de los desarrolladores. A menudo se la puede encontrar en eventos de la comunidad local.
Cree un proxy de voz con funciones en la nube
Tiempo de lectura: 8 minutos
Voice Proxy -o llamadas enmascaradas- protege los datos privados de los usuarios proporcionando un número de teléfono intermediario. De este modo, ni la persona que llama ni la que recibe la llamada ven sus números de teléfono reales. Es una práctica habitual en servicios de reparto y transporte compartido como Deliveroo y Uber, pero también resulta útil en diversas situaciones de pequeñas empresas.
En este tutorial, vamos a construir uno de mis casos de uso favoritos: un teléfono de empresa virtual.
Cubriremos dos direcciones de llamada:
Estás llamando a un cliente a través de tu número de Vonage: captura el número de destino mediante DTMF y conecta.
Alguien más está llamando a tu número de Vonage: conéctalo a tu número personal.
Todo lo que necesitamos para que funcione es un número virtual de Vonage y una pequeña función sin servidor que gestione webhooks.
Utilizaremos Funciones de Google Cloudla oferta de funciones como servicio (FaaS) de Google, que ofrece una forma más rápida de construir en la nube.
Con estas funciones sin servidor basadas en eventos, dispondrás de computación gestionada, escalado automático y pago por uso medido en los 100 milisegundos más cercanos. La experiencia del desarrollador es sencilla e intuitiva, lo que le permite centrarse en el código mientras Google Cloud se encarga de la infraestructura operativa.
Puede considerar las funciones de la nube como bloques de construcción que amplían rápidamente sus servicios en la nube con código. Se ejecutan en respuesta a eventos enviados a través de HTTP o emitidos por otros servicios de Google Cloud Platform, lo que las convierte en una opción excelente para arquitecturas basadas en eventos, procesamiento de datos y automatizaciones en la nube.
En este ejemplo, estamos escribiendo una función HTTP que se activa mediante solicitudes HTTP recibidas de la Voice API de Vonage, aprovechando la arquitectura basada en eventos de Google Cloud Functions.
Requisitos previos
cuenta de Google Cloud Platform Account: regístrate o inicia sesión con Google; obtendrás 300 $ de crédito para empezar. Se trata de una cantidad generosa que debería durarte un tiempo para realizar pruebas y aprender.
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.
Configuración de Google Cloud Functions
Crear un nuevo proyecto de Google Cloud
En primer lugar, cree un nuevo proyecto si aún no lo ha hecho. Estos proyectos constituyen la base para crear, habilitar y utilizar todos los servicios de Google Cloud.
Vaya a la sección Gestionar recursos de la Consola en la nube y haga clic en Crear proyecto. Para obtener más información sobre la creación y gestión de recursos, consulta la Guía de Google Cloud.
Crear una función en la nube
A continuación, seleccione Funciones en la nube en el menú de navegación y, a continuación, haga clic en Crear función.
Hay que configurar un par de campos:
Dé a su función un nombre.
Seleccione una Región. He elegido
europe-west-2porque estoy cerca de Londres. Si no está seguro de cuál le conviene más, consulte la lista de regiones disponibles.Establezca el tipo de activador a
HTTPya que estamos escribiendo una función HTTP.Marque "Permitir invocaciones no autenticadas" y "Requerir HTTPS".
Una vez que haya terminado, copie la URL generada y haga clic en Guardar.
Create function config page
A continuación, amplíe las opciones CONFIGURACIÓN DE TIEMPO DE EJECUCIÓN, COMPILACIÓN Y CONEXIONES y desplácese hasta Variables de entorno en tiempo de ejecución. Tendremos que establecer dos números de teléfono como variables de entorno, ambos en formato internacional E. 164. Por ejemplo, 447700900123 (Reino Unido) o 14155550101 (Estados Unidos).
YOUR_VONAGE_NUMBERuno de tus números virtuales de Vonage. Encuentra uno en tu panel de Vonage o compra uno.YOUR_PHONE_NUMBERtu número de teléfono personal que utilizarás para las pruebas.
Set environment variables
Haga clic en Siguientey ya está hecha la configuración; ¡ahora a por el código!
Asegúrese de seleccionar Editor en línea como Código fuentela última versión de Node.js como Tiempo de ejecucióny habilita cualquier API sobre la que la plataforma pueda advertirte.
Cloud Functions Inline Editor warning about installing Cloud Build
El editor de código en línea muestra una función boilerplate generada usando objetos de petición y respuesta de Express.js. Reemplazaremos esto con nuestra función. Ten en cuenta que si cambias el nombre de la función, tendrás que actualizar la directiva Punto de entrada también.
Crear una aplicación de Vonage habilitada para voz
A aplicación API de Vonage contiene la información de seguridad y configuración necesaria para conectarse a los puntos finales de Vonage y utilizar las API de Vonage. Cada aplicación de Vonage creada puede admitir múltiples capacidades; sin embargo, por ahora solo necesitamos la funcionalidad de Voice.
Vamos a crear uno utilizando el Panel de Vonage. Ve a Tus aplicaciones -> Crear una nueva aplicación.
Active las funciones de Voice y, a continuación, proporcione la URL de Cloud Functions generada en el campo Answer URL campo. La mía tiene este aspecto: https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call.
No vamos a implementar un webhook de eventos, por ahora, así que siéntete libre de usar http://example.com/event en ese campo.
Cuando haya terminado, haga clic en Generar nueva aplicación.
Create Voice-enabled Vonage Application
En la página siguiente, verá una lista de los números virtuales que tiene disponibles en su Account. Haga clic en el botón Enlace situado junto a cualquiera de ellos que desee adjuntar a esta aplicación. Llamarás a este número para probar tu aplicación, así que empieza por uno local. Si no aparece ninguna lista o no ves ningún número adecuado, también puedes comprar más Numbers.
Link virtual Vonage number to Vonage Application
Si vincula un número diferente al que estableció en el entorno de ejecución, asegúrese de actualizar el valor de YOUR_VONAGE_NUMBER en la interfaz de usuario de Cloud Console.
Control del flujo de llamadas
Ahora que has configurado una aplicación de Vonage, Vonage realizará una solicitud GET a tu Answer URL cada vez que alguien llame a tu número virtual vinculado. Vonage espera un objeto de control de llamadas (NCCO), un conjunto de instrucciones sobre cómo debe ejecutarse el flujo de llamadas.
Una NCCO se presenta como una matriz JSON válida que contiene una o más acciones. En este ejemplo, utilizaremos un par de ellas diferentes:
la acción
talkacción para reproducir mensajes de texto a voz en la llamadael
inputacción de capturar la entrada del usuario mediante la detección de tonos DTMF (pulsación de botones)-.Entrada DTMFel
connectacción para conectar a quien llama y a quien recibe.
Creación de la función de nube
Como vamos a tener tres casos, también necesitamos devolver tres NCCOs diferentes en consecuencia.
Necesitamos cubrir tres casos:
Alguien más está llamando a tu número de Vonage -> conéctalo a tu número de teléfono
Estás llamando a tu número de Vonage:
2.1. Aún no ha proporcionado la carga útil DTMF -> capturar la entrada DTMF
2.2. La carga útil DTMF está disponible -> conecte la llamada a la carga útil DTMF (número de teléfono de destino)
Vuelve a Google Cloud Console y sustituye el código repetitivo por el siguiente.
// Get environment variables
const YOUR_VONAGE_NUMBER = process.env.YOUR_VONAGE_NUMBER;
const YOUR_PHONE_NUMBER = process.env.YOUR_PHONE_NUMBER;
exports.helloWorld = (req, res) => {
// Check if there's DTMF payload in the request body
if (req.body.dtmf) {
// (2.2) Connect call to the number in the DTMF payload
])
} else {
// Check if you're the caller
if (req.query.from === YOUR_PHONE_NUMBER) {
// (2.1) Capture destination number via DTMF input
} else {
// (1) Connect caller to your phone number
}
}
};
Veamos cada una de estas secciones.
1. Recibir una llamada telefónica: Conectar al llamante
En primer lugar, si alguien llama a su número virtual, querrá que la llamada se conecte a su número de teléfono real. Esto se consigue mediante una acción connect y, opcionalmente, una acción talk para que la persona que llama sepa que está siendo conectada.
En este caso, debe devolver la siguiente OCN:
res.json([{
action: 'talk',
text: 'Please wait while we connect you.'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: YOUR_PHONE_NUMBER
}]
}
])El fragmento anterior es más que suficiente para este caso de uso, pero puede configurar aún más estas dos acciones si lo desea. Vaya a la página Referencia NCCO para conocer todas las opciones disponibles.
2. Hacer una llamada telefónica
A continuación, debemos manejar el caso en el que llamas a tu número de Vonage, proporcionas el número de destino con el teclado de tu teléfono (entrada DTMF) y luego te conectan con el número que acabas de proporcionar.
Este escenario se produce en dos pasos.
2.1 Capturar la entrada DTMF
En primer lugar, necesitamos devolver una NCCO que contenga una input para capturar los dígitos. Añadamos también una talk para incluir instrucciones.
La acción talk es igual que la del paso anterior, también opcional.
La acción input debe ser del tipo ['dtmf']. El reconocimiento de voz también está disponible; lea más sobre esta acción en la Referencia NCCO.
También tenemos que cambiar el valor predeterminado Ajustes de entrada DTMF para que sean adecuados para capturar un número de teléfono.
timeOutes el número de segundos que transcurren antes de que la actividad de la persona que llama se envíe a la centralitaeventUrldespués de su última acción. Es tres por defecto, pero vamos a ir con el máximo10para darnos un poco de margen de maniobra.maxDigitses el número de dígitos que el usuario puede pulsar, cuatro por defecto.15dígitos acomodará números de teléfono en E. 164 que es el formato que Vonage utiliza para los números de teléfono. Por ejemplo, un número del Reino Unido tendría el formato 447700900123.submitOnHashpermite enviar la actividad de la persona que llama aleventUrldespués de pulsar la tecla #. Si no se pulsa #, el resultado se envía después detimeOutsegundos. Falso por defecto, así que asegúrese de establecerlo atrue.
res.json([{
action: 'talk',
text: 'Please enter a phone number in international format, omitting the leading plus sign. End with the pound key.'
},
{
action: 'input',
type: ['dtmf'],
dtmf: {
timeOut: 10,
maxDigits: 15,
submitOnHash: true
},
eventUrl: ["https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call"]
}
]) 2.2 Conectar llamada a entrada DTMF
Una vez capturados los dígitos, Vonage realizará otra solicitud -POST por defecto- a nuestro punto final con una carga útil DTMF en el cuerpo de la solicitud. Luego, una segunda OCN con una connect para conectarte con el número de destino.
res.json([{
action: 'talk',
text: 'Connecting'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: req.body.dtmf.digits
}]
}
])Este Objeto de Control de Llamada es similar al primero, excepto que estamos estableciendo el número de destino dinámicamente. req.body.dtmf.digits contiene la carga útil DTMF; véase la entrada Referencia Webhook para más detalles sobre los resultados de la captura DTMF.
El producto acabado
Por último, ¡unamos todas las piezas móviles! Si introducimos los tres fragmentos que hemos comentado en la función inicial, obtendremos el siguiente código:
// Get environment variables
const YOUR_VONAGE_NUMBER = process.env.YOUR_VONAGE_NUMBER;
const YOUR_PHONE_NUMBER = process.env.YOUR_PHONE_NUMBER;
exports.helloWorld = (req, res) => {
// Check if there's DTMF payload in the request body
if (req.body.dtmf) {
// (2.2) Connect call to the number in the DTMF payload
res.json([{
action: 'talk',
text: 'Connecting'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: req.body.dtmf.digits
}]
}
])
} else {
// Check if you're the caller
if (req.query.from === YOUR_PHONE_NUMBER) {
// (2.1) Capture destination number via DTMF input
res.json([{
action: 'talk',
text: 'Please enter a phone number in international format, omitting the leading plus sign. End with the pound key.'
},
{
action: 'input',
type: ['dtmf'],
dtmf: {
timeOut: 10,
maxDigits: 15,
submitOnHash: true
},
eventUrl: ["https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call"]
}
])
} else {
// (1) Connect caller to your phone number
res.json([{
action: 'talk',
text: 'Please wait while we connect you'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: YOUR_PHONE_NUMBER
}]
}
])
}
}
};
Cuando esté listo, haga clic en DESPLIEGUE. El despliegue puede tardar unos minutos, así que ten paciencia :) Una vez que aparezca una marca de verificación verde junto a su función, estará listo para probarla.
Function deployed
Tu servicio de desvío de llamadas está activo, así que ¡llámalo! Mejor aún, pídale a un amigo que llame a su número virtual: así podrá probar ambas direcciones de llamada.
¿Y ahora qué?
¡Enhorabuena! Acabas de crear un servicio de llamada proxy con una pequeña función de Google Cloud.
¿Listo para ir más allá? ¿Tiene un caso de uso que requiera la grabación de llamadas? ¿Permite que varios Numbers utilicen el servicio? ¿Acepta tanto voz como DTMF?
Echa un vistazo a los siguientes recursos y piensa en cómo puedes ampliarlos. Cuéntanos cómo te va y nos encantaría conocer tu opinión.
Recursos
En el futuro, es posible que desee desarrollar y probar sus funciones localmente. Consulte la guía Funciones en la nube Desarrollo local para saber cómo empezar.
Compartir:
Julia está comprometida con la capacitación de los desarrolladores mediante la creación de tutoriales, guías y recursos prácticos. Con experiencia en divulgación y educación, su objetivo es hacer que la tecnología sea más accesible y mejorar la experiencia general de los desarrolladores. A menudo se la puede encontrar en eventos de la comunidad local.
