GMO DevelopersDay
GMO DevelopersDay
2024.11.29Fri - 11.30Sat YouTube Live
イベント開催まであと8

Teamsの投稿メッセージと返信を取得する方法

オフィスワーク モダナイズ への道

 Teamsには投稿メッセージのバックアップやエクスポート機能が標準では提供されていません。Power Automateからでは不十分、Microsoft GraphのAPIを利用することで完全取得が可能ですが利用新鮮手続きが必要になります。今回は実用的なTeamsのメッセージ取得方法を紹介します。

Power AutomateでTeamsのメッセージを取得する場合

 今回は以下のメッセージの内容を取得してみたいと思います。シンプルな投稿メッセージとその返信です。

Power AutomateのTeamsアクションで「メッセージを取得します」を実行してみると、最初の投稿メッセージは取得できているもの、返信内容が取得できていません。

「メッセージ詳細を取得する」アクションで返信内容を取得できそうですが、親メッセージのIDは取得できるものの、返信メッセージのIDがどこからも取得できなかったのでこちらも利用できなさそうです。

もうひとつ、トリガーとして「選択したメッセージの場合」と「メッセージ詳細を取得する」アクションを組み合わせみます。

こちらのフローをテスト実行して、Teamsの返信メッセージの三点リーダーの「その他のオプション」-「その他の操作」からフローを選択します。

今度は返信メッセージの詳細が取得できております。ただし、この場合は毎回メッセージを選択してフローを実行しなくてはなりませんので実用的ではありません。

以上から、Power AutomateのTeams標準機能では返信を含めたメッセージを取得することができなさそうです。

PowerShellのTeamsモジュールを利用する場合

 PowerShellではTeams専用のモジュール「Microsoft Teams PowerShell モジュール(https://learn.microsoft.com/ja-jp/powershell/module/teams/?source=recommendations&view=teams-ps)」が提供されています。チームやチャネル、メンバーなどの情報がコマンド一つで取得可能です。コマンド一覧を確認してみたところ、残念ながらメッセージを取得できるコマンドは用意されていませんでした。

Microsoft Graphを利用する場合

 以前紹介したMicrosoft Graphでは、Teams関連の機能が数多く提供されています。

https://developers.gmo.jp/26063/

リファレンスを見てみると

  • チャネル メッセージを一覧表示する – Microsoft Graph v1.0 | Microsoft Learn
    https://learn.microsoft.com/ja-jp/graph/api/channel-list-messages?view=graph-rest-1.0&tabs=http
  • チャネル メッセージの返信を一覧表示する – Microsoft Graph v1.0 | Microsoft Learn
    https://learn.microsoft.com/ja-jp/graph/api/chatmessage-list-replies?view=graph-rest-1.0&tabs=http

こちらの2つのAPIが利用できそうです。

ですが、よく調べてみると

  • Microsoft Teams の保護された API
    https://learn.microsoft.com/ja-jp/graph/teams-protected-apis

利用しようとしているAPIにこちらの制限が適用されており、利用するにはMicrosoftへアプリケーションの申請が必要となっています。

要求フォームから申請が可能です。

内容としてはAzure Active Directoryに登録したアプリケーションのIDなどを送信するだけです。

許可されるには数日かかるようなので、連絡が来るまでまちましょう。

アクセスが許可されれば、API経由でメッセージが取得できるようになります。Web上でGraph APIの動作確認ができる「Graph Explorer(https://developer.microsoft.com/ja-jp/graph/graph-explorer)」であれば、APIのアクセス許可は不要なので実行してみましょう。
右上のアイコンからサインインした後、「GET チャネル内のメッセージ(返信なし)」を選択します。バージョン「v1.0」を選択します。リクエストURLは
https://graph.microsoft.com/v1.0/teams/{group-id-for-teams}/channels/{channel-id}/messages
こちらの書式となっているので、テスト用にチームID(グループID)とチャネルIDをPowerShell取得して実行してみましょう。

$TeamId = (Get-Team -DisplayName "チーム名").GroupId
$ChannelId = (Get-TeamChannel -GroupId $TeamId | Where-Object {$_.DisplayName -eq "General"}).Id

実行するのはこちらのURLとなります。
https://graph.microsoft.com/v1.0/teams/7d1d1a34-a372-4d11-b707-699f0c28f279/channels/19:[email protected]/messages

投稿元のメッセージが取得できています。

この実行結果からメッセージIDを取得しておきます。

次に「GETチャネ内のメッセージ返信」を選択します。同様にチームIDとチャネルIDに加えて先ほど取得してメッセージIDを入力してリクエストURLを作成します。
こちらのURLを実行します。
https://graph.microsoft.com/v1.0/teams/7d1d1a34-a372-4d11-b707-699f0c28f279/channels/19:[email protected]/messages/1672718899127/replies
今度は返信内容が取得できました。

Microsoft GraphでTeamsの投稿メッセージと返信メッセージが取得できることが確認できました。
MicrosoftよりAPIの利用許可がでたら、以下を参考にTeamsのメッセージが取得できるようになります。

https://developers.gmo.jp/26063/

PowerShellのMicrosoft.Graph.Teamsモジュールを利用する場合

 最後に、すぐに利用できる実用的な方法です。
REST形式で利用できるMicrosoft Graph APIはPowerShellのモジュールとしても提供されています。PowerShellのモジュールで利用する場合は、Azureへのアプリケーションの登録や「Microsoft Teamsの保護されたAPI」の制限解除の為のMicrosoftへの利用申請は必要ありません。
実は、先ほどの「Graph Exploer」ではPowerShellのコードサンプルも参照できるようになっています。
実行結果から「コードスニペット」を選択するとサンプルが表示されます。

元のメッセージは 
Get-MgTeamChannelMessage 
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.graph.teams/get-mgteamchannelmessage?view=graph-powershell-1.0
返信は 
Get-MgTeamChannelMessageReply 
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.graph.teams/get-mgteamchannelmessagereply?view=graph-powershell-1.0
のコマンド取得できることが分かります。

以下がコード全体となります。
チームIDとチャネルIDはTemasモジュールでもGraphモジュールでも取得可能です。

Install-Module Microsoft.Graph -Force
Install-Module MicrosoftTeams -Force

$M365User = "アカウント名@xxx.onmicrosoft.com"
$Password = ConvertTo-SecureString 'パスワード' -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential $M365User,$Password

Connect-MicrosoftTeams -Credential $Credential
Select-MgProfile -Name "v1.0"
$Scopes = @(
"ChannelMessage.Read.All" 
)
Connect-MgGraph -Scopes $Scopes

$TeamName = "test20230101"
$ChannelName = "General"

$TeamId = (Get-MgGroup -Filter "resourceProvisioningOptions/Any(x:x eq 'Team')" | Where-Object {$_.DisplayName -eq $TeamName}).Id
#$TeamId = (Get-Team -DisplayName  $TeamName).GroupId

$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}).Id
#$ChannelId = (Get-TeamChannel -GroupId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}).Id

