https://a.storyblok.com/f/270183/84524/8a1f6130b1/e_phone-status-checker_1200x600.png

NexmoとPHPで電話ステータスチェッカーを作成する

最終更新日 May 13, 2021

所要時間:2 分

ウェブエージェンシーで働くと、複数の異なるクライアントとの仕事をこなさなければならないため、多くの困難が伴います。クライアントの要望を満たし、私たちの仕事に満足してもらうために、私たちは常にクライアントに集中しなければなりません。だから、外からの雑念はおそらく避けたいものだ。私たちのオフィスでは、ほぼ毎日のようにこのようなことが起きていた。

毎日のシナリオは次のようなものだった。マネジャーがクライアントに電話をかけようと電話を取ると、その電話はダイヤルしなかった。マネジャーはオープン・オフィスに向かって「電話がつながらない」と叫ぶ。エンジニアは自分のしていることを中断し、負けじと電話機に向かって歩き、問題を解決すると5分後にはデスクに戻る。これもほぼ毎日のことだった。

しかし、シナリオはこれだけではなかった。個人的に好きなシナリオは、一時期、87で終わる電話からの通話が私たちの電話システムに接続できなかったことだ。

これが27回目くらいになると、この問題に対してもっといい解決策があるはずだと思った。5分という時間はそれほど長くはないように思えるかもしれないが、それでもエンジニアたちの流れや集中力は途切れたままである。

それでデザインを始めたんだ。

私の最初のアイデアは、マネージャーや管理者がカスタムの電話番号を設定できるシンプルなフォームを作成し、その番号が電話システムに電話をかけてみるというものでした。その番号が電話システムに接続に成功すれば、何もする必要はありません。接続に失敗した場合は、いくつかの可能性のある修正が自動化され、それらが機能しない場合は、さらなる調査のためにエンジニアに問題を通知します。

Phone number treePhone number tree

今日作るのはこれだ。PHPとNexmoのVoice APIを使ってアプリケーションを作る方法を紹介します。このチュートリアルでは、少なくともPHPの経験があることを前提とします。それでは始めましょう!

アプリケーションの作成

コードを書く前に、Voice Applicationをセットアップする必要があります。Voice ApplicationはセキュリティとURLウェブフックを処理します。

アプリケーション名、イベントURL、そして公開鍵と秘密鍵のペアを生成する必要がある。

アプリケーション名はコード内のどこにも参照されることはなく、Nexmoダッシュボード内で管理・整理するためだけに使用されます。アプリケーション名は "Phone System Debugger "とすることをお勧めします。

イベントURLは後で非常に重要になる。このURLは、通話中のすべてのステップで、アプリケーションにステータ スリクエストを送信する。今のところ、これは単なるプレースホルダーURLである。

公開鍵/秘密鍵はNexmo APIに安全にアクセスするためのもので、デジタルパスポートのようなものです。秘密鍵をダウンロードしてアプリケーションに保存し、後でNexmo APIで使用できるようにする必要があります。

これらの詳細をすべて入力し、アプリケーションを保存すると、アプリケーションIDとAPIキーが与えられます。Webアプリケーションを構築する際にも、これらの詳細が必要になります。

ネクスモ・クライアント

PHPを使用する利点の一つは、Nexmoが独自のサードパーティクライアントを構築し、アプリケーションとNexmoの間のインタラクションを処理できることです。これは作業負荷を軽減し、後でNexmoのすべてのロジックを単一の小さなサービスに抽象化するために使用することができます。

を使用して、このクライアントを依存関係としてインストールします。 コンポーザー.Composer は、プロジェクト内のサードパーティの依存関係を管理するためのツールです。

composer require nexmo/client

Nexmoクライアントを使用するには、いくつかの認証情報をクライアントに注入する必要があります。これらの認証情報は以下の通りです:

  • APIキー

  • APIシークレット

  • アプリケーションキー

  • 秘密鍵ファイルの場所

