https://a.storyblok.com/f/270183/60441/04a4ba18ab/useless-facts_php_1200x600.png

Curiosidades: Chamada Voice com PHP, Uselessfacts e AWS Lambda

Publicado em April 13, 2021

Tempo de leitura: 6 minutos

Você já pensou em executar um serviço sem precisar criar e manter um servidor? Seja uma função acionada em intervalos definidos ou uma ação específica que acione essa função?

Neste tutorial, vamos criar um aplicativo em PHP e hospedá-lo no AWS Lambda, configurado para aguardar o acionamento de uma URL de webhook específica sempre que alguém ligar para um número de telefone específico. Em seguida, o aplicativo confirmará o número do chamador e converterá um fato aleatório de texto para voz para que o chamador possa ouvir. Os fatos aleatórios são obtidos a partir de uma API chamada Random Useless Facts.

Pré-requisitos

Introdução

Instale as dependências

Primeiro, você precisará criar um diretório para o seu projeto; depois, no Terminal, acesse esse diretório e execute o comando a seguir para inicializar seu projeto do Composer:

composer init

Depois de concluir essa etapa, execute o comando abaixo para instalar as bibliotecas de terceiros necessárias. Essas bibliotecas são:

  • o Slim PHP Framework,

  • O PSR-7 do Slim, que contém as interfaces Response e Request de que precisaremos,

  • GuzzleHttp para fazer solicitações de API na busca por curiosidades aleatórias,

  • O Bref vai oferecer suporte ao PHP no AWS Lambda,

  • Cliente PHP da Vonage para processar corretamente as solicitações de webhook recebidas para uma chamada de Voice.

composer require slim/slim:"4.*" slim/psr7 guzzlehttp/guzzle:"^7.0" bref/bref vonage/client

Agora que você instalou as bibliotecas de terceiros, é hora de usar uma delas. No Terminal, execute o comando a seguir para inicializar um projeto Bref; certifique-se de aceitar todas as configurações padrão fornecidas:

vendor/bin/bref init

Isso criará dois novos arquivos:

  • index.php conterá o código do aplicativo

  • serverless.yml conterá os requisitos de configuração para a implantação do aplicativo na AWS

Escreva o código

No seu editor de código, abra o arquivo recém-criado index.php . Remova o conteúdo desse arquivo, pois vamos reescrever tudo.

A primeira coisa a adicionar ao arquivo são as importações das classes utilizadas nas bibliotecas de terceiros que instalamos na etapa anterior. Copie o seguinte para o seu index.php arquivo:

<?php

use GuzzleHttp\Client;
use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Vonage\Voice\NCCO\Action\Talk;
use Vonage\Voice\NCCO\NCCO;
use Vonage\Voice\Webhook\Answer;
use Vonage\Voice\Webhook\Factory;

require __DIR__ . '/vendor/autoload.php';

Precisamos criar a aplicação Slim em nosso index.php arquivo e um endpoint GET vazio com a URI /webhooks/answer. Para fazer isso, adicione o seguinte ao arquivo:

$app = AppFactory::create();

$app->get('/webhooks/answer', function (Request $request, Response $response, array $args) {

});

$app->run();

O /webhooks/answer endpoint será configurado posteriormente no seu painel da Vonage para que seu número de telefone virtual receba instruções sobre o que fazer quando uma chamada for recebida.

Em seguida, precisamos criar a funcionalidade que nos permitirá receber os dados transmitidos ao webhook, analisar o from número de telefone, fazer uma solicitação GET ao gerador de fatos aleatórios, criar e retornar um objeto de controle de chamada (NCCO) para quem está ligando. O código abaixo executa toda essa funcionalidade descrita; portanto, adicione-o à sua $app->get('/webhooks/answer' função:

// Convert the contents of the `$request` sent in the `GET` request into a Voice Webhook Object.
/** @var Answer $call */
$call = Factory::createFromRequest($request);
// Take the `from` phone number and add spaces so it can be read properly in the voice call
$fromSplitIntoCharacters = implode(" ", str_split($call->getFrom()));

// Create a new GuzzleHttp client ready to make a `GET` request
$client = new Client();
// Make a `GET` request for a random useless fact in English
$response = $client->get('https://uselessfacts.jsph.pl/random.json?language=en');
// Convert the response JSON into a PHP Array
$responseArray = json_decode($response->getBody(), true);

// Initialise the Call Control Object ready to take actions to return back to the caller
$ncco = new NCCO();
$ncco
    // Create the first Talk Action thanking the caller and reading out their number back to them
    ->addAction(
        new Talk('Thank you for calling from ' . $fromSplitIntoCharacters)
    )
    // Create the second Talk Action reading the caller their random fact.
    ->addAction(
        new Talk('Your fact is: ' . $responseArray['text'])
    );

// Returns a Json Response of the NCCO containing the two Talk Actions.
return new JsonResponse($ncco);

Implantar o código

Para implantar o código no AWS Lambda, no Terminal, execute o seguinte comando:

serverless deploy

Quando a implantação for bem-sucedida, você verá uma saída semelhante ao exemplo mostrado na imagem abaixo. A saída pode ser um pouco diferente, dependendo dos valores no seu serverless.yml arquivo. No entanto, certifique-se de anotar a URL encontrada na endpoints: seção.

Output showing a serverless deployment

Criar um aplicativo

Agora precisamos registrar um aplicativo na Vonage para que nosso número de telefone virtual saiba qual terminal deve solicitar quando uma chamada for feita. Crie um aplicativo no seu Painel em “Seus Applications” e dê um nome ao seu novo aplicativo.

Adicione recursos de Voice ao aplicativo e configure as URLs usando a URL do Lambda que você copiou anteriormente na etapa anterior. Para a URL de resposta, use [paste lambda url]/webhooks/answer e, para a URL de evento [paste lambda url]/webhooks/event.

Agora, clique no Link botão ao lado do seu número virtual da Vonage adquirido recentemente para vincular seu novo aplicativo ao número de telefone.

Você adquiriu um número virtual da Vonage, criou uma Application da Vonage e escreveu o código para lidar com os eventos de webhook de voz. É hora de testar seu projeto em ação!

Teste isso

Para testar seu projeto depois de implantá-lo no AWS Lambda, ligue para o seu número virtual e ouça a Voice repetindo seu número de telefone, seguida de uma curiosidade aleatória.

E agora?

Você acabou de criar e implantar com sucesso um aplicativo PHP no AWS Lambda, que monitora um webhook aguardando que seu número virtual receba uma ligação telefônica.

Aqui estão alguns links para outros tutoriais em que usamos funções sem servidor:

Como sempre, se você tiver alguma dúvida, sugestão ou ideia que gostaria de compartilhar com a comunidade, sinta-se à vontade para participar do nosso espaço de trabalho da Comunidade no Slack, ou entre em contato diretamente comigo pelo Twitter. Adoraria saber como foi sua experiência com este tutorial e como está o andamento do seu projeto.

Compartilhar:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg HolmesEx-funcionários da Vonage

Ex-educador de desenvolvedores na @Vonage. Tenho formação em PHP, mas não me limito a uma única linguagem. Sou um jogador ávido e entusiasta do Raspberry Pi. Costumo praticar escalada em rocha em centros de escalada indoor.