$Messages = Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId  $ChannelId

ForEach ($Message in $Messages) {

    If ($Message.MessageType -ne "message") {Continue}    
    $Message.From.User.DisplayName + " " + $Message.CreatedDateTime.AddHours(9) + " " + $Message.Body.Content   

    $Replys = Get-MgTeamChannelMessageReply -TeamId $TeamId -ChannelId $ChannelId -ChatMessageId $Message.Id 

    ForEach ($Reply in $Replys) {
        "    " + $Reply.From.User.DisplayName + " " + $Reply.CreatedDateTime.AddHours(9) + " " + $Reply.Body.Content
    }
}

実行すると、投稿メッセージと返信が取得できています。

PS C:\> 
$TeamName = "test20230101"
$ChannelName = "General"	

$TeamId = (Get-MgGroup -Filter "resourceProvisioningOptions/Any(x:x eq 'Team')" | Where-Object {$_.DisplayName -eq $TeamName}).Id
#$TeamId = (Get-Team -DisplayName  $TeamName).GroupId

$ChannelId = (Get-MgTeamChannel -TeamId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}).Id
#$ChannelId = (Get-TeamChannel -GroupId $TeamId | Where-Object {$_.DisplayName -eq $ChannelName}).Id

$Messages = Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId  $ChannelId

ForEach ($Message in $Messages) {

    If ($Message.MessageType -ne "message") {Continue}    
    $Message.From.User.DisplayName + " " + $Message.CreatedDateTime.AddHours(9) + " " + $Message.Body.Content   

    $Replys = Get-MgTeamChannelMessageReply -TeamId $TeamId -ChannelId $ChannelId -ChatMessageId $Message.Id 

    ForEach ($Reply in $Replys) {
        "    " + $Reply.From.User.DisplayName + " " + $Reply.CreatedDateTime.AddHours(9) + " " + $Reply.Body.Content
    }
}




樋口勝一 01/03/2023 13:08:19 こんにちは!
    佐藤 01/03/2023 13:13:36 よろしくお願いします。

 以上、Teamsの投稿メッセージと返信を取得する実用的は方法を紹介しました。「Microsoft Teams の保護された API」の制限解除となれば、Power Autometeのクラウドフローからでもメッセージ取得が可能となります。実行環境にこだわりが無ければ、PowerShellでのMicrosoft Graph API(Microsoft.Graph.Teamsモジュール)の利用が一番実用的な選択となります。Microsoft Graphを使いこなせるようになれば、Teamsだけではなく、Microsoftが提供する様々なクラウドサービスをカスタマイズしてオリジナルのツールやサービスが開発できるようになります。

是非お試しください。

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネットグループ株式会社

1999年6月GMOインターネットグループ株式会社に入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。「マイクロソフトMVPアワード」を15度受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック