Power Automateで、Teamsチャットに投稿したメッセージに埋め込まれた画像を取得したいのですが、できませんぞ…?
標準で用意されているアクションで実現できないことの中で、Microsoft 365サービスのデータ連携に関しては、HTTPリクエストでMicrosoft Graph APIを呼び出すと実現できる可能性があります。
この記事では、Power Automateの標準アクションで実現できないことについて、HTTPリクエストでMicrosoft Graph APIを呼び出す方法について、Teamsメッセージ内の画像取得を例に解説します。
- HTTPリクエストと、Microsoft Graph APIとは何か?
- HTTPリクエストができるコネクタの種類と違い
- HTTPアクションの具体的な使い方
今回やりたいこと
今回はPower Automateで、Teamsチャットのメッセージに埋め込まれた画像を取得し、別のチャットやチャネルに転記したり、SharePointフォルダに画像ファイルを保存できるようにしたいです。

試しにPower Automateで以下のようなフローを実行し、「メッセージ詳細を取得する」の「出力」で、上記のチャットメッセージに埋め込まれた画像が、どのように取得できるのかを確認します。

すると、以下の”content”内に、<img>タグで画像のURLが取得されていることが分かります。
"body": {
"contentType": "html",
"content": "<p>メッセージ画像取得のテスト</p>\n<p><img src=\"https://graph.microsoft.com/v1.0/chats/19:7eXXXXXXXX@unq.gbl.spaces/messages/XXXXXXX/hostedContents/aWQXXXXXXX/$value\" width=\"443.81009615384613\" height=\"250\" alt=\"画像\" itemid=\"0-ejXXXXXXX\"></p>",
"plainTextContent": "メッセージ画像取得のテスト\n"
},
<img>タグ内の、埋め込み画像の情報のみ抽出すると、以下のようになっています。
https://graph.microsoft.com/v1.0/chats/19:7eXXXX@unq.gbl.spaces(チャットID)/messages/XXXX(メッセージID)/hostedContents/aWQXXXX(画像の情報)/$value
画像情報は、チャット内メッセージのhostedContentsにが入っており、これは直接Power Automateの標準アクションで取得できないため、HTTPリクエストでGraph APIを呼び出す必要があります。
今回実現したいケースについて、Grah APIのHTTPリクエスト方法は、以下のMicrosoft Learnをご参考ください。
chatMessageHostedContent を取得する
…ちょっと待ってくだされ!全体的に意味が分かりませんぞ…
もう少し簡単な日本語でお願いしますぞ…!
少し難しい話から入ってしまいましたが、そもそもGraph APIやHTTPリクエストとは何かから、順を追って説明しますね!
全体的なフローの実装は、例えば以下のようになります。
例)チャットにメッセージが追加されたときに、メッセージに埋め込まれた画像を取得し、SharePointフォルダに格納する

すでに前提知識がある場合、次の章はスキップし、Teamsチャットのメッセージ埋め込み画像を取得する方法を見てください。
前提知識
Microsoft Graph APIとは?
Microsoft Graph APIは、Microsoft 365サービスにアクセスするための「統一された窓口」(エンドポイント)を提供します。
例えば、Power Automateの「HTTPリクエスト」アクションで、決められたフォーマットのHTTPリクエストをMicrosoft Graph APIに送信すると、Graph APIがMicrosoft 365の各種サービスのデータにアクセスし、指定した情報を返してくれます。

Microsoft Graph API、HTTPリクエスト…何だか難しいですな。
Power Automateの標準コネクタとして利用できるTeams等、一部のコネクタは、おそらく裏側でGraph APIが使われていると思われます。
HTTPリクエストとは?
HTTPリクエストは、Web上でクライアント(例:Webブラウザやアプリ)がサーバーに対して「これをしてほしい」と依頼するためのメッセージです。
HTTPは「Hypertext Transfer Protocol」の略で、Web上のデータ送受信を行うための仕組みです。
リクエストを受け取ったサーバーは処理を行い、HTTPレスポンスという形で結果を返します。
Power Automateの標準コネクタとしてよく利用する「SharePoint」や「Teams」「Outlook」等も、裏側では、それぞれのAPIエンドポイントに対して、HTTPリクエストを実行し、必要な情報取得やデータ操作をしています。
コネクタはこのような、APIを呼び出すための仕組み「APIラッパー」となっています。
しかし、Power Automateの標準コネクタで用意されているアクションでできないことも多く存在し、この場合「HTTPリクエスト」系のアクションを使って実現することができる場合があります。
例えば、今回解説する「Teamsチャットメッセージに埋め込まれた画像を取得」するのは、標準のアクションではできないため、「HTTPリクエスト」を「Microsoft Graph API」に送信することで実現できます。
なるほど!Teamsメッセージ内の画像取得は、Power Autoamteの「HTTPリクエスト」アクションを使って、自分でAPIエンドポイントを指定するのですな!
HTTPリクエストのコネクタの種類
Power Automateで、自分でAPIエンドポイントを指定して「HTTPリクエスト」ができるコネクタはいくつかあります。
- Teamsコネクタ
- HTTP with Microsoft Entra ID(事前承認) ※プレミアム
- HTTP with Microsoft Entra ID ※プレミアム
- HTTPコネクタ ※プレミアム
それぞれのコネクタの違いは以下のようになります。





