これから、不定期にはなりますが、VoiceflowのTIPSとか、こういう風にやればこういうことができるよ、というのを紹介していきたいと思います。最初の第1回は、以下のエントリで紹介した、VoiceflowからAlexaの所在地情報の取得の仕方を手順で記載します。
細かい説明は以下をご覧ください。
細かい説明いらないから手順だけ見たい、という人は以下をご覧ください。
手順
1. 変数の準備
以下の変数を用意してください。
それぞれの変数の意味は以下です。住所の各項目については目安にしかならないのでご注意ください。
deviceId | デバイスID。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。 |
---|---|
apiAccessToken | APIアクセストークン。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。 |
apiEndpoint | APIエンドポイント。デバイスアドレスAPIへアクセスするために必要。デバイスからのリクエストに含まれている。 |
deviceAddress | デバイスアドレスAPIからのレスポンスを保持する変数 |
postalCode | 郵便番号 |
countryCode | 国コード |
districtOrCounty | 郡(日本では未使用) |
stateOrRegion | 州 or 都道府県 |
city | 市 |
addressLine1 | 住所1 |
addressLine1 | 住所2 |
addressLine1 | 住所3 |
2. ブロックの配置
全体像はこんな感じです。
各ブロックの中の設定は以下となります。
① デバイスからのリクエストに含まれている、デバイスアドレスAPIを利用するために必要な情報の取得
デバイスアドレスAPIを実行するために必要な、デバイスID・APIアクセストークン・APIエンドポイントを取得します。Codeブロックに以下を記載します。
deviceId = _system.device.deviceId; apiAccessToken = _system.apiAccessToken; apiEndpoint = _system.apiEndpoint;
ポイントは "_system"というビルトイン変数です。これが handlerInput.requestEnvelope.context.System とほぼ同じものになっていますので、ここから上記を取得します。
② デバイスID・APIアクセストークン・APIエンドポイントを使ってデバイスアドレスAPIへアクセス
①で取得した情報を使って、Integrationブロックで、デバイスアドレスAPIへGETリクエストを送信します。
Integrationブロックを置いたら、以下の手順で設定してください。
Integrationの種類は"Custom"を選択
"Make a GET Request"を選択
With SettingsでAPIリクエスト先URLと認証に必要なリクエストヘッダーを設定します。
各パラメータは以下です。なお ”{ 〜 }” の部分はコピペでは動きません。必ず "{" を入力してリストから出てきたものを選択してください。きちんと選択できていれば色が変わっているはずです。
URL | {apiEndpoint}/v1/devices/{deviceId}/settings/address |
---|
Headersのところは以下。
Key | Authorization |
---|---|
Value | Bearer {apiAccessToken} |
そして、Mapping outputで、APIリクエストの結果を変数にどのようにマッピングするかを設定します。
Object path | response |
---|---|
Variable | deviceAddress |
これでAPIリクエストの結果を以降の処理でdeviceAddress変数にアクセスすることで利用可能となります。ただしそのままでは使えませんので、それについては後述します。
なお、Integrationブロック内の一番下のテストはできないと思ってください。(APIアクセストークンは実機やテストシミュレータの場合にしか飛んでこないので)
③ カードで所在地情報へのアクセス許可を促す
ここで分岐します。②のデバイスアドレスAPIへのアクセスが失敗する=所在地情報へのアクセス許可がされていない、ということになりますので、ユーザに対して許可を求めるカードを表示し、案内を促します。
Permissionブロックを置いて以下の通りに設定して下さい。
Permissionタブが選択されている状態で、一番下のSettingsをクリック
Custom PermissionのトグルをONにする
アクセス許可を求める対象が出てくるので”Address”をON
これでスキル起動時にデバイスの住所へのアクセスが許可されていない場合に以下のカードが表示されるようになります。
④ 所在地情報へのアクセス許可を促すメッセージ
カードを表示すると同時に、SpeakブロックでAlexaにその旨を発話させます。メッセージは適当に入れてもらえればと思います。
⑤ デバイスアドレスAPIの結果を処理
②で実行したデバイスアドレスAPIへのGETの結果がdeviceAddress変数に入っていますが、オブジェクトになっているのでこれをCode Blockで処理して一つづつ変数に取り出していきます。
postalCode = deviceAddress.postalCode; countryCode = deviceAddress.countryCode; districtOrCounty = deviceAddress.districtOrCounty; stateOrRegion = deviceAddress.stateOrRegion; city = deviceAddress.city; addressLine1 = deviceAddress.addressLine1; addressLine2 = deviceAddress.addressLine2; addressLine3 = deviceAddress.addressLine3;
変数たくさん増えるのでもうちょっとうまい書き方もあると思いますが、今回はわかりやすさ優先で書いてます。
⑥ 取り出した住所情報をカードで表示する
あとは取り出した住所情報をどう使うかだけです。試しにCardブロックを使って表示させてみます。なお、Voiceflowではこういった変数の中身を見たいみたいな場合のデバッグはVoiceflow側のテストツールを使うのですが、今回のように実機でないと動かないような場合もあるので、私の場合、少し面倒ですがCardブロックをデバッグ代わりに使うことが多いです。
Title | 所在地情報テスト ※何でも良いです |
---|---|
Value | postalCode: {postalCode} countryCode: {countryCode} districtOrCounty: {districtOrCounty} stateOrRegion: {stateOrRegion} city: {city} addressLine1: {addressLine1} addressLine2: {addressLine2} addressLine3: {addressLine3} |
”{ 〜 }” の部分については上の方で述べたとおりコピペはできませんのでご注意ください。
実際のカードにはこんな感じで表示されます。
これで所在地の住所情報が変数に取れていることがわかりますね。
⑦ 所在地の住所情報をもとに喋らせる
ここは何でも良いので割愛します。取得した住所情報を喋らせるなりなんなりしてください。
こうやって見ると所在地情報取るだけならそんなに難しくないですね。_systemというビルトイン変数がドキュメントのどこにも載ってないのでわかりようがないというのはありますが、わかってしまうといろいろ応用が効くのではないかなと思います。ただ、
のLT資料でも書いてますが、所在地情報自体にちょっと使いにくさがあるので、実際に使う場合には工夫が必要かと思います。資料ご覧いただければと思います。
ぜひご活用ください。