https://a.storyblok.com/f/270183/1368x665/62f63c4126/25oct_dev-blog_laravel-reports-api.jpg

LaravelでレポートAPIを使用する

最終更新日 October 16, 2025

所要時間:2 分

はじめに

Vonage Reports API Vonage Reports APIこのチュートリアルでは、これをLaravelと統合して同期および非同期のレポートを生成する方法を紹介します。例えばVoice APIやMessages APIを多用している場合、Vonage API Dashboardから統計を取ることができます。ただしこれには制限があり、過去30日分の記録しか取得できない。また、Reports APIを使用することで、APIエンドポイントが開放され、利用状況をより深く掘り下げたり、特定のパラメータを追加してデータをフィルタリングしたり、より大規模なレポートを非同期で作成したりすることができます。Video データを照会する場合は、30 日間ではなく、過去 13 ヶ月、または過去 90 日間のレコードを取得できます。レポートAPIを使用する場合は、レポートに取り込まれるレコード数に応じて課金されます。

この内訳を読んだ後、あなたはすでにオーダーメイドの価格を必要とするVonageのヘビーユーザーかもしれません:この場合、無制限プランのためにあなたのアカウントマネージャに連絡することをお勧めします。このような場合は、アカウントマネージャーにお問い合わせの上、無制限プランを選択されることをお勧めします。価格を選択する際の一般的なお勧めは、月に100万イベント、または年間1200万レコード以上を取得する場合は、無制限プランに切り替えることです。

この記事では、例としてLaravelを使ってこのデータを取得します。

前提条件

Laravelのインストール

LaravelのインストーラーはComposerの create-projectのボイラープレート・コードを作成するメカニズムをラップしています。開発マシン上に新しいディレクトリを作成し laravel install reports-api-demo.ここではデフォルトのものを選択し、Laravel Starter Kitsオプションはスキップしてください。

ルートの設定

できるだけシンプルにするために、レポートを実装する3つの異なる方法に対応する3つのルートを用意します。これらのルートは次のようになります:

  • エンドポイント GETエンドポイントをヒットする。 同期レポートを生成するエンドポイントを叩く。

  • エンドポイントを GETエンドポイントをヒットする。 POST非同期レポートをVonageにリクエストするエンドポイントをヒットさせる。

  • A POSTVonageが非同期レポートを返信するエンドポイント

ルート1:同期レポートを作成する

あなたの routes/web.phpディレクトリに移動し、以下のコードを追加する:

Route::get('/report', function () {
    $apiKey = '99913011';
    $apiSecret = 's09IJad98fa0t9j09ad8fa999';
    $url = 'https://api.nexmo.com/v2/reports/records';
    $dateStart = \Carbon\Carbon::now()->subMonth();
    $dateEnd = \Carbon\Carbon::now();

    $queryParams = [
       'product' => 'SMS',
       'direction' => 'outbound',
       'date_start' => $dateStart->format('Y-m-d\TH:i:s.vP'),
       'date_end' => $endDate->format('Y-m-d\TH:i:s.vP'),
       'account_id' => $apiKey,
     ];

    $response = Http::withBasicAuth($apiKey, $apiSecret)
       ->get($url, $queryParams);

    dd($response->json());
});

(あなたの中の賢い人のために言っておくが、これはダミーのAPIキーである; 常に機密データを隠す!).環境変数の扱い方については、こちらのブログ記事をご覧ください、 このブログの記事.

コントローラを使うのではなく、ルートクロージャーにロジックを追加します。アプリケーションで /reportをクリックすると、キーとシークレットを使って Reports API へのリクエストが発行され (これらはダッシュボードで確認できます)、レスポンスが出力されます。

API設定ページを開く API設定ページを開き、Vonage API KeyとSecretにアクセスしてください。両者は以下のスクリーンショットのように表示されます。APIキーはページの上部にあり、APIシークレットにアクセスするには、"Account secret "サブセクションを参照してください。

注:以前に作成したAPIシークレットを覚えていない場合は、"+ Create new secret "をクリックし、安全に保存してください。

このリクエストでは、クエリパラメータでその製品でフィルタリングしているため、レポートはSMS APIからのイベントのみを返します。このAPIには、クエリに利用できる多くのオプションがある:

  • SMS

  • Voice(In-App-VOICE、WEBSOCKET-CALL、VOICE-TTS、ASR、AMDを含む)

  • メッセージ API (WhatsApp、RCS、SMS、Viber、SMS)

  • ナンバー・インサイト

  • Verify

  • In-App Messaging

  • ネットワークAPI

  • Video

これは少量のデータには適しているが、数百万行が必要な場合はどうなるのだろうか?そこで非同期レポートの出番となる。