使いたいAPIエンドポイントが、どのコネクタで利用できるか分からない場合も多いです。
Microsoft Graph APIで、Teams関連のリクエストをしたい場合、基本的に①>②>③>④の順で試して、HTTPリクエストが成功するコネクタを使うとよいと思います。
今回実現したい「Teamsチャットメッセージ内の画像取得」は、①と②では利用できないため、③か④で実装します。
Teamsチャットのメッセージ埋め込み画像を取得する方法
HTTPリクエストするURI部分を取得する
例として、Teamsチャットメッセージに埋め込まれた画像を取得したい場合の、HTTPリクエストするGraph APIのURI部分の抽出方法を説明します。
1.トリガーで「チャットに新しいメッセージが追加されたとき」を設定します。
2.「メッセージ詳細を取得する」アクションを追加し、「メッセージ」と「グループチャット」は以下のような関数式で設定します。
triggerBody()?['value']?[0]?['messageId']
triggerBody()?['value']?[0]?['conversationId']

3.データ操作の「作成」アクションを追加し、以下のような関数式を設定します。
split(outputs('メッセージ詳細を取得する')?['body/body/content'], '"')

4.「アレイのフィルター処理」のアクションを追加し、以下のように設定します。
From:動的なコンテンツから「作成」の「出力」を設定
Filter Query:左側は「item()」を式で設定、中央は「contains」、右側は「https://graph.microsoft.com」

5.「それぞれに適用する」で、動的なコンテンツから「アレイのフィルター処理」の「Body」を設定します。

6.「それぞれに適用する」の中で、HTTPリクエストのアクションをします。

HTTPリクエストの詳しい設定方法はこの後解説します。
Graph Exploreで必要な権限を確認する
HTTPリクエストでGraph APIを呼び出す際、必要となる権限を確認する必要があります。
以下のようにMicrosoft Learnで必要な権限(今回の場合、Chat.Readが必要)を確認することも可能ですが、リファレンスのドキュメントページを見つけるのが難しい場合、Graph Exploreを使うと便利です。

Graph Exploreのページを開き、自分のアカウントでサインインします。
画像情報を取得するGraph APIエンドポイントを入力し「GET」でHTTPリクエストを実行すると、下側で画像の取得が確認できました。
https://graph.microsoft.com/v1.0/chats/19:7eXXXX@unq.gbl.spaces(チャットID)/messages/XXXX(メッセージID)/hostedContents/aWQXXXX(画像の情報)/$value

このとき「Modify Permissions」を確認すると、最小限の権限として「Chat.Read」が必要なことが分かりました。

この情報を踏まえ、HTTPリクエストのコネクタの種類で説明したコネクタのアクションを順に試してみたところ、HTTP with Microsoft Entra IDと、HTTPコネクタで画像取得が成功しました。
どのコネクタを使えばよいか、すぐには分からないのですかな?
私も色々調べてみたのですが、リファレンスが見つからず、実際試してみるのが一番早いなという感想です。
今回使う「HTTP」と「HTTP with Microsoft Entra ID」は以下のコネクタになります。


これら2つのコネクタの大きな違いは、以下になります。
HTTP
- Azureでアプリケーション登録が必要
- 今回の場合、Chat.Read.Allの権限が必要
HTTP with Microsoft Entra ID
- Power Shellでユーザーへの権限付与が必要
- 今回の場合、Chat.Readの権限が必要

簡単にいうと、HTTPコネクタの方が、アプリ登録や、強い権限付与が必要になります。
今回の場合は「HTTP with Microsoft Entra ID」コネクタを使った方が良いということですな。
HTTP with Microsoft Entra IDコネクタを使う方法
HTTP with Microsoft Entra IDコネクタを使うには、最初にユーザーに必要なロールを追加する必要があります。
ユーザーにロールを追加する
1.以下のサイトを参考に、PowerShellのバージョン7をインストールします。
Microsoft Learn:WindowsへのPowerShellのインストール
2.以下のサイトから、Power Shellスクリプトファイルをダウンロードします。
Microsoft Learn:Microsoft Entra IDを使用したHTTP


3.ダウンロードした「ManagePermissionGrant.ps1」ファイルを右クリック>プロパティを開き、セキュリティの「許可する」にチェックを入れて、OKをクリックします。

4.スタートメニューから、PowerShell 7を開きます。

5.以下のように、ダウンロードした「ManagePermissionGrant.ps1」ファイルがあるディレクトリに移動し、以下を入力してEnterをクリックします。
.\ManagePermissionGrant.ps1

