https://a.storyblok.com/f/270183/132969/03926c8e7b/social_call-recording_golang_1200x600.png

Vonage Voice API Recordings with Golangのダウンロード

最終更新日 May 5, 2021

所要時間:1 分

私たちは Voice APIが大好きです。そしてそれを使ってできる全ての楽しいことが大好きだ。今日は通話の録音をダウンロードするために使っているGolangアプリケーションをお見せしよう。

通話をして録音すると、APIは通話終了時に録音に関するすべての情報を含むWebhookを送信する。私のアプリケーションはこのウェブフックを受信し、録音ファイル自体をダウンロードする。

録画URLを設定する

を追加すると レコードアクションをVoice API NCCOに追加すると、録音通知を受け取るために eventUrlを設定して録音通知を受け取ります。この受信ウェブフックは通話が終了したときに届き、録音に関する情報とダウンロードへのリンクが含まれる。

私のレコードアクションはこんな感じだ:

{
  "action": "record",
  "eventUrl": ["https://76b239af.ngrok.io/recording"]
}

ここで注目すべきことが2つある:

  1. これは eventUrlは実は配列なのだ(3回に1回は引っかかる!)。

  2. 私が使っているのは Ngrokを使って、私のローカル開発プラットフォームへの一般公開されたURLを提供しています。Ngrokについては 開発者ポータルでNgrokについて読むことができます。をご覧ください。

ウェブフックを受け取る

受信するウェブフックはJSONフォーマットで、次のようになる:

{
    "start_time": "2020-05-06T13:34:21Z",
    "recording_url": "https://api.nexmo.com/v1/files/6d29bd8d-e6ff-45b9-9379-2843fe7b37fe",
    "size": 15822,
    "recording_uuid": "692100cb-e4ef-4f18-ab90-2a09573aecb5",
    "end_time": "2020-05-06T13:34:25Z",
    "conversation_uuid": "CON-55970ffd-a6b7-4d18-b3b6-088c03ea49f1",
    "timestamp": "2020-05-06T13:34:25.771Z"
}

私のGolangコードでは、以下のようなリクエストを処理し、ファイルをダウンロードし、ディスクに保存します。 /recordingへのリクエストを処理し、ファイルをダウンロードしてディスクに保存します。

認証するためには、(JWT)[/concepts/guides/authentication#json-web-tokens-jwt]が必要で、プログラムあるいはコマンドラインから生成することができる。この例では、環境変数 JWT.

package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
)

type RecordingWebhook struct {
	StartTime        string  `json:"start_time"`
	RecordingURL     string  `json:"recording_url"`
	Size             float64 `json:"size"`
	RecordingUUID    string  `json:"recording_uuid"`
	EndTime          string  `json:"end_time"`
	ConversationUUID string  `json:"conversation_uuid"`
	Timestamp        string  `json:"timestamp"`
}

func downloadRecording(w http.ResponseWriter, r *http.Request) {
	jwt := os.Getenv("JWT")

	// Get data from incoming webhook
	data := RecordingWebhook{}
	err := json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	fmt.Println("Recording URL: " + data.RecordingURL)
}

func main() {
	http.HandleFunc("/recording", downloadRecording)
	if err := http.ListenAndServe(":8080", nil); err != nil {
		panic(err)
	}
}

ここでのエントリー・ポイントは main()関数である。これは /recordingルートを登録し、8080番ポートでWebサーバーを起動します。

最初にコードを go run main.goでコードを実行しても、何も起こらない!それは、ウェブサーバーが動いていて、リクエストが来るのを待っているからです。リクエストが到着すると、ルートがマッチすれば downloadRecording()関数を呼び出し、面白いことが始まります!

このコードではまず、入力されたデータを解析する。 POSTリクエストはJSONボディなので、データをデコードできる構造体を定義した。URLを取得したら、プログラムはそれを出力する。

録画のダウンロードと保存

ここまでうまくいったら、次に進み、録画をダウンロードしてファイルを保存する手順を追加します。完了すると、完全な downloadRecording()関数は次のようになる:

func downloadRecording(w http.ResponseWriter, r *http.Request) {
	jwt := os.Getenv("JWT")

	// Get data from incoming webhook
	data := RecordingWebhook{}
	err := json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	fmt.Println("Recording URL: " + data.RecordingURL)
	// prepare and download the recording, with auth
	req, err := http.NewRequest("GET", data.RecordingURL, nil)
	if err != nil {
		panic(err)
	}

	req.Header.Set("Authorization", "Bearer "+jwt)
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}

	defer resp.Body.Close()

	// now write to a local file
	filename := data.RecordingUUID + ".mp3"
	out, err := os.Create(filename)
	if err != nil {
		panic(err)
	}
	defer out.Close()

	_, fileErr := io.Copy(out, resp.Body)
	if fileErr != nil {
		panic(fileErr)
	}

	// Good! acknowledge it
	w.Write([]byte("OK"))
}

録画のダウンロードには認証情報が必要なので、このコードではリクエストを送信する前にJWTを追加する方法を示している。

最後に、ダウンロード・リクエストに対する応答がローカル・ファイルに書き込まれる。タイムスタンプや他の何かで名前をつける方が理にかなっているのであれば、自分のアプリケーションでそうすれば間違いない。

アプリケーションで録音を扱う

今日の例は基本的なものですが、Voice APIを使う上で重要な要素を示しています。イベントに応じてWebhookを受信し、録音をダウンロードするための認証情報を送信します。もしあなたが自分のアプリケーションで似たようなものを使っていたり、この例を基にしたものを作っているのであれば、ぜひ教えてください!皆さんが取り組んでいることをお聞かせください。

シェア:

https://a.storyblok.com/f/270183/250x250/e3d3b71060/lornajane.png
Lorna Mitchellヴォネージの卒業生

ローナはブログ癖のあるソフトウェア・エンジニアだ。彼女は言葉とコードを同等に扱おうとしている。