https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-build-a-voicemail-app-with-asp-net-core-dr/Blog_ASP-NET_Voicemail_1200x600.png

Cómo crear una aplicación de buzón de voz con ASP.NET Core

Publicado el May 5, 2021

Tiempo de lectura: 10 minutos

Puedes crear soluciones de centro de contacto extremadamente potentes y flexibles con Voice API de Vonage. Pero, ¿qué sucede si no hay nadie para contestar el teléfono del otro lado? Bueno, supongo que podrías simplemente dejar que suene el teléfono o reproducir un mensaje pidiéndoles que vuelvan a llamar más tarde. Probablemente lo que haría la mayoría de la gente, incluido yo mismo, es tomar el mensaje del cliente en forma de mensaje de voz. Con la Voice API de Vonage y nuestro SDK .NETesto es muy fácil de hacer en ASP.NET Core¡!

Visión general

Existen varias maneras de grabar llamadas telefónicas con Voice API de Vonage. En este tutorial, usaremos un webhook de respuesta, que devolverá un objeto de control de llamadas Nexmo (NCCO) que contiene una acción que le indica a Vonage que grabe la llamada y luego envíe la URL de la grabación a nuestro servidor cuando la llamada finalice. Un webhook es simplemente un punto final HTTP disponible públicamente al que Vonage solicitará instrucciones cuando reciba una llamada.

Ir directamente al código

Si quieres saltarte este tutorial y sólo mirar el código, puedes encontrar todo el código de este tutorial en GitHub.

Requisitos previos

  • Probaremos esto con ngrok. Sigue sus instrucciones para configurarlo.

  • Vamos a necesitar npm para obtener el nexmo-cli

  • Vamos a necesitar la última versión de .NET Core SDK. Estoy usando la versión 3.1 en este tutorial.

  • Vamos a utilizar Visual Studio para este tutorial. Por supuesto, esto también funcionará con Visual Studio Code y Visual Studio para Mac. Sólo puede haber algunos pasos ligeramente diferentes para la configuración y ejecución.

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 Nexmo CLI

Con npm instalado podemos seguir adelante e instalar y configurar el Nexmo CLI usando:

npm install nexmo-cli -g nexmo setup API_KEY API_SECRET

Ejecutando esto obtendrá la configuración Nexmo CLI y listo para funcionar.

Ejecutar Ngrok

Voy a estar tirando todo en localhost:5000. Ejecutar ngrok nos permitirá acceder públicamente a . localhost:5000.

ngrok http --host-header=localhost:5000 5000

Toma nota de la URL en la que se está ejecutando ngrok. En mi caso, se está ejecutando en http://7ca005ad1287.ngrok.io. Esta URL va a ser la URL base para mis webhooks en el futuro.

Crear nuestra aplicación de Vonage

Una aplicación de Vonage es una construcción que nos permite vincular la ruta de nuestros números y webhooks fácilmente. Puedes crear una aplicación en el Panel de Vonageo puedes crearla ahora con la CLI.

nexmo app:create "AspNetTestApp" http://7ca005ad1287.ngrok.io/webhooks/answer http://7ca005ad1287.ngrok.io/webhooks/events

Estos comandos crearán una aplicación de Vonage. Luego vinculará todas las llamadas entrantes a esa aplicación con la URL de respuesta: http://7ca005ad1287.ngrok.io/webhooks/answer y dirigirá todos los eventos de llamadas que ocurran en esa aplicación a http://7ca005ad1287.ngrok.io/webhooks/events. Este comando imprimirá dos cosas:

  1. Su identificador de solicitud. Puedes encontrar tu ID de aplicación en el Panel de Vonage

  2. La clave privada de tu aplicación. Asegúrese de tomar esto y guardarlo en un archivo-estoy llamando a la mía private.key

Vincula tu número de Vonage a tu aplicación

Cuando creas tu Account, se te asigna un número de Vonage. Puedes verlo en la sección sección Numbers del panel de control. También puedes ejecutar nexmo number:list en tu consola para obtener una lista de tus números. Toma tu número de Vonage y tu ID de aplicación y ejecuta lo siguiente:

nexmo link:app VONAGE_NUMBER APPLICATION_ID

Una vez hecho esto, sus llamadas se dirigirán a su URL.

Cree su proyecto

Para crear tu proyecto:

  • Abrir Visual Studio

  • Haga clic en Crear un nuevo proyecto

  • Seleccione una aplicación web ASP.NET Core

  • Haga clic en Siguiente

  • Nombra tu proyecto VonageVoicemail

  • Haga clic en Crear

  • Seleccionar API

  • Haga clic en Crear

Instalar dependencias

La única dependencia que va a tener es el paquete Vonage paquete NuGet. Vaya por delante y agarrar que el uso de su método preferido. El mío es navegar hasta el directorio VonageVoicemail.csprojy ejecutarlo:

dotnet add package Vonage

Crear el controlador

Si le da pereza, puede utilizar el programa WeatherForecastController que está pregenerado. Pero para nuestros propósitos vamos a crear un nuevo controlador haciendo clic derecho sobre el Controllers -> Añadir -> Controlador -> Seleccionar API Controller - Empty -> clic en Añadir -> Nombre VoiceController.

Estos pasos crearán un controlador de API vacío.

Configuración de inyección de dependencias

Para ello necesitaremos acceder a la configuración de la aplicación. En el VoiceController, declara un objeto IConfiguration, y luego la dependencia inyecta un IConfiguration en el constructor del controlador.

private readonly IConfiguration _config;

public VoiceController(IConfiguration config)
{
    _config = config;
}

Añadir ruta de respuesta

Ahora que tenemos nuestro controlador API construido, vamos a añadir una ruta de respuesta. Añadiremos un método Answer al final de esta ruta, que creará una OCNC con dos acciones:

  1. Hablará con el usuario, diciéndole que se encuentra indispuesto en ese momento.

  2. Una acción de grabación que finalizará tras 3 segundos de silencio, emitirá un pitido antes de empezar a grabar y provocará una solicitud POST al final de la llamada con la información de la grabación.

[HttpGet]
[Route("webhooks/answer")]
public async Task<string> Answer()
{
   var host = Request.Host.ToString();
   //remove the next line if using ngrok without --host-header option
   host = Request.Headers["X-Original-Host"];
   var sitebase = $"{Request.Scheme}://{host}";

   var talkAction = new TalkAction
   {
       Text = "Hello, you have reached Steve's number," +
       " he cannot come to the phone right now. " +
       "Please leave a message after the tone.",
       VoiceName = "Joey"
   };

   var recordAction = new RecordAction
   {
       EndOnSilence = "3",
       BeepStart = "true",
       EventUrl = new[] { $"{sitebase}/webhooks/recording" },
       EventMethod = "POST"
   };

   var ncco = new Ncco(talkAction, recordAction);
   return ncco.ToString();
}

Importante: host = Request.Headers["X-Original-Host"]; permite obtener la URL de devolución de llamada adecuada cuando se utiliza ngrok con la opción -host-header opción. Elimine esto si no lo está utilizando.

Añadir ruta de postgrabación

Luego de grabar la llamada, Vonage te enviará una respuesta en la dirección EventUrl que proporcionaste. De esa solicitud POST, extraeremos la URL de grabación. Luego crearemos un cliente de voz a partir de nuestras credenciales, que almacenaremos en la configuración. Con el cliente de voz, obtendremos la grabación y luego la guardaremos en un archivo mp3 en nuestro disco.

[HttpPost]
[Route("webhooks/recording")]
public IActionResult Recording()
{
   Record record;
   var appId = _config["APP_ID"];
   var privateKeyPath = _config["PRIVATE_KEY_PATH"];
   var credentials = Credentials.FromAppIdAndPrivateKeyPath(appId, privateKeyPath);
   var voiceClient = new VoiceClient(credentials);
   using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
   {
       record = JsonConvert.DeserializeObject<Record>(reader.ReadToEndAsync().Result);
       var recording = voiceClient.GetRecording(record.RecordingUrl);
       System.IO.File.WriteAllBytes("your_recording.mp3", recording.ResultStream);
   }

   Console.WriteLine($"Record event received on webhook - URL: {record?.RecordingUrl}");
   return StatusCode(204);
}

Ese es todo el código C# que vas a necesitar para esto. A continuación, ¡vamos a configurar la aplicación!

Configurar la aplicación

Hay dos tipos de configuración que tendremos que realizar.

  1. Añada las claves de configuración para APP_ID y PRIVATE_KEY_PATH al archivo appsettings.json

  2. Actualice los ajustes de configuración en launchsettings.json para que kestrel/IIS express escuche en http://localhost:5000

Añadir claves de configuración

Abra appsettings.json y añade las teclas APP_ID y PRIVATE_KEY_PATH utilizando el Id de la aplicación y la clave privada que generamos anteriormente con la CLI. Esas claves en JSON se verá como:

"APP_ID": "7h15-w111-83-y0u2-4pp-1d",
"PRIVATE_KEY_PATH": "C:\\path\\to\\your\\private.key"

Actualizar launchSettings.json

Ahora tenemos que actualizar el archivo de configuración de lanzamiento para que IIS Express o Kestrel escuchen en http://localhost:5000. Abra properties/launchSettings.jsonSi está usando IIS Express, cambie la URL de la aplicación en el objeto iisSettings a http://localhost:5000 y establezca sslPort en 0 para desactivar SSL. Si utiliza Kestrel, elimine el endpoint https://localhost:5001 dejando sólo el endpoint http://localhost:5000 endpoint.

Prueba

Esto es todo lo que tenemos que hacer antes de ejecutar la aplicación. Puedes ejecutar la aplicación desde Visual Studio pulsando F5, o desde la línea de comandos ejecutando dotnet run. Si llamas a tu número de la API de Vonage, reproducirá el mensaje saliente, grabará a la persona que llama después del tono y, cuando la llamada finalice, guardará una grabación de la llamada en tu disco.

Recursos

  • El código de este tutorial se encuentra en GitHub.

Compartir:

https://a.storyblok.com/f/270183/384x384/73d57fd8eb/stevelorello.png
Steve LorelloAntiguos alumnos de Vonage

Antiguo desarrollador .NET Advocate @Vonage, ingeniero de software poliglota full-stack, AI/ML