Manejo de llamadas telefónicas entrantes con Java y Twilio
Tiempo de lectura: 4 minutos
Realizar llamadas telefónicas salientes con Java y Twilio solo es la mitad del proceso. Para crear una app de teléfono útil e interesante, tendrá que manejar lo que sucede cuando las personas le devuelven el llamado.
Para ello, deberá configurar una dirección URL en su consola de Twilio. Las llamadas entrantes activarán las solicitudes HTTP a esa URL y la respuesta a esas webhooksolicitudes determinará qué sucede a continuación en la llamada. Las respuestas HTTP contienen un dialecto XML llamado TwiML, que le ofrece mucha flexibilidad en la forma de manejar la llamada.
En esta publicación, mostraré cómo configurar un servidor web medianteSpring Boot para manejar las llamadas entrantes con un “Saludos, mundo” hablado y, a continuación, mostraré cómo crear una configuración más interesante e interactiva.
Si desea saltar al final, revise el proyecto finalizado en GitHub.
Configuración
Antes de comenzar, necesitará:
- Una instalación Java 8 o más reciente, recomiendo SDKMAN! para instalar y administrar versiones de Java.
- Una Java IDE (soy fanático de IntelliJ IDEA, pero si tiene un favorito también puede utilizarlo).
- Una cuenta Twilio (si aún no tiene una, regístrese aquí para obtener una cuenta gratuita y recibirá un crédito de $10 cuando realice la actualización)
- Un número de teléfono Twilio que pueda realizar y recibir llamadas
- ngrok o Twilio CLI, para poder responder a webhooks en su entorno de desarrollo local
La manera más rápida de iniciar un nuevo proyecto de Spring Boot es utilizando Spring Initializr. Este enlace lo llevará a una configuración preconfigurada que tenga la dependencia web seleccionada y algunos nombres preconfigurados. Cargue esa página, haga clic en “Generate” (generar) y descomprima el proyecto descargado en un directorio vacío. Luego, abra el proyecto en su IDE de elección y comencemos.
Creación de la aplicación
Cuando abra el código en su IDE, verá el nivel superior del proyecto. Dentro de la carpeta src/main/java
hay un paquete llamado com.example.twilio.calls
con una clase denominada TwilioJavaHandlePhoneCallsApplication
. No es necesario editar esa clase, pero tiene un método main
que será útil más adelante.
Creación de un endpoint HTTP
Cree otra clase en el mismo paquete. Llámela PhoneCallHandler
y colóquele el siguiente contenido:
[este código con importaciones en GitHub]
Ejecute esta aplicación ahora, ya sea ejecutando el método main TwilioJavaHandlePhoneCallsApplication
en su IDE o ./mvnw spring-boot:run
en una ventana de terminal en la raíz de su proyecto.
Después del inicio, pruébelo mediante el comando que aparece a continuación.
Debería ver como respuesta “Saludos de su app”.
Devolución de TwiML por HTTP
Hasta ahora, todo bien. La app maneja solicitudes HTTP y devuelve texto puro. A continuación, modifíquelo para devolver el código de Twilio Markup Language (TwiML) con un tipo de contenido de application/xml
. TwiML se puede escribir a mano, pero es más fácil y seguro crearlo mediante la biblioteca Twilio Java Helper. Agréguela como una dependencia de su proyecto poniendo lo siguiente en la sección <dependencies>
de pom.xml
en la raíz de su proyecto:
A continuación, debemos utilizar TwiML para definir lo que sucede durante la llamada. Esto se realiza en la clase PhoneCallHandler
. En primer lugar, daré un breve ejemplo con texto-voz para decir algo. A continuación, proporcionaré un ejemplo más largo que muestra cómo puede crear una app de voz interactiva.
<Diga> algo
Cambie el contenido del método handleIncomingCall
en PhoneCallHandler
para devolver TwiML con un tipo de contenido de application/xml
:
[este código con importaciones en GitHub]
Este método ahora devuelve la siguiente TwiML, que he formateado para que se lea mejor:
Conectar Twilio a su aplicación
El contenido que devuelve handleIncomingCall
es exactamente lo que necesitamos, pero Twilio debe poder acceder a él desde Internet. Hay muchas opciones para alojar aplicaciones Java en línea, pero para realizar una prueba rápida, como esta, me gusta utilizar una herramienta llamada ngrok que puede crear direcciones URL públicas que reenvían a sus aplicaciones web del localhost
.
Una vez que haya instalado ngrok, inicie la app con su IDE o el comando de arriba. A continuación, ejecute el siguiente comando para crear una URL pública para su servidor local:
Una vez conectado, ngrok muestra la dirección URL generada aleatoriamente que ahora apunta a su aplicación. Debería verse como https://RANDOM_STRING.ngrok.io
. Abra su consola de Twilio a sus números entrantes y elija el número que desea utilizar para esta app, o compre uno nuevo. Edite el número y agregue la URL de ngrok como el webhook para “cuando entre una llamada” (dejando el método como POST
).
Llame a su número y escuche el mensaje de voz “Saludos de Twilio”. Buen trabajo. Felicitaciones
Un ejemplo interactivo
Vamos un paso más allá del “Saludos, mundo” de las aplicaciones de voz. Para calmar sus ansias por algunas posibilidades emocionantes, le mostraré cómo construir algo más divertido e interactivo. La persona que llama escuchará un breve menú de opciones y puede elegir una al decir un número o escribirlo en el teclado.
Modifique el método handleIncomingCall
para utilizar el verbo TwiML <gather>
, que puede hacer reconocimiento de voz y de tono DTMF:
[este código con importaciones en GitHub]
Se le pide a la persona que llama que diga un número o presione un botón en su teclado usando las opciones que están documentadas en recopilar documentos TwiML. Lo más importante se encuentra en la línea 14 que proporciona otra dirección URL para llamar cuando Twilio ha reconocido una palabra o lo que se presionó en el teclado. Si no hay ninguna entrada después de los 5 segundos predeterminados, diremos el mensaje GOODBYE
y colgaremos.
/gatherResult
es una URL relativa por lo que se necesita otro método en PhoneCallHandler
a fin de determinar lo que sucede después de que la persona que llama haya hecho una elección:
[este código incluidas las importaciones en GitHub]
Según la forma en que la persona que llama haya realizado su elección, se incluirán digits
o speechResult
en la solicitud HTTP que Twilio envía para saber qué hacer a continuación. Si elige una opción válida, podemos generar TwiML para contar un chiste o poner algo de música mediante los verbos <Say>
y <Play>
. La llamada finaliza después de que se ejecuta cualquiera de esos verbos. Si la persona que llama hizo algo inesperado, el código llama a handleIncomingCall
para generar TwiML que lee las opciones nuevamente a la persona que llama.
Reinicie la aplicación y realice otra llamada para escucharla en acción. Divertido, ¿no?
Conclusión
Aprendió cómo responder a las llamadas de voz entrantes mediante Twilio y Java, y verá que puede concatenar llamadas para crear aplicaciones de voz interactivas. Ahora el límite es su imaginación.
¡Estoy ansioso por ver lo que es capaz de crear!
Publicaciones relacionadas
Recursos relacionados
Twilio Docs
Desde API hasta SDK y aplicaciones de muestra
Documentación de referencia de API, SDK, bibliotecas auxiliares, inicios rápidos y tutoriales para su idioma y plataforma.
Centro de Recursos
Los últimos libros electrónicos, informes de la industria y seminarios web
Aprenda de los expertos en participación del cliente para mejorar su propia comunicación.
Ahoy
Centro de la comunidad de desarrolladores de Twilio
Mejores prácticas, ejemplos de códigos e inspiración para crear comunicaciones y experiencias de participación digital.