ありがたいことに、これらの認証情報はVoice Applicationを構築したときに作成したものなので、すでに持っています。

For the purpose of a quick demonstration, we are just going to implement the client into an `index.php` script, with the main purpose of just sending a test call to ourselves. We will later expand on what we learn here.
 
<?php

use Nexmo\Client;

require_once 'vendor/autoload.php';

$basic = new Nexmo\Client\Credentials\Basic(
   'API_KEY',
   'API_SECRET'
);

$keypair = new Nexmo\Client\Credentials\Keypair(
 file_get_contents('PRIVATE_KEY_PATH'),
 'APPLICATION_ID'
);

$container = new Nexmo\Client\Credentials\Container([$basic, $keypair]);

$client = new Nexmo\Client($container);

$client->calls()->create([
   'to' => [[
       'type' => 'phone',
       'number' => 'YOUR_PHONE_NUMBER',
   ]],
   'from' => [
       'type' => 'phone',
       'number' => '447418347739',
   ],
   'ncco' => [
       [
           'action' => 'talk',
           'text' => 'Hello world',
       ]
   ]
]);
?>

つまり、上記の例では、一般的な Nexmo アカウント情報を保持する Basic Credential Class と、Voice Applications の詳細を保持する Key pair Credentials の 2 つのクラスにクレデンシャルを渡しています。

APIキーとシークレットは、'スタートアップページで確認できます。Application IDは音声アプリケーションを作成した際に生成されたもので、Private Keyの内容はアプリケーション管理ページからダウンロードできます。

これらの 2 つのクレデンシャル・クラスは、配列としてクレデンシャル・コンテナ・クラスに渡され、新しくインスタンス化されたコンテナはクライアントに渡される。これで Voice API を完全に使用できるようになりました。

次に、NCCOオブジェクトを使って、誰に電話をかけたいのか、誰からの電話なのか、そして相手に何を話すのかを配列にしたコールリクエストを作成する。

Nexmoクライアントを追加し、簡単な例を作ったので、このツールの強力さを味わってほしい。

NCCOは本当に強力なツールだ。しかし、本当に強力なツールだ。 ドキュメントVoice APIで実現できることの可能性が見えてくるはずだ。

これから、先に書いた基準を満たすために、ここで作ったものをさらに発展させていきます。セットアップのいくつかの部分をスキップして、私はフレームワークを使うかのように次の例を書きます。個人的には、ここでやっていることにはSymfonyかSlimを使うことをおすすめします。APIリクエストをリッスンするためにルーターにアクセスする必要があるだけです。

<?php

namespace App\Service;

use Nexmo\Client;

class NexmoService
{
    /** @var Client */
    private $client;

    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    public function makeCall(string $message, string $fromNumber)
    {
        $this->client->calls()->create([
            'to' => [[
                'type' => 'phone',
                'number' => $_ENV['DEFAULT_RECEIVER_NUMBER'],
            ]],
            'from' => [
                'type' => 'phone',
                'number' => $fromNumber,
            ],
            'ncco' => [
                [
                    'action' => 'talk',
                    'text' => $message,
                ]
            ]
        ]);
    }
}

ここでやったことは、シンプルなスクリプトでやったことを抽象化して、再利用可能なサービスクラスにパッケージ化したものです。このクラスをコントローラで呼び出し、メッセージと電話番号を入力します。

まだ取り上げていないのは、Nexmo経由の電話からどうやって現在の電話システムの状態を知るかだ。

イベント イベントウェブフックは、通話中にイベントが発生するたびに送信される。私たちのアプリケーションで行おうとしているのは、通話の現在のステータスに基づいて反応することだ。私たちが反応したいイベントは'failed'であり、当分の間、他のすべてのステータスを無視する。

そこで、イベントのウェブフックが送信されたときに呼び出されるコントローラを作成し、イベントのステータスをチェックします。ステータスが 'failed' の場合は、ユーザーにアラートを出力します。

