https://d226lax1qjow5r.cloudfront.net/blog/blogposts/random-facts-voice-call-with-php-uselessfacts-and-aws-lambda/useless-facts_php_1200x600.png

Appel vocal de faits aléatoires avec PHP, Uselessfacts et AWS Lambda

Publié le April 13, 2021

Temps de lecture : 7 minutes

Avez-vous déjà voulu exécuter un service sans avoir à créer et à maintenir un serveur ? S'agit-il d'une fonction déclenchée à intervalles fixes ou d'une action spécifique qui déclenche cette fonction ?

Dans ce tutoriel, nous allons créer une application PHP et l'héberger sur AWS Lambda, à l'écoute d'une URL webhook spécifique à déclencher lorsque le quelqu'un appelle un numéro de téléphone spécifique. L'application confirmera alors le numéro de l'appelant et convertira un fait aléatoire du texte à la parole pour que l'appelant l'entende. Les faits aléatoires sont récupérés à partir d'une API appelée Faits aléatoires inutiles.

Conditions préalables

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.

Pour commencer

Installer les dépendances

Tout d'abord, vous devez créer un répertoire pour votre projet, puis, dans votre Terminal, naviguez jusqu'à ce répertoire et exécutez la commande suivante pour initialiser votre projet Composer :

composer init

Une fois cette étape terminée, exécutez la commande ci-dessous pour installer les bibliothèques tierces requises. Ces bibliothèques sont les suivantes :

  • le cadre PHP Slim,

  • Slim's PSR-7 qui contient les interfaces Response et Request dont nous aurons besoin,

  • GuzzleHttp pour effectuer des requêtes API afin de récupérer des faits aléatoires,

  • Bref pour apporter le support de PHP sur AWS Lambda,

  • le client PHP de Voice pour qu'il traite correctement les demandes de webhook entrantes pour un appel vocal.

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

Maintenant que vous avez installé les bibliothèques tierces, il est temps d'utiliser l'une d'entre elles. Dans votre Terminal, exécutez la commande suivante pour initialiser un projet Bref, assurez-vous d'accepter toutes les valeurs par défaut fournies :

vendor/bin/bref init

Cela créera deux nouveaux fichiers :

  • index.php contiendra le code de l'application

  • serverless.yml contiendra les exigences de configuration pour le déploiement de l'application sur AWS.

Écrire le code

Dans votre éditeur de code, ouvrez le fichier index.php nouvellement créé. Supprimez le contenu de ce fichier car nous allons tout réécrire.

La première chose à ajouter au fichier est l'importation des classes utilisées à partir des bibliothèques tierces que nous avons installées à l'étape précédente. Copiez ce qui suit dans votre fichier index.php dans votre fichier

<?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';

Nous devons créer l'application Slim dans notre fichier index.php et un point d'accès GET vide dont l'URI est /webhooks/answer. Pour ce faire, ajoutez ce qui suit au fichier :

$app = AppFactory::create();

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

});

$app->run();

Le point de terminaison /webhooks/answer sera configuré ultérieurement dans votre tableau de bord Vonage pour permettre à votre numéro de téléphone virtuel d'obtenir des instructions sur ce qu'il faut faire lorsqu'un appel est passé.

Ensuite, nous devons créer la fonctionnalité qui nous permettra de recevoir les données transmises au webhook, d'analyser le from d'analyser le numéro de téléphone, d'envoyer une requête GET au générateur de faits aléatoiresde créer et de renvoyer un objet de contrôle d'appel (NCCO) à l'appelant. Le code ci-dessous exécute toutes les fonctions décrites, ajoutez-le donc à votre fonction $app->get('/webhooks/answer' fonction :

// 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);

Déployer le code

Pour déployer le code sur AWS Lambda, dans votre Terminal, exécutez la commande suivante :

serverless deploy

Lorsque le déploiement est réussi, vous obtenez un résultat similaire à l'exemple présenté dans l'image ci-dessous. La sortie peut être légèrement différente en fonction des valeurs de votre fichier serverless.yml Cependant, le résultat peut être légèrement différent en fonction des valeurs de votre fichier Veillez à noter l'URL qui se trouve dans la section endpoints: dans la section

Output showing a serverless deployment

Créer une application

Nous avons maintenant besoin d'une application avec Vonage pour permettre à notre numéro de téléphone virtuel de savoir quel point d'extrémité il doit solliciter lorsqu'un appel est effectué. Créez une application dans votre tableau de bord sous "Vos Applications" et donnez un nom à votre nouvelle application.

Ajoutez les fonctionnalités Voice à l'application et configurez les URL à l'aide de l'URL Lambda que vous avez copiée à l'étape précédente. Pour l'URL de réponse, utilisez [paste lambda url]/webhooks/answer et pour l'URL d'événement [paste lambda url]/webhooks/event.

Cliquez maintenant sur le bouton Link à côté du numéro virtuel Vonage que vous venez d'acheter pour lier votre nouvelle application au numéro de téléphone.

Vous avez acheté un numéro virtuel Vonage, créé une Applications Vonage et écrit le code pour gérer les événements du webhook vocal. Il est temps de tester votre projet en action !

Testez-le

Pour tester votre projet une fois que vous l'avez déployé sur AWS Lambda, appelez votre numéro virtuel et entendez la voix qui vous relit votre numéro de téléphone suivi d'un fait aléatoire.

Et maintenant ?

Vous avez maintenant réussi à créer et à déployer une application PHP sur AWS Lambda qui écoute un webhook attendant que votre numéro virtuel reçoive un appel téléphonique.

Voici quelques liens vers d'autres tutoriels où nous avons utilisé des fonctions sans serveur :

Comme toujours, si vous avez des questions, des conseils ou des idées que vous souhaitez partager avec la communauté, n'hésitez pas à vous rendre sur notre espace de travail Slack de la communautéou vous pouvez me contacter directement sur Twitter. J'aimerais savoir comment vous avez suivi ce tutoriel et comment fonctionne votre projet.

Partager:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg HolmesAnciens de Vonage

Ancien développeur éducateur @Vonage. Issu d'une formation PHP, mais pas limité à un seul langage. Joueur passionné et adepte du Raspberry pi. On le trouve souvent en train de faire du bloc dans des salles d'escalade.