search
LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

Organization

TwilioをAzure Functions(C#)で動かす

TwilioAzure FunctionsC#で、使用するためのまとめです。
備忘録的な内容なので細かな部分において、説明が雑なところがありますがご了承ください。

事前準備について

TwilioやAzureのアカウント登録、VSCodeの拡張機能のインストール方法はここでご説明致しませんのでQiita等でお調べください。

手順

Azure Functionsのプロジェクトを作成する

Azure Functionsの拡張機能を使用して、Azure Functionsのプロジェクトを作成します。

まずはAzureのタブを選び、稲妻マークをクリックします。
プロジェクト作成

「Create new project」を選択し、保存先のパスを指定します。
プロジェクト作成

プロジェクトの設定を行います。今回はC#を使用したいので、C#を選びます。
言語設定

C#のランタイムをしています。今回は、.NET Core 3 LTSを選んでいます。
言語設定

Twilioから 呼び出してもらうため、HTTP triggerを選びます。
種類設定

APIの名前を指定します。今回は、twiliosampleを入力しています。
ランタイム設定

namespaceを指定します。今回は、masaya3.twilioを入力しています。
namespace設定

関数のアクセスの制約を指定します。今回は、初期値であるFunctionを選んでいます。
アクセス設定

最後に、新しいウィンドウでプロジェクトを開くかを選びます。今回は、現在のウィンドウをそのまま使用しています。
状態設定

問題がなければ、Azure Functionsのプロジェクト作成されます。
完成

動作検証

作成したプロジェクトが動くか確認してみます。
F5を押すことで、ビルドされ、問題がなければローカルのサーバが起動します。
※ローカルで動かすには、Azure Functions Core Tools が必要です。もしインストールされていない場合は、エラーがでるので、エラー内容にそって設定してください。

起動すると、TERMINALにローカルサーバのURLが表示されます。

twiliosample: [GET,POST] http://localhost:7071/api/twiliosample

TERMINALに表示されているURLにCtrlを押しながらクリックするか、URLをブラウザで入力しアクセスすると動きを見ることができます。

実行

正常に実行されると以下のような文字が表示されます。
 実行完了

TwilioのSDKをインストール

Azure Functionsのベースができましたので、次はTwilioのライブラリをインストールします。

使用するライブラリはこちら

VSCodeでF1を押して、メニューからNuget:Open Nuget Galleryを選択します。
拡張機能 

メニューから、Microsoft.Azure.WebJobs.Extensions.Twilioを探し、 右のプロジェクト名にチェックをつけて、「Install」をクリックしてインストールします。
※Twilioだけだといっぱい検索に引っかかるので、Microsoft Twilio等で検索してみてください。
拡張機能 

コードを書く

ライブラリもインストールできたので、実際のコードを記述していきます。

今回説明しているサンプルコードはこちらで公開しています。

Twilioからの情報取得する

API呼び出し時にTwilioから渡されるデータを取得します。
以下は、電話番号を取得しています。

twiliosample.cs
string from = req.Form["From"];   

データは、Form-Dataに格納されていますので、そこから必要となるデータを取得してください。

どのようなデータが取れるかは、以下のリファレンスを参照してください(これいつも忘れる・・)

発話処理を書く

電話の応答などは、TwiMLを使って記述します。
直接、XMLを作っても良いですが、インストールしたTwilio SDKのVoiceResponseで簡単に作成することができます。

VoiceResponseのSayメソッドで、応答時に話すメッセージを文字が設定できます。
今回は、発話のパラメータとして、日本語音声であるlanguage: "ja-jp"や、音声の種類のvoice: "alice"を指定しています。
発話で登録可能な各種パラメータは、以下のリファレンスを参照してください。

VoiceResponse.ToString()でTwiMLが作成されます。
このTwiMLをAPIの返り値として返します。

返り値の返却方法として、ContentResultを使用し、必ずContentType = "application/xml"を指定します。
これを指定しないとTwilio側で認識されません。

twiliosample.cs
var response = new VoiceResponse();
response.Say(from + "から着信がありました。", language: "ja-jp", voice: "alice");

return new ContentResult{Content = response.ToString(), ContentType = "application/xml"};

vocieについて

日本語のVoiceで使用できるパラメータは、alicePolly.MizukiPolly.Takumiです。
manwomanは指定できないため、aliceと同じになってます。

入力受付を書く

今回は動かしていませんが、ボタンによる入力方法もまとめます。
ボタンの入力は、Gatherを使用します。
これを使用することで、よくある電話を使った入力を実現することができます。
入力後は、Actionパラメータで指定されたURLが呼び出されます。

詳しいパラメータは、以下のリファレンスを参照してください。

タイムアウト後に、発話をさせたい場合は、Gather後に発話のSayを登録します。

twiliosample.cs
var digitsResponse = new VoiceResponse();
digitsResponse.Gather(new Gather(numDigits: 入力桁数, timeout:入力のタイムアウト時間, action:"番号入力後の呼び出しURL")
                         .Say("ボタン入力を促すメッセージ"), language: "ja-jp", voice: "alice"));

digitsResponse.Say("タイムアウト後のメッセージ", language: "ja-jp", voice: "alice");

return new ContentResult{Content = digitsResponse.ToString(), ContentType = "application/xml"};

ローカルで動作検証する 

Azureに登録する前に、ローカル環境で動作を検証します。
今回もF5を押して、ローカルサーバを起動します。

curlなどを使用(私はPostman)して、form-dataFrom:+8109012345678を入力して、POSTします。

正常に動作すれば、戻り値として、「入力された電番番号ら着信がありました」というメッセージが入ったTwiMLが表示されます。
実行結果

Azure Functionsにデプロイする

ローカルで動きが確認できたら、Azureに登録します。
VSCodeからAzureへサインインが必要となりますが、サインイン方法は、こちらを参照ください

まずは、Azureタブを開き、FUNCTIONSから以下のマークをクリックします。
image.png

登録先として、ここではすでに作成済みの関数アプリ(higedaruma)を指定しています。
関数アプリから作成する場合は、こちらの記事を参照ください
image.png

問題なければ「Deploy」ボタンをクリックします。
image.png

デプロイが成功すれば、Azureの関数アプリにtwiliosampleが追加されます。
image.png

動きを確認する

関数からtwiliosampleを開き、「コードとテスト」を選択、「テストと実行」をクリックすると、入出力の確認が確認ができます。
事前に動きを見てると、問題が発生したときの切り分けがしやすくなので一度は動作確認をしましょう。
image.png

Twilioに登録する

Azureに登録した関数アプリをTwilioに登録します。

Azure Functionsのtwiliosampleから、関数のURLの取得を選択し、APIのURLを取得します。
image.png

TwilioのWebhookに先ほどコピーしたURLを登録します。
あとは、電話番号に電話をすれば動作を確認できます。
image.png

まとめ

半年ぐらいすると、この流れを忘れそうだったので、メモとして作成しました。
サーバを意識せず、デバッグ含めてローカルでできるのはかなり便利です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4