Como lidar com chamadas telefônicas recebidas com Java e Twilio
Time to read:
Fazer chamadas outbound telefônicas com o Java e a Twilio é apenas uma parte do que é possível. Para criar um aplicativo de telefone útil e envolvente, você precisará lidar com o que acontece quando as pessoas ligam de volta.
Para isso, você precisará configurar um URL no console da Twilio. As chamadas recebidas acionarão solicitações HTTP para esse URL, e a resposta a essas solicitações de webhook determinará o que acontecerá em seguida na chamada. As respostas HTTP contêm um dialeto XML chamado TwiML, que oferece muita flexibilidade na forma como a chamada é tratada.
Nesta publicação vou mostrar como configurar um servidor Web usando o Spring Boot para lidar com chamadas recebidas com um "Hello World" (Olá, mundo" falado e mostrar como criar uma configuração mais interessante e interativa.
Se você quiser pular para o final, confira o projeto concluído no GitHub.
Configuração
Antes de começar, você precisará de:
- Uma instalação do Java 8 ou mais recente. Eu recomendo o SDKMAN! para instalar e gerenciar versões do Java.
- Um IDE Java. Eu gosto do IntelliJ IDEA, mas você pode usar um de sua preferência.
- Uma conta da Twilio. Caso você não tenha uma, cadastre-se aqui gratuitamente e receba US$ 10 de crédito ao fazer upgrade.
- Um número de telefone da Twilio que possa fazer e receber chamadas.
- Um ngrok ou a CLI da Twilio, para responder a webhooks em seu ambiente de desenvolvimento local.
A maneira mais rápida de começar um novo projeto do Spring Boot é usando o Spring Initializr. Este link levará você a uma configuração inicial com a dependência da Web selecionada e alguns nomes pré-configurados. Carregue essa página, clique em "Generate" (Gerar) e descompacte o projeto baixado em um diretório vazio. Em seguida, abra o projeto no IDE de sua escolha. Vamos colocar a mão na massa.
Como criar o aplicativo
Ao abrir o código no IDE, você verá o nível superior do projeto. Na pasta src/main/java, há um pacote chamado com.example.twilio.calls, que tem uma classe chamada TwilioJavaHandlePhoneCallsApplication. Apesar de você não precisar editar essa classe, ela tem um método main que será útil mais tarde.
Como criar um endpoint HTTP
Crie outra classe no mesmo pacote. Chame-a de PhoneCallHandler e adicione o seguinte conteúdo:
[este código com importações no GitHub]
Abra o aplicativo executando o método main de TwilioJavaHandlePhoneCallsApplication no seu IDE ou por ./mvnw spring-boot:run em uma janela de terminal na raiz do projeto.
Após a inicialização, teste usando o comando abaixo.
Você deve ver "Hello from your app " (Olá! Aqui é o seu aplicativo) como resposta.
Como retornar TwiML via HTTP
Até agora, tudo bem. O aplicativo está lidando com solicitações HTTP e retornando texto sem formatação. Agora, modifique-o para retornar o código Twilio Markup Language (TwiML) com um content-type de application/xml. O TwiML pode ser escrito à mão, mas é mais fácil e seguro criá-lo usando a biblioteca Twilio Java Helper. Adicione-o como uma dependência de seu projeto colocando o seguinte na seção <dependencies> de pom.xml na raiz de seu projeto:
Recomendamos sempre o uso da versão mais recente da biblioteca auxiliar da Twilio. No momento da gravação, a versão mais recente é a 8.10.0, mas novas versões são lançadas com frequência. Você sempre pode verificar a versão mais recente em mvnreporistory.com.
Em seguida, precisamos usar o TwiML para definir o que acontece durante a chamada. Isso é feito na classe PhoneCallHandler. Primeiro, vou dar um breve exemplo usando a opção de texto para voz para dizer algo. Em seguida, vou dar um exemplo mais longo que mostra como você pode criar um aplicativo de voz interativo.
Adicionar frases com o recurso <Say>
Altere o conteúdo do método handleIncomingCall em PhoneCallHandler para retornar o TwiML com um tipo de conteúdo de application/xml:
[este código com importações no GitHub]
Esse método retorna o seguinte TwiML, que eu formatei para torná-lo mais legível:
Como conectar a Twilio ao seu aplicativo
O conteúdo retornado pelo handleIncomingCall é exatamente o que precisamos, mas a Twilio precisa ser capaz de acessá-lo pela Internet. Há muitas opções para hospedar aplicativos Java on-line, mas para um teste rápido como este, gosto de usar uma ferramenta chamada ngrok, que pode criar URLs públicos que encaminham para seus aplicativos da Web localhost.
Depois de instalar o ngrok, abra seu aplicativo usando seu IDE ou o comando acima. Em seguida, execute o seguinte comando para criar um URL público para seu servidor local:
Uma vez conectado, o ngrok exibe o URL gerado aleatoriamente que agora direciona para o seu aplicativo. Ele deve ser parecido com o https://RANDOM_STRING.ngrok.io. Abra o console da Twilio e acesse seus números de recebimento e escolha o número que deseja usar para este aplicativo ou compre um novo. Edite o número e adicione seu URL ngrok como o webhook para quando uma chamada for recebida, deixando o método como POST.
Se você tiver a CLI da Twilio instalada, também poderá fazer isso na linha de comando, com o comando abaixo.
twilio phone-numbers:update PHONE_NUMBER --sms-url http://localhost:8080/messages
O CLI detectará que esta é um URL do localhost e definirá o ngrok para você.
Ligue para o seu número e ouça uma voz dizendo "Hello from Twilio" (Olá! Aqui é a Twilio). Ótimo trabalho. Parabéns!
Um exemplo interativo
Vamos além do "Hello, World" (Olá, mundo) dos aplicativos de voz. Para instigar você a tentar novas possibilidades emocionantes, vou mostrar como criar algo mais divertido e interativo. O autor da chamada ouvirá um pequeno menu de opções e poderá escolher uma delas dizendo um número ou digitando-o no teclado.
Modifique o método handleIncomingCall para usar o verbo TwiML <Gather>, que pode fazer o reconhecimento de fala e tom DTMF:
[este código com importações no GitHub]
O autor da chamada precisa dizer um número ou pressionar um botão do telefone usando as opções documentadas nos documentos Gather TwiML. A mais importante é a linha 14, que dá outro URL para ligar quando a Twilio reconhece uma palavra ou um pressionamento de teclado. Se não houver interação após o padrão de cinco segundos, dizemos uma mensagem de despedida GOODBYE e desligamos.
/gatherResult é um URL relativo, portanto, outro método é necessário no PhoneCallHandler para determinar o que acontece depois que o autor da chamada faz uma escolha:
[este código com importações no GitHub]
Dependendo de como o autor da chamada fez a escolha, digits ou speechResult será incluído na solicitação HTTP que a Twilio envia para descobrir o que fazer em seguida. Se for escolhida uma opção válida, poderemos gerar um TwiML para contar uma piada ou tocar música usando os verbos <Say> e <Play>. A chamada termina após qualquer um desses verbos serem executados. Se o autor da chamada fizer algo inesperado, o código chama handleIncomingCall para gerar o TwiML que lê as opções novamente.
Reinicie o aplicativo e ligue de novo para ouvi-lo em ação. Divertido, não é?
Para finalizar
Você aprendeu como responder a chamadas de voz recebidas usando Twilio e Java e viu que você pode encadear chamadas para criar aplicativos de voz interativos. Agora sua imaginação é o limite.
Publicações relacionadas
Recursos relacionados
Twilio Docs
De APIs a SDKs e aplicativos de amostra
Documentação de referência de API, SDKs, bibliotecas auxiliares, guias de início rápido e tutoriais para sua linguagem e plataforma.
Centro de Recursos
Os mais recentes e-books, relatórios do setor e webinars
Aprenda com especialistas em engajamento do cliente para melhorar sua própria comunicação.
Ahoy
Centro da comunidade de desenvolvedores da Twilio
Melhores práticas, exemplos de código e inspiração para criar comunicações e experiências de engajamento digital.