ルート2:非同期レポートの作成

何百万というレコードは、クライアントにもサーバーにも負担がかかりすぎる。そこで POSTJSONボディにレポート・クエリ・パラメータを含むリクエストを作成し、完了時にWebhookを配信するコールバックURLを指定します。Vonageはレポート・データを送信するエンドポイントを必要とするので、アプリケーションをインターネットに公開する必要があります。これを行う最も簡単な方法は、まさにこれを行うngrokを使用することです。一度 ngrokをインストールしたらをインストールしたら、それを実行してアプリケーションを公開し、URLをメモしてください。

レポートを受け取るエンドポイントが必要です。今のところ、デモンストレーションとして、アプリケーション・ログ・ファイルにデータをダンプするだけです。

Route::post('/incoming', function (\Illuminate\Http\Request $request) {
   \Illuminate\Support\Facades\Log::info($request->json());
});

次に、新しい GETエンドポイントが必要です:

Route::get('/async', function (\Illuminate\Http\Request $request) {
   $apiKey = '99913011';
   $apiSecret = 's09IJad98fa0t9j09ad8fa999';
   $url = 'https://api.nexmo.com/v2/reports';
   $dateStart = Carbon::now()->subMonth();
   $endDate = Carbon::now();

   $queryParams = [
       'product' => 'SMS',
       'direction' => 'outbound',
       'date_start' => $dateStart->format('Y-m-d\TH:i:s.vP'),
       'date_end' => $endDate->format('Y-m-d\TH:i:s.vP'),
       'account_id' => $apiKey,
   ];



   $response = Http::withBasicAuth($apiKey, $apiSecret)
       ->post($url, $queryParams);

   dd($response->json());
});

APIキーとシークレットをライブの ダッシュボードクレデンシャルに置き換え callback_urlフィールドを ngrok URL に置き換える。 /asyncを追加して、Vonage を POSTを正しい場所に追加します。この GETリクエストにアクセスすると、レポートがトリガーされます。レコードは行単位で課金されることに注意してください。 行ごとに課金されることに注意すること、 したがって、この実装をテストしている間に、何百万ものレコードを持っていて、テストのためにこれに従っているだけなら、サーバーを攻撃しようとしていないことを確認してください。

最終的には(レポートのサイズにもよるが)、以下の場所に移動し、非同期レポートデータを見ることができるようになる。 storage/logs/laravel.logに移動し、非同期レポート・データを見ることができるようになります。

非同期レポートのステータスの表示

例えば、解析エラーにより無効なURLにレポートが送信された場合などです。ステータスを表示し、完了したらレポートをダウンロードします。チェックレポートエンドポイントを押すことでこれを行うことができます。

Route::get('/status', function (\Illuminate\Http\Request $request) {
   $apiKey = 'your-api-key';
   $apiSecret = 'your-api-secret';
   $requestId = 'aaaaaaaa-bbbb-cccc-dddd-0123456789ab';
   $url = 'https://api.nexmo.com/v2/reports/' . $requestId;

   $response = Http::withBasicAuth($apiKey, $apiSecret)
       ->get($url);

   dd($response->json());
});

その回答は、必要なすべての情報を与えてくれる。ただし request_statusSUCCESSであれば download_reportHALフィールドからダウンロードリンクを抽出できます。

"request_status": "SUCCESS",
"_links": {
    "self": {
         "href": "https://api.nexmo.com/v2/reports/aaaaaaaa-bbbb-cccc-dddd-  0123456789ab"
          },
          "download_report": {
              "href": "https://api.nexmo.com/v3/media/aaaaaaaa-bbbb-cccc-dddd-0123456789ab"
           }
       }
}

結論

これで、Cloud Platform Communicationsのすべてをクエリする完全に非同期な方法ができました!Account IDでクエリできるようになったことで、さらにオプションが増えました。しかし、通信の再販業者であれば、サブアカウントごとにカスタムレポートを生成することができます。これはまた、再販業者として顧客に請求書を発行する際に特に役立ちます。また、Reports APIを使用して、潜在的に悪質なリクエストのパターンを独自に監視・特定し、次の機能を使用して番号をブロックすることもできます。 不正防御機能.

ご質問がある場合、またはあなたが作っているものを共有したい場合は、こちらをクリックしてください。

最新の開発者向けニュース、ヒント、イベント情報をお届けします。

シェア:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeシニアPHPデベロッパー

スタンダップ・コメディーの学位論文を持つ俳優の訓練を受け、ミートアップ・シーンを経てPHP開発に携わるようになった。技術について話したり書いたり、レコード・コレクションから変わったレコードを再生したり買ったりしています。