既定の環境の Power Automate の API を(無理やり)触ってみる

この記事は Web API Advent Calendar 2021 の6日目の記事です。

https://qiita.com/advent-calendar/2021/webapi

5日目は @SatohJohn さんの記事でした。

https://zenn.dev/satohjohn/articles/96873574f07534

Microsoft 365 の契約で、追加費用なしで利用できる for Office 365 のライセンスにて Power Apps や、Power Automate を利用されてい方は多いと思います。

この範囲で利用されるとき、Power Platform には、(既定)名前の付いた環境が作成され、その中でキャンバスアプリだったり、クラウドフローだったりを利用することができますが、この時のマイフローに表示されるクラウドフローを操作するための Web API は現在公開されていません。

今回は、公式に公開、サポートはされていませんが、この(既定)の環境の、マイフローに表示されるクラウドフローは、Logic Apps と似たような API を使って(無理やり)操作できるようなので、触ってみた結果を記事にしたいと思います。

※利用は自己責任でお願いします。
※ちなみに古いですがサポートされている方法としては、以下のような iframe 経由で操作する方法がありますが、これは使いやすいとは言いにくいものでした。

https://qiita.com/nanoka/items/12286d68f4523b20c3d6


# 参考にしたブログなど
Mohamed Ashiq Faleel さんのブログ
https://ashiqf.com/2021/05/09/everything-to-know-about-power-automate-rest-api-to-manage-and-administer-your-flows/

からめも さんのブログ
Power Automate の承認ワークフローを API から取得する
https://blog.karamem0.dev/entry/2021/11/17/120000

Dataverse Web API を利用する
https://docs.microsoft.com/ja-jp/learn/modules/common-data-service-web-api/

# やってみたこと

作業の流れとしては、以下の通りです。

- Azure AD へアプリ登録する
- Postman を設定して API を使用する
- いくつか API を使ってみる

## Azure AD へアプリ登録する

以下の記事の作業を参考にしています。

OAuth を使用して Microsoft Dataverse に対する認証を実行する
https://docs.microsoft.com/ja-jp/learn/modules/common-data-service-web-api/2-authenticate


### Azure AD へアプリを登録

以下のように Azure AD のアプリケーションを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/27e6219c-b208-81d9-e826-6c16cf6866ce.png)

### マニフェストの更新

マニフェストから、以下の3つを true にします。(今回は Postman から実行するため)

| 項目 | 値 | 
|:-----------|:------------:|
| allowPublicClient| true |
| oauth2AllowIdTokenImplicitFlow | true |
| oauth2AllowImplicitFlow | true |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/28e07738-cc14-b5f0-0f0c-edb66615ef2e.png)

### アクセス許可の追加

API のアクセス許可から、`Flows.Manage.All`のアクセス許可を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/08e86d43-abea-3a92-3272-d4f349687363.png)

これで、Azure AD の設定は完了です。

## Postman を設定して API を使用する

以下の記事の作業を参考にしています。

Postman を 使用して Microsoft Dataverse Web API を操作する
https://docs.microsoft.com/ja-jp/learn/modules/common-data-service-web-api/3-postman

### 環境変数の設定

以下のように環境変数を設定します

| 項目 | 値 | 
|:-----------|:------------|
| baseurl | https://api.flow.microsoft.com |
| env | Default-{Power Platform の環境のID} |
| url | {{baseurl}}/providers/Microsoft.ProcessSimple/environments/{{env}} |
| clientid | {Azure AD のアプリケーションID} |
| callback | https://callbackurl |
| authurl | https://login.microsoftonline.com/common/oauth2/authorize?resource={{resourceurl}} |
| resourceurl | https://service.flow.microsoft.com |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/e384992e-2d07-e66e-1519-88d5d816776d.png)

### トークンの取得

Authorization タブで、以下のような値を設定します。

| 項目 | 値 | 
|:-----------|:------------|
| Access Token | Available Tokens |
| Header Prefix | Bearer |
| Token Name | {自由な値} |
| Grant Type | Implicit |
| Callback URL | {{callback}} |
| Auth URL | {{authurl}} |
| Client Authentication | Send as Basic Auth header |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/62a969f8-dc94-8a98-e76f-30fa76a6eb20.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/8371c961-6e87-0cf6-ac69-593a76388e5b.png)

設定できたら、アクセストークンを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/6043caba-20e7-6539-afcc-1774fbda7481.png)

これで設定は完了です。

### API の呼び出しテスト

さっそく動かしてみます。

```http:GET
{{url}}/flows?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/140b91cf-bb98-539f-32de-f5578ce6f47e.png)

なーんかレスポンスが返ってきて、フロー名っぽいものが取れてます。やった！！！

## いくつか API を使ってみる

では、Logic Apps の API を参考にいくつか API を実行してみたいと思います。

### 自分の作ったフローの一覧を取得する

```http:GET
{{url}}/flows?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/7aaa320e-2f61-ea9c-b70d-dfa42d88948a.png)

### フローの詳細を取得する

```http:GET
{{url}}/flows/{flows で取得できる name }?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/52274b33-2c60-c40b-480b-551a9cbf65c1.png)

### フローの実行履歴を取得する

```http:GET
{{url}}/flows/{flows で取得できる name }/runs?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/43f86b84-7893-0bdd-d898-2ed9c9b796c7.png)

### フローのトリガーの履歴を取得する

```http:GET
{{url}}/flows/{flows で取得できる name }/triggers/{triggers で取得できる name}/histories?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/d43ab381-a30c-6523-5b3c-547d8beed993.png)

### フローのトリガーを再実行する

```http:POST
{{url}}/flows/{flows で取得できる name }/triggers/{triggers で取得できる name}/histories/{histories で取得できる name}/resubmit?api-version=2016-11-01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/11d1e72e-5429-764f-1123-70fa2dd03de3.png)


# 感想
無事、動作させることができました。
今後、どれくらいサポートされたり公開されたりするのかわかりませんが、実行履歴の取得とかは使いどころありそうかなと思いました。
また、再実行が可能だったので、かなり無理やりですが、HTTP コネクタもどきを作り出すこともできるかもしれません。

普通にフローを実行するとか、他人のフローを含めた一覧を取得するとかは、できれば便利そうなのですがおそらくできなそうでした。

興味があれば、ぜひいろいろ試してみてください。