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

PHP、Uselessfacts、AWS Lambdaを使ったランダムファクトの音声コール

最終更新日 April 13, 2021

所要時間:3 分

サーバーを作成・管理することなくサービスを実行したいと思ったことはありませんか?一定の間隔でトリガーされる機能なのか、特定のアクションがトリガーされる機能なのか。

このチュートリアルでは、PHPアプリケーションを作成し、AWS Lambda上でホストして、誰かが特定の電話番号に電話をかけたときにトリガーされる特定のWebhook URLをリッスンします。アプリケーションは発信者の電話番号を確認し、ランダムな事実をテキストから音声に変換して発信者に聞かせます。ランダムな事実は、以下のAPIから取得されます。 ランダムな事実.

前提条件

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.

はじめに

依存関係をインストールする

まず、プロジェクト用のディレクトリを作成し、ターミナルでこのディレクトリに移動して、Composerプロジェクトを初期化するために以下のコマンドを実行します:

composer init

このステップを終えたら、以下のコマンドを実行して必要なサードパーティ・ライブラリをインストールする。これらのライブラリは

  • スリム PHP フレームワーク、

  • SlimのPSR-7には、必要なResponseとRequestのインターフェイスが含まれている、

  • GuzzleHttpを使用して、ランダムな事実を取得するためのAPIリクエストを行います、

  • ブレフ、AWS LambdaでPHPをサポートする、

  • VonageのPHPクライアントが、音声通話の着信Webhookリクエストを正しく処理できるようになりました。

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

サードパーティライブラリのインストールが完了したので、次はそのうちの一つを利用する番だ。ターミナルで以下のコマンドを実行し、Brefプロジェクトを初期化する:

vendor/bin/bref init

これで2つの新しいファイルが作成される:

  • index.phpにはアプリケーションのコードが含まれます。

  • serverless.ymlには、アプリケーションをAWSにデプロイするための構成要件が含まれます。

コードを書く

コード・エディターで、新しく作成した index.phpファイルを開く。これからすべてを書き換えるので、このファイルの内容を削除する。

まずファイルに追加するのは、前のステップでインストールしたサードパーティ・ライブラリから使用するクラスのインポートだ。以下を index.phpファイルにコピーしてください:

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

スリム アプリケーションを index.phpファイルと空の GET エンドポイントを作成する必要があります。 /webhooks/answer.これを行うには、ファイルに以下を追加します:

$app = AppFactory::create();

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

});

$app->run();

この /webhooks/answerエンドポイントは後ほどVonageダッシュボードで設定され、バーチャル電話番号に電話がかかってきたときの指示を出すための方法として使用されます。

次に、ウェブフックに送信されたデータを受け取り、電話番号を解析し、その電話番号にGETリクエストを行う機能を作成する必要がある。 from電話番号を解析し、GETリクエストを ランダム・ファクト・ジェネレーターコール・コントロール・オブジェクト(NCCO)を作成し、呼び出し元に返します。以下のコードは、説明したこの機能をすべて実行します。 $app->get('/webhooks/answer'関数に追加してください:

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

コードを配置する

コードをAWS Lambdaにデプロイするには、ターミナルで以下のコマンドを実行する:

serverless deploy

デプロイが成功すると、下の画像に示す例のような出力が表示されます。ファイルの値によって、出力は若干異なるかもしれません。 serverless.ymlファイルの値によって出力が若干異なる場合があります。セクションにあるURLをメモしておいてください。 endpoints:セクションにあるURLをメモしておいてください。

Output showing a serverless deployment

アプリケーションの作成

仮想電話番号に、通話時にどのエンドポイントをリクエストすればよいかを知らせるために、Vonageにアプリケーションを作成する必要があります。アプリケーションを ダッシュボードでアプリケーションを作成し、新しいアプリケーションに名前を付けます。

アプリケーションにVoice機能を追加し、前のステップでコピーしたLambda URLを使用してURLを設定します。Answer URLには [paste lambda url]/webhooks/answerイベントURLには [paste lambda url]/webhooks/event.

次に Linkボタンをクリックして、新しいアプリケーションを電話番号にリンクします。

Vonageのバーチャル番号を購入し、Vonage Applicationsを作成し、音声Webhookイベントを処理するコードを書きました。あなたのプロジェクトをテストする時が来ました!

テストする

プロジェクトをAWS Lambdaにデプロイした後にテストするには、バーチャル番号に電話をかけ、電話番号とランダムな事実を読み上げる音声を聞く。

どうする?

これで、あなたのバーチャル番号に電話がかかってくるのを待つWebhookをリッスンするPHPアプリケーションを作成し、AWS Lambdaにデプロイすることに成功しました。

サーバーレス関数を使った他のチュートリアルへのリンクはこちら:

いつものように、コミュニティで共有したい質問、アドバイス、アイデアなどがあれば、遠慮なく私たちの コミュニティSlackワークスペースに飛び込んできてください。 ツイッター.このチュートリアルの進め方や、あなたのプロジェクトがどのように機能しているか、ぜひお聞かせください。

シェア:

https://a.storyblok.com/f/270183/250x250/b052219541/greg-holmes.png
Greg Holmesヴォネージの卒業生

元Vonage開発者エデュケーター。PHPのバックグラウンドを持つが、一つの言語に縛られることはない。熱心なゲーマーでRaspberry pi愛好家。屋内クライミング施設でボルダリングをしていることが多い。