Power Apps から API 呼び出す（ついでに Face API で感情分析）

# はじめに
Power Apps から API どうやって叩くの？
結論：Power Automate使えばいい


# 今回やりたいこと
Power Apps から直接 API は叩けないので、Power Automate を利用します。
APIを使用する方法としては、Power Apps のカスタムコネクタを利用する方法もありますが、今回は簡易的に利用するだけなので Power Automate で POST する方法をとります。
Power Apps から API を使う一連の操作の練習として、Azure の Face API を使って感情分析をしてみます。

具体的には、Power Apps で写真とる→ Face API に画像投げる→返ってきた分析結果を Power Apps で表示
という簡易的なアプリを作成したいと思います。


Face API 立ち上げ方法は今回は割愛します。
API のエンドポイントとキーをメモっておいてください。

# 実装手順
1. Power Automate で Face API 呼び出し分析結果取得
2. Power Apps で撮った画像データをフローへ流す
3. フローから出力された分析結果を Power Apps で表示

## 1. Power Automate で Face API 呼び出し分析結果取得
### フローの全体像
全体像は以下になります。
![2021-12-17_15h15_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/de322bc2-7b22-b2e3-b84a-8f392689f920.png)

### フローの作成
まず、Power Appsの編集画面(<https://make.powerapps.com>)で、サイドメニューからフローを選択します。

以下で入力して「作成」をクリックします。
フロー名：TestFlow
トリガーの方法：Power Apps
![2021-12-17_15h12_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/305ac60d-7b4c-e31e-f8f2-5e2c543bec95.png)

### 変数の作成
まず、Power Apps からの入力を Power Automate で利用できるよう変数を作成します。
「新しいステップ」を選択。「作成」と検索し以下の操作を選択してください
![2021-12-17_15h16_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/f366db81-2e87-d447-8f98-c71e646b8f8f.png)

「動的なコンテンツ」をクリックし、「Power Apps で確認」を選択
![2021-12-17_15h16_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/24a8cb83-6822-c4a1-5a6d-a92df83cd1cd.png)

### API フローの作成
次に、Power Apps から受け取った画像データで API を叩くステップを作成します。
「新しいステップ」を選択。「http」と検索し以下の操作を選択してください。
![2021-12-17_15h17_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/d7d765fd-6b44-80ef-9a89-e6e954aabbfb.png)

ここで、API を叩くことができます。
今回は Face API の感情分析を利用するので以下のように入力してください。
URI と KEY はご自身の値に変更してください。
![2021-12-17_15h20_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/69313d62-2ba0-0942-a0e4-fe97b9b15517.png)

### 返却結果の解析
次に、Face APIから帰ってきた JSONデータ を Power Automate で利用できるように、JSON解析を行います。
「新しいステップ」を選択。「json」と検索し以下の操作を選択してください。
![2021-12-17_15h21_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/5c5bab7c-01f0-b101-1089-07411e3c4a95.png)

「動的なコンテンツの追加」で以下のように入力してください。
Face APIの仕様上、画像に移っている各人に対しての分析結果をリスト形式で返すため、今回は1人目の要素のみを指定しています。

![2021-12-17_15h22_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/360d4576-8d61-8ca3-5ada-793b05b00cbd.png)
スキーマで想定しているJSONの構造を指定します。サンプルから生成もできます。
今回は以下のスキーマで定義しました。

```
{
    "type": "object",
    "properties": {
        "faceId": {
            "type": "string"
        },
        "faceRectangle": {
            "type": "object",
            "properties": {
                "top": {
                    "type": "integer"
                },
                "left": {
                    "type": "integer"
                },
                "width": {
                    "type": "integer"
                },
                "height": {
                    "type": "integer"
                }
            }
        },
        "faceAttributes": {
            "type": "object",
            "properties": {
                "emotion": {
                    "type": "object",
                    "properties": {
                        "anger": {
                            "type": "number"
                        },
                        "contempt": {
                            "type": "number"
                        },
                        "disgust": {
                            "type": "number"
                        },
                        "fear": {
                            "type": "number"
                        },
                        "happiness": {
                            "type": "number"
                        },
                        "neutral": {
                            "type": "number"
                        },
                        "sadness": {
                            "type": "number"
                        },
                        "surprise": {
                            "type": "number"
                        }
                    }
                }
            }
        }
    }
}
```


![2021-12-17_15h22_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/c5cac540-c61c-d82e-1120-e682a568f9eb.png)

### 解析結果の出力
最後に、解析結果をPower Appsへ出力します。
「新しいステップ」を選択。「power apps」と検索し以下の操作を選択してください。
![2021-12-17_15h22_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/e95b14e0-5a61-ff8e-6478-f7c3c1fd042b.png)
今回は各感情値を返すため以下のように作成しました。
![2021-12-17_15h23_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/ede0fb46-6d0e-d921-2ec0-9778741af5a9.png)

これで Power Automate で Face API を呼び出すことができました。

## 2. Power Apps で撮った画像データをフローへ流す
### アプリの作成
まず、Power Appsの編集画面(<https://make.powerapps.com>)で、サイドメニューからアプリを選択します。
アプリ名を入力して、「作成」をクリックします。
![2021-12-17_16h45_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/7b51dc46-059d-6eca-8016-fa8408327be8.png)
まっさらなアプリが立ち上がりました。
![2021-12-17_16h49_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/0df5c8f0-dd0b-546a-5803-ad71fa5aa2ff.png)

### カメラの設置
まず、写真を撮るためのカメラを設置します。
「挿入」→「カメラ」を選択します。
![2021-12-17_16h50_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/ec70e023-8dab-a063-96e8-04cfc6e82a1d.png)

### 撮影時のアクション追加
設置したカメラに先ほど作成したフローを呼び出す処理を追加します。
カメラの詳細設定から、「OnSelect」を選択します。
「アクション」→「Power Automate」→「TestFlow」(さっき作ったやつ)を選択します。
![2021-12-17_16h52_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/c975d35e-5a48-938b-88e0-b0a0f38beffe.png)

これでカメラとTest Flow が連携できたので、処理を追加していきます。
「OnSelect」に以下を入力します。

```
UpdateContext( { photouri: Mid(Substitute(JSON(Camera1.Photo,JSONFormat.IncludeBinaryData), """", ""), 23) } ); 
UpdateContext({flow_res: TestFlow.Run(photouri)});
Collect( Emotions, flow_res );
```

処理内容としては、
カメラで撮った画像データ（base64形式）から不要文字列を削除して、バイナリデータへ変換
画像バイナリデータをフローへ送信
データテーブルにフローの結果を格納
となっています。
![2021-12-17_17h01_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/e2d93fc6-914f-5a95-aff0-8c68e4405f74.png)

Alt + クリック で写真を撮ることができます。
Power Appsのファイルタブからコレクションに移動すると、保管されているテーブルを確認することができます。
分析結果をしっかりと格納できていることが確認できました。
![2021-12-17_17h07_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/f2238599-a973-7c3c-b2f5-52980a9c2207.png)

## 3. 分析結果をApps に表示
「データテーブル」を追加し、データソースに「Emotions」を選択します。
![2021-12-17_17h11_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/c0929f97-1320-070d-32eb-25aaffbd1715.png)
「カスタマイズウィンドウから～」を選択し、「フィールドの追加」ですべてにチェックを入れます。
![2021-12-17_17h11_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/561c3030-a1c6-6e62-e52c-c0137101fa07.png)
少し配置を整えて、完成です！
![2021-12-17_17h16_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401338/dcc5bf58-cb52-e4c5-c3ba-5793835db93b.png)

# おわりに

Power Platform を相互に連携させることで幅広い機能を実現できそうです。
連携もかなり楽にできたので、思いついたことぱぱっと実現するのに最適なサービスだと思います。
次はPower BIも連携させたもの作ってみようかと思います！

# 参考ドキュメント
・Face API
https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236
・Power Apps
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/
・Power Automate
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/using-logic-flows