まず、ローカルで開発している間に、Nexmoが実際にアプリケーションにイベントを送信する方法が必要だ。私は Ngrok.Ngrokは、一般にアクセス可能なウェブ・アドレスのポート番号を開くための無料のツールだ。

Ngrok ExampleNgrok Example

8080ポートを転送するようにNgrokをセットアップし、Ngrokのアドレスを使うようにアプリケーションを更新しました。

Ngrok urlNgrok url

最後に、リクエストからデータを取得し、イベントのステータスをチェックする関数を作成します。

/** * Route: api/event-webhook */ public function postEvent(Request $request) { //Get data as an array $data = $request->getContent(); if (isset($data['status']) && $data['status'] === 'failed') { // Alert user of failed call or attempt automated fix } }

このコード例はあまりエキサイティングではないので、これからすることは、Event webhookが'failed'というステータスを返したときにSMSを送る機能を追加することです。

既存のNexmoクライアントを使って、簡単にSMSを設定し、携帯電話番号に送信することができます。この追加はとても簡単なので、Nexmoサービスを拡張してSMS機能を追加します。

<?php

namespace App\Service;

use Nexmo\Client;

class NexmoService
{
    /** @var Client */
    private $client;

    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    public function makeCall(string $message, string $fromNumber)
    {
        $this->client->calls()->create([
            'to' => [[
                'type' => 'phone',
                'number' => $_ENV['DEFAULT_RECEIVER_NUMBER'],
            ]],
            'from' => [
                'type' => 'phone',
                'number' => $fromNumber,
            ],
            'ncco' => [
                [
                    'action' => 'talk',
                    'text' => $message,
                ]
            ]
        ]);
    }
    
    public function sendSMS(string $message)
    {
       $this->client->message()->send([
           'to' => $_ENV['MOBILE_NUMBER'],
           'from' => 'Phone Debugger',
           'text' => $message
       ]);
    }
}

8行追加したことで、携帯電話にSMSメッセージを送る機能が簡単に追加された。やったことは、電話をかけたい番号、相手、送信したいメッセージの配列を渡すだけだ。発信元番号が単なる文字列であることに注目してほしい。これはNexmoのメッセージング機能でサポートされている。

アプリケーションにSMSサポートを追加する別の方法があります。現在、このAPIはNexmoクライアントではサポートされていませんが、WhatsApp、Facebook Messenger、Viberを追加することができます。しかし、アプリケーションを拡張する方法を探しているのであれば、Messaging APIを調査することをお勧めします。

/**
* Route: api/event-webhook
*/
public function postEvent(Request $request)
{
   //Get data as an array
   $data = $request->getContent();

   if (isset($data['status']) && $data['status'] === 'failed') {
       $this->nexmoService->sendSMSMessage('Phone System is down!!!');
   }
}

最後に、Event Webhookが失敗ステータスを返したときに呼び出される新しいSMS関数をコントローラクラスに追加しました。これで完了です!シンプルな電話ステータスチェッカーができました。

私たちが達成したことを要約する:私たちは、電話番号を受け取り、その番号に電話をかけようとし、その電話のステータスに基づいて、電話が失敗した場合に誰かに警告するアプリケーションを作成しました。

私は Githubレポを作成しました。もし分かりにくいところがあったり、あなたのアプリケーションに問題があったりしたら、そのサンプルをダウンロードして遊んでみてほしい。

このツールでできることは、まだほんの一部です。NexmoのNumber Insightを使えば、システムに電話をかける前に番号を確認することができます。電話とそのステータスの間にリンクを追加して、データベースに保存し、テーブルに電話を表示することができます。

このアプリケーションをどのように拡張できるか、インスピレーションが欲しい方は、私の Nexmoステータス・プロジェクトをご覧ください。ご質問があれば、お気軽にコメントを残してください。

シェア:

https://a.storyblok.com/f/270183/384x384/8f2258068f/liamhackett.png
Liam Hackett

Liam is a full-stack engineer who primarily focuses on PHP and Javascript. He loves to learn and tinker with new tools and technology.