Teams会議終了後に自動で録画ファイルへのリンクを取得する Power Automate フロー

# はじめに
Teams会議でレコーディングを行った際に保存される、録画データへのリンクを自動的に取得するフローを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/94031515-5391-c7a4-8119-9f4d81b8c728.png)

応用すれば、会議への参加記録とともにListsに保存したり、ファイルをOneDriveに保存したりすることができると思います。
今回はリンクを自分宛てにチャットで送信しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/48c9a3af-1113-0c55-5a96-5e376084210e.png)


# 取得方法の概要
録画が保存されると、会議のチャットに投稿されるシステムメッセージから、ファイルへのリンクを取得します。
ちなみに、このシステムメッセージからは、他にも会議の開始や終了などの情報取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ee432c0a-1261-3066-7b83-559eb8ded33c.png)

予定表に登録されたイベントの開始をトリガーに、会議のチャットIDを取得し、会議の終了を見計らってメッセージの一覧を取得、リンクの含まれたメッセージをうまく見つけ出し、そこからリンクを取得します。

# 会議のスレッドIdの取得
フローの全体像です。
![make.powerautomate.com_environments_Default-b794cd83-44cc-447c-856e-a27e55624c65_flows_b5e5c0d6-5e05-4e3b-b884-ad35e6b4487f_v3=true(Power Automate).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6ba36fcf-b632-0765-7cab-c341b0859cbc.png)

このうちの、会議のスレッドIdを取得するところまでは他の記事で書いた内容と同一ですのでそちらをご覧ください。
- 前回記事

https://qiita.com/ksgiksg/items/452a4423a3afa72f5344

- 前回記事の元ネタ

https://sasami-axis.hatenablog.com/entry/2023/06/24/154704

# 会議の終了まで待機
録画が終了して保存が完了してからでないと、録画のリンクを取得することはできません。
そのため、少なくとも会議の終了まで待機するように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/dee15697-d2d8-5e85-36c6-d990ed130349.png)

:::note info
必要であれば追加で遅延アクションを設定し、保存が完了するまでの猶予を持たせることもできます。
また、後述の方法を`Do until`で取得できるまで繰り返す方法もあるかと思います。
:::

# 会議スレッドのメッセージ一覧を取得する
会議スレッドIdが取得できたところから解説をはじめます。
ここでは`chatId`という変数に格納しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e93f5d5c-a67e-b225-c6b3-33e7d65528d2.png)

それから、取得したメッセージの一覧を格納するための配列型変数も初期化しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/fae3400a-0284-38f9-7a95-5c3b8b85abf5.png)

## チャネル会議の場合
まずはチャネル会議の場合です。
チャネル会議の場合、取得した`chatId`はチャネルのIdとなっており、別途チームのIdも必要になります。
チームIdの取得方法も[前回記事](https://qiita.com/ksgiksg/items/452a4423a3afa72f5344
)で紹介しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e89a2de6-d441-1ff3-7946-a911e3989977.png)

チームId(`groupId`)、チャネルId(`chatId`)、スレッドId(`messageId`)が揃ったらメッセージの一覧を取得します。
取得にはMicrosoft Graph APIを使用します。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/42d78d31-8eb0-2928-3907-13b0983cc154.png)

```plaintext:メソッド
GET
```

```uri:URI
https://graph.microsoft.com/v1.0/teams/@{outputs('作成：groupId')}/channels/@{variables('chatId')}/messages/@{variables('messageId')}/replies?$top=50
```

```plaintext:コンテンツタイプ
application/json
```
:::note warn
URIの末尾`$top=50`は、最新のメッセージから順に取得できるメッセージの件数を、最大である50件に設定するためのパラメータです。
録画が通知されてからメッセージの一覧を取得するまでの間に、追加で50件以上のメッセージがあると、最大取得件数を超過し取得できない可能性があります。
:::

取得できたら、メッセージの一覧を変数に格納しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f2041dae-7950-faa7-c1d1-a9fdff7c59b4.png)
```plaintext:変数の設定
@{body('Microsoft_Graph_HTTP_要求を送信する_1')?['value']}
```

## チャネル会議以外の場合
チャネル会議以外の場合、チャットにメッセージが投稿される場合も、同様にMicrosoft Graph APIを使用して、メッセージの一覧を取得します。
チャットの場合とチャネルスレッドの場合は取得方法が異なりますので、URIの違いに注意してください。

https://learn.microsoft.com/ja-jp/graph/api/chat-list-messages?view=graph-rest-1.0&tabs=http

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/54a19a67-ce76-248d-26b0-38f8016d42f4.png)

```uri:URI
https://graph.microsoft.com/v1.0/me/chats/@{variables('chatId')}/messages?$top=50
```
こちらも取得結果を変数に格納しておきます。


# 録画を通知するシステムメッセージを探す
メッセージの一覧から、録画を通知するメッセージを探します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a2a04c67-ec9f-e605-5681-4eb147555865.png)

取得した結果を見るとそれらしい結果がありました。
リンクのURLや、保存されたファイルの表示名も含まれていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/bd192820-3a7f-f33d-a062-4b72d7e434d1.png)

一覧からこのメッセージに絞り込む条件には、`callRecordingStatus`を見ると良さそうです。
通話記録、録画の保存が成功したときには、この値が`success`になります。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e2b27625-0f2a-2e06-d1bb-2ff376f3a2c7.png)
```plaintext:From
@{variables('messages')}
```

```plaintext:Filter Query
@equals(@{item()?['eventDetail/callRecordingStatus']},'success')
```

# 取得したリンクを通知
絞り込んだメッセージから、リンクとファイルの表示名を取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/100e7184-3f19-6ce4-a2c6-cc99b414aea9.png)

```plaintext:変数を初期化する：callRecordingUrl
@{body('アレイのフィルター処理')?[0]?['eventDetail/callRecordingUrl']}
```

```plaintext:変数を初期化する：callRecordingDisplayName
@{body('アレイのフィルター処理')?[0]?['eventDetail/callRecordingDisplayName']}
```

リンクが取得できたら、Htmlタグでハイパーリンクを作ってあげて、自分にチャットで通知して完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/141a6257-ac7f-ad63-2bef-ca0cf24d09ef.png)

# おわりに
自分が開催した会議の録画を一覧管理したかったので、何とかフローで自動化してみました。
そもそも会議スレッドの取得が難しい、チャネル会議がちょっと特殊、イベント情報から録画を直接取得する方法がない（なさそう）、といたるところにハードルがあり、フローも複雑になってしまいましたが、なんとか目的は達成できました。

今度はこのリンクから、録画ファイルの有効期限を編集してみようと思っています！

https://x.com/ksgiksg/status/1882795119671480333