Power Automate で Teams の プレゼンスを取得する方法

# はじめに

Power Automate で Microsoft Graph を利用し、Teamsのプレゼンスを取得する方法を記載します。

https://docs.microsoft.com/ja-jp/graph/api/resources/presence?view=graph-rest-1.0


# 注意
プレミアムコネクタを利用します。有料ライセンスが必要です。
運用環境での使用は許可されていませんが、開発向けプランや開発者テナントであれば無償でお試しいただけます。

[開発者向けプラン](https://powerapps.microsoft.com/ja-jp/developerplan/)
[Microsoft 365 開発者テナント ](https://developer.microsoft.com/ja-jp/microsoft-365/dev-program)


# 1．Azure Portalでアプリを登録する

アプリの登録方法は、下記記事をご参照ください。

https://qiita.com/MiyakeMito/items/a768841d76d22544a4c6#1azure-portal%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B


必要なアクセス許可は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4d7fd3c7-81a5-e20b-e5d6-13bbac00b960.png)

https://docs.microsoft.com/ja-jp/graph/api/presence-get?view=graph-rest-1.0&tabs=http

加えて、ユーザーIDも取得するため、下記も追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/14627d07-da28-8f19-de56-b09109b84412.png)

https://docs.microsoft.com/ja-jp/graph/api/user-get?view=graph-rest-1.0&tabs=http



# 2．Power Automate でフローを構築する

## 2-1.アクセストークンを取得する

利用する Graph API で付与する権限スコープは委任です。

「委任されたアクセス許可」で Graph API を実行する場合は、[HTTP with Azure AD] > [HTTP 要求を呼び出します] アクションで動作できると手軽なのですが、「presence」は不可です。
よって、実行前にトークンの取得が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4ed2fb49-e0d5-d52b-2bb0-7f26a089d029.png)

トークンの取得方法は以下をご参照ください。
手順は二通りあります。後者の方が構築する手順は少ないですが、セキュアではありません。

■「OAuth 2.0 認証コードの付与フロー」

https://qiita.com/MiyakeMito/items/a768841d76d22544a4c6#2power-automate-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97

■「OAuth 2.0 リソース所有者のパスワード資格情報 (ROPC) 付与 」

https://qiita.com/MiyakeMito/items/e433059661dbfcd4fdf4#2-3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8F%96%E5%BE%97


## 2-2.自身のプレゼンスを取得する

自身のプレゼンスは`/me/presence`で取得でいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/5b495760-26ae-99f4-7927-74c108a0d3ab.png)
■方法
```
GET
```

■URI
```
https://graph.microsoft.com/v1.0/me/presence
```

■ヘッダー
```
Content-Type : Bearer @{body('HTTP')?['access_token']}
```
`@{body('HTTP')?['access_token']}`には、「2-1.アクセストークンを取得する」で取得したアクセストークンを設定します。
アクション名が「HTTP」であれば、上記の値を変更する必要はありません。


## 2-3.ユーザーIDを取得する

自身のプレゼンスのみを取得するのであれば不要な手順ですが、他のメンバーのプレゼンスを取得する場合は、該当ユーザーのIDが必要です。

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/25d64cae-b6e8-eb29-6d63-10c7e659362d.png)
■方法
```
GET
```

■URI
```
https://graph.microsoft.com/v1.0/users/{UPN}
```

`{UPN}` には取得するユーザーのUPNを設定してください。

■ヘッダー
```
Content-Type : Bearer @{body('HTTP')?['access_token']}
```
`@{body('HTTP')?['access_token']}`には、「2-1.アクセストークンを取得する」で取得したアクセストークンを設定します。
アクション名が「HTTP」であれば、上記の値を変更する必要はありません。


## 2-3.他のメンバーのプレゼンスを取得する

他のメンバーのプレゼンスを取得するには、

* 一人のプレゼンスを取得
* 複数ユーザーのプレゼンスを取得

２つの方法があります。

### 一人のプレゼンスを取得

URIに、「2-3.ユーザーIDを取得する」のユーザーIDを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/7662c6de-787b-dde3-c014-c0a9d58b2bc8.png)
■方法
```
GET
```

■URI
```
https://graph.microsoft.com/v1.0/users/@{body('Get_users_1')?['id']}/presence
```
`@{body('Get_users_1')?['id']}` には「2-3.ユーザーIDを取得する」のユーザーIDを設定してください。

■ヘッダー
```
Content-Type : Bearer @{body('HTTP')?['access_token']}
```
`@{body('HTTP')?['access_token']}`には、「2-1.アクセストークンを取得する」で取得したアクセストークンを設定します。
アクション名が「HTTP」であれば、上記の値を変更する必要はありません。

実行結果は下記です。各状態の一覧です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/84ea3bfe-227a-0702-67ad-baffe83c7d54.png)


| 値 | 意味 |
|:-----------|:------------|
| available | 応答可能 |
| busy | 取り込み中 |
| dnd | 応答不可 |
| brb | 一時退席 |
| away | 退席中 |
| offline | オフライン |

https://support.microsoft.com/ja-jp/office/teams-%E4%B8%8A%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B-ce36ed14-6bc9-4775-a33e-6629ba4ff78e

### 複数ユーザーのプレゼンスを取得

URIに、本文のユーザーIDを配列で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/d8329197-44c7-697b-3f1d-6af05be74d3c.png)
■方法
```
POST
```

■URI
```
https://graph.microsoft.com/v1.0/communications/getPresencesByUserId
```

■ヘッダー
```
Content-Type : Bearer @{body('HTTP')?['access_token']}
```
`@{body('HTTP')?['access_token']}`には、「2-1.アクセストークンを取得する」で取得したアクセストークンを設定します。
アクション名が「HTTP」であれば、上記の値を変更する必要はありません。

■本文
```
{
  "ids": [
    "@{body('Get_users_1')?['id']}",
    "@{body('Get_users_2')?['id']}"
  ]
}
```

`@{body('Get_users_1')?['id']}` や `@{body('Get_users_2')?['id']}` には、「2-3.ユーザーIDを取得する」のユーザーIDを設定してください。
配列の構造ですので、調べるユーザー分、要素を追加してください。



以上です