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

Zufällige Fakten Voice-Anruf mit PHP, Uselessfacts und AWS Lambda

Zuletzt aktualisiert am April 13, 2021

Lesedauer: 6 Minuten

Wollten Sie schon immer einen Dienst ausführen, ohne einen Server erstellen und pflegen zu müssen? Soll dies eine Funktion sein, die in bestimmten Zeitabständen ausgelöst wird, oder soll eine bestimmte Aktion diese Funktion auslösen?

In diesem Tutorial erstellen wir eine PHP-Anwendung, die auf AWS Lambda gehostet wird und auf eine bestimmte Webhook-URL wartet, die ausgelöst wird, wenn jemand eine bestimmte Telefonnummer anruft. Die Anwendung bestätigt dann die Nummer des Anrufers und wandelt eine zufällige Tatsache von Text in Sprache um, die der Anrufer hören kann. Die zufälligen Fakten werden von einer API namens Zufällige nutzlose Fakten.

Voraussetzungen

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.

Erste Schritte

Installieren Sie die Abhängigkeiten

Zunächst müssen Sie ein Verzeichnis für Ihr Projekt erstellen, dann in Ihrem Terminal zu diesem Verzeichnis navigieren und den folgenden Befehl ausführen, um Ihr Composer-Projekt zu initialisieren:

composer init

Sobald Sie diesen Schritt abgeschlossen haben, führen Sie den folgenden Befehl aus, um die erforderlichen Bibliotheken von Drittanbietern zu installieren. Diese Bibliotheken sind:

  • das Slim PHP Framework,

  • Slim's PSR-7 enthält die Schnittstellen Response und Request, die wir benötigen,

  • GuzzleHttp, um API-Anfragen zum Abrufen von Zufallsdaten zu stellen,

  • Bref bringt Unterstützung für PHP auf AWS Lambda,

  • PHP-Client von Vonage, um eingehende Webhook-Anfragen für einen Sprachanruf korrekt zu verarbeiten.

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

Nachdem Sie nun die Bibliotheken von Drittanbietern installiert haben, ist es an der Zeit, eine dieser Bibliotheken zu verwenden. Führen Sie in Ihrem Terminal den folgenden Befehl aus, um ein Bref-Projekt zu initialisieren, und stellen Sie sicher, dass Sie alle Standardeinstellungen akzeptieren:

vendor/bin/bref init

Dadurch werden zwei neue Dateien erstellt:

  • index.php wird den Code für die Anwendung enthalten

  • serverless.yml enthält die Konfigurationsanforderungen für die Bereitstellung der Anwendung in AWS

Den Code schreiben

Öffnen Sie in Ihrem Code-Editor die neu erstellte index.php Datei. Entfernen Sie den Inhalt dieser Datei, da wir alles neu schreiben werden.

Das erste, was der Datei hinzugefügt werden muss, sind die Importe für die verwendeten Klassen aus den Bibliotheken von Drittanbietern, die wir im vorherigen Schritt installiert haben. Kopieren Sie das Folgende in Ihre index.php Datei:

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

Wir müssen die Slim-Anwendung in unserer index.php Datei und einen leeren GET-Endpunkt mit der URI /webhooks/answer. Fügen Sie dazu Folgendes in die Datei ein:

$app = AppFactory::create();

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

});

$app->run();

Der /webhooks/answer Endpunkt wird später in Ihrem Vonage-Dashboard konfiguriert, damit Ihre virtuelle Telefonnummer Anweisungen erhält, was zu tun ist, wenn ein Anruf getätigt wird.

Als Nächstes müssen wir die Funktionalität erstellen, die es uns ermöglicht, die an den Webhook übermittelten Daten zu empfangen, die from Telefonnummer zu analysieren, eine GET-Anfrage an den Zufallsfaktor-Generatorund ein Anrufsteuerungsobjekt (NCCO) zu erstellen und an den Anrufer zurückzugeben. Der folgende Code führt alle beschriebenen Funktionen aus, also fügen Sie ihn in Ihre $app->get('/webhooks/answer' Funktion ein:

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

Den Code bereitstellen

Um den Code in AWS Lambda bereitzustellen, führen Sie in Ihrem Terminal den folgenden Befehl aus:

serverless deploy

Wenn die Bereitstellung erfolgreich war, erhalten Sie eine Ausgabe ähnlich dem Beispiel in der folgenden Abbildung. Die Ausgabe kann je nach den Werten in Ihrer serverless.yml Datei abweichen. Achten Sie darauf, dass Sie die URL im endpoints: Abschnitt.

Output showing a serverless deployment

Eine Anwendung erstellen

Wir benötigen nun eine Anwendung in Verbindung mit Vonage, damit unsere virtuelle Telefonnummer weiß, welchen Endpunkt sie bei einem Anruf anfordern muss. Erstellen Sie eine Anwendung in Ihrem Dashboard unter "Your Applications" und geben Sie Ihrer neuen Anwendung einen Namen.

Fügen Sie der Anwendung Voice-Funktionen hinzu und konfigurieren Sie die URLs mithilfe der Lambda-URL, die Sie im vorherigen Schritt kopiert haben. Verwenden Sie für die Antwort-URL [paste lambda url]/webhooks/answer und für die Ereignis-URL [paste lambda url]/webhooks/event.

Klicken Sie nun auf die Schaltfläche Link neben Ihrer kürzlich erworbenen virtuellen Vonage-Nummer, um Ihre neue Anwendung mit der Rufnummer zu verknüpfen.

Sie haben eine virtuelle Vonage-Nummer erworben, eine Vonage-Applikation erstellt und den Code für die Verarbeitung der Voice-Webhook-Ereignisse geschrieben. Jetzt ist es an der Zeit, Ihr Projekt in Aktion zu testen!

Testen Sie es

Um Ihr Projekt zu testen, sobald Sie es in AWS Lambda bereitgestellt haben, rufen Sie Ihre virtuelle Nummer an und hören Sie die Stimme, die Ihre Telefonnummer gefolgt von einem zufälligen Fakt vorliest.

Was nun?

Sie haben nun erfolgreich eine PHP-Anwendung für AWS Lambda erstellt und bereitgestellt, die auf einen Webhook wartet, um einen Anruf von Ihrer virtuellen Nummer entgegenzunehmen.

Hier sind einige Links zu anderen Tutorials, in denen wir serverlose Funktionen verwendet haben:

Wie immer, wenn Sie Fragen, Ratschläge oder Ideen haben, die Sie mit der Community teilen möchten, dann können Sie sich gerne an unseren Slack-Arbeitsbereich der Gemeinschaftoder Sie können mich direkt kontaktieren auf Twitter. Ich würde gerne hören, wie Sie mit diesem Tutorial zurechtkommen und wie Ihr Projekt funktioniert.

Teilen Sie:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg HolmesVonage Ehemalige

Ehemaliger Ausbilder für Entwickler @Vonage. Kommt von einem PHP-Hintergrund, ist aber nicht auf eine Sprache beschränkt. Ein begeisterter Gamer und Raspberry-Pi-Enthusiast. Oft beim Bouldern in Kletterhallen anzutreffen.