6.以下のような表示がされたら、「A」(Azure Global)を入力してEnterをクリックします。
ブラウザで認証画面が開くので、アカウントでの認証をします。

7.以下のような表示がされたら、「C」(Commonly used Apps)を入力してEnterをクリックします。

8.ポップアップで別ウィンドウが表示されるので、「Microsoft Graph」(必要な権限のアプリケーション)を選択して「OK」をクリックします。

9.必要な権限(今回の場合「Chat.Read」)を選択して「OK」をクリックします。

10.以下のような表示がされたら、「Y」か「N」を入力してEnterをクリックします。
※Y:全てのユーザーに権限を付与する N:個別のユーザーに権限を付与する

11.既存の権限を削除するかには「N」を入力してEnterをクリックします。
最後に、表示された権限を付与してよければ「Y」を入力して終了します。

ようやく、権限の付与が終わりましたな…
Power Automateを実装する
1.Power Automateで「HTTP with Microsoft Entra ID」の「HTTP要求を呼び出します」のアクションを追加します。
2.「基本リソースURL」と「Microsoft Entra IDリソースURI」に、以下のURLを入力し、「サインイン」をします。
https://graph.microsoft.com/
※サインインは、前のステップで権限を追加したユーザーのアカウントで実施します。

2.メソッドは「GET」を選択し、URIに以下のような指定をして、リクエストします。
https://graph.microsoft.com/v1.0/chats/19:7eXXXX@unq.gbl.spaces(チャットID)/messages/XXXX(メッセージID)/hostedContents/aWQXXXX(画像の情報)/$value

これでフローは完成です!
要求のURLの部分は、必要に応じてメッセージ詳細を取得するアクションから抽出したURLに変えればよいのですな!
HTTPコネクタを使う方法
今回は使いませんが、「HTTP」コネクタを使う場合の方法も紹介しておきます。
HTTPコネクタを使う場合、Azureでのアプリ登録が必要になります。
アプリ登録をする
1.Azureポータルを開き「Microsoft Entra ID」のビューを開きます。

2.「アプリの登録」から、新規にアプリを登録します。

3.登録したアプリに対し「APIのアクセス許可」から、新規に「アクセス許可の追加」をします。

4.Microsoft Graph>「アプリケーションの許可」から、今回必要な「Chat.Read」権限のアクセス許可を追加します。

5.管理者の同意が必要な場合、管理者権限で同意を与えます。

6.登録したアプリの「概要」から、「アプリケーション(クライアント)ID」と「ディレクトリ(テナント)ID」をコピーしておきます。
※Power Automateの設定で必要な情報です

7.登録したアプリの「証明書とシークレット」から、「新しいクライアントシークレット」を登録します。

8.登録したクライアントシークレットの「値」をコピーしておきます。
※Power Automateの設定で必要な情報です

Power Automateを実装する
1.Power Automateで「HTTP」コネクタの「HTTP」アクションを追加し、URIに以下のGraph APIに対してGETメソッドで、リクエストします。
https://graph.microsoft.com/v1.0/chats/19:7eXXXX@unq.gbl.spaces(チャットID)/messages/XXXX(メッセージID)/hostedContents/aWQXXXX(画像の情報)/$value

2.認証タイプは「Active Directory OAuth」にして、以下のように設定します。
- テナント:コピーした「ディレクトリ(テナント)ID」
- 対象者:https://graph.microsoft.com
- クライアントID:コピーした「アプリケーション(クライアント)ID」
- 資格情報の種類:シークレット
- シークレット:コピーした「クライアントシークレットの値」

上記の設定で、Power Automateを実行すると、画像情報が取得できます。
あとは例えば以下のように、取得した画像をSharePointフォルダに保存したりできます。

さいごに
この記事では、Power Automateの標準アクションで取得できないTeamsチャットのメッセージ内の埋め込み画像を取得する実装を例に、HTTPリクエストでMicrosoft Graph APIを呼び出す方法を紹介しました。
HTTPリクエストができるコネクタの種類としては、以下のようなものがあります。
- Teamsコネクタ
- HTTP with Microsoft Entra ID(事前承認) ※プレミアム
- HTTP with Microsoft Entra ID ※プレミアム
- HTTPコネクタ ※プレミアム
今回は、③HTTP with Microsoft Entra IDと、④HTTPコネクタの2つを使ったやり方を紹介しました。
「HTTP with Microsoft Entra ID」を使う場合、事前にPowerShellでユーザーに対して必要な権限を付与します。
必要な権限は、Microsoft Learn等の公式サイトや、Graph Exploreで確認することができます。
「HTTPコネクタ」を使う場合、Azureでのアプリ登録が必要になります。
今回の場合、アプリ登録をする場合の方が、より強い権限の付与が必要になります。
権限を付与する場合は、最低限必要な権限が何かを確認し、慎重に付与しましょう。
例えば「Chat.Read.All」等の権限をつけると、全てのユーザーのチャットメッセージを読むことができてしまうため、必要な権限の付与は注意しましょう。