!!! MS-Teams にメッセージ投稿 {{category Windows PowerShell,nolink}} PowerShell で、Microsoft Teams のチャットおよびチームのチャネルにメッセージ投稿する。 方法としては、PowerShell から Webhook を呼び出して。 Workflow で Webhook のイベントを受け取り、チャットまたはチームのチャネルにメッセージ投稿する。 投稿するメッセージ内容は、アダプティブ カード を JSON 形式で作成する。 * Teams 向けアダプティブ カードの概要 - Power Automate | Microsoft Learn ** https://learn.microsoft.com/ja-jp/power-automate/overview-adaptive-cards * Adaptive Cards Designer ** https://adaptivecards.io/designer ** https://adaptivecards.microsoft.com/designer !! 1. ワークフローを新規作成する Teams から Workflows を開き、新規ワークフローを作成する。 テンプレートから「Webhook要求を受信するとチャネルに投稿する」を選択する。 ワークフロー名と Teams に接続するアカウントが正しいことを確認するアカウントが正しいことを確認する。 Workflows アプリから作成した場合は、投稿するチームとチャネルを選択する (チャネルのコンテキストメニューから作成した場合は、スキップ)。 フローが作成されると、送信先URL が表示されるので、メモ する。 !! 2. PowerShell で投稿する 投稿するメッセージのアダプティブ カードをJSON 形式で作成、作成したワークフローの Webhook URL へ Invoke-WebRequest で POST する。 ==メッセージに日本語がある場合、文字化けするため、Latin-1 でエンコードした文字列にする必要がある。== 「項」が含まれるときに、"[E9][A0]" がコードページから Unicode に変換できず、デシリアライズが出来ないと、エラーになる。 ContentType で、charset=UTF-8 と文字コードを指定するが正しいかな… !サンプルコード ## Microsoft Teams メッセージ投稿 # 送信メッセージの作成 (" `n"で改行、"`n`n"で次の段落) # メンションする場合は、UPN を入れる [string]$msg = "MS-Teams メッセージ投稿`n`n新しい段落 `n強制改行" ## ----------==========----------==========---------- # POSTデータ (アダプティブ カード を JSON 形式で POST) [string]$post = ConvertTo-Json -Depth 100 -Compress @{ "attachments"=@( @{ "contentType" = "application/vnd.microsoft.card.adaptive"; "content" = @{ "$schema" = "http://adaptivecards.io/schemas/adaptive-card.json"; "type" = "AdaptiveCard"; "version" = "1.2"; "body" = @( @{ "type" = "TextBlock"; "text" = $msg; "wrap" = $True; "markdown" = $True; } ) # body "msteams" = @{ "width" = "Full"; } # msteams } # content } ) } #Write-Host $post ## ----------==========----------==========---------- # Teams の Webhook URL 'Workflow作成時に発行されたURLを指定' [string]$uri="https://prod-13.japaneast.logic.azure.com:443/workflows/86〜" #メッセージの送信 Add-Type -AssemblyName System.Web $res = Invoke-WebRequest -Uri $uri -Body $post -ContentType "application/json;charset=UTF-8" -Method Post -UseBasicParsing #Write-Output $res #Write-Host "Status" $res.StatusCode $res.StatusDescription if ($res.StatusCode -eq 202) { Write-Host "メッセージ送信完了" } !! 通知が届かない場合 POST時にエラーのステータスコードが返っていないか。Workflows の実行履歴を確認する。 !! 投稿するメッセージ * Microsoft Teams の Markdown 書式設定を使用する - Microsoft サポート ** https://support.microsoft.com/ja-jp/office/4d10bd65-55e2-4b2d-a1f3-2bebdcd2c772 * カードでテキストを書式設定する - Teams | Microsoft Learn ** https://learn.microsoft.com/ja-jp/microsoftteams/platform/task-modules-and-cards/cards/cards-format ! 改行 markdown 書式が有効になっている場合は、「 `n」(半角空白2つとバッククォートとn)で 改行、「`n`n」(バッククォートとnを2回)で 次の段落 となる。 ! 太字・斜体 太字・斜体は、対象の文字を次のように囲む。 太字「**Bold**」、斜体「_Italic_」「*Italic*」。 取り消し線は、ない模様。 ! リスト 記号付きリストは、「* 項目」または「- 項目」。番号付きリストは、「1. 項目」。で記載する。 PowerShell の文字列で組み立てる場合は、適に改行などで区切られる必要がある。 なので、文字列で組み立てる場合 "`n1. item1`n2. item2`n" や "`n* item1`n* item2`n" の様になる。 ! リンク ハイパーリンクは、「[テキスト](URL)」の形式で記載する。 !! メンション 特定のユーザ または タグのユーザ にメンションする。 ! ユーザ にメンション メッセージ内に「UPN」を入れることで、atタグの部分がユーザ名となり、メンションされる。 UPN (User Principal Name) は、「username@xxxx.onmicrosoft.com」などの連絡先(ログインID)。 でいいのかな… ! タグ にメンション チームで作成したタグでメンションする場合は、メッセージ内に「{id}{teamId}」を入れることで、タグ名に置換されメンションされる。 チームとタグのIDは、Power Automate で、「タグの @mention トークンを取得する」のコード表示とかで取得できる。 ! チャットの全員、チーム・チャネル チャットの全員(@everyone、@全員、@皆様) や チーム・チャネル の全員にメンションする方法はないっぽい… !メンション メッセージ内に「user1」の様に atタグ を記載する。 そして、entities 要素の中にメンションのユーザ情報を記載する。 [string]$post = ConvertTo-Json -Depth 100 -Compress @{ "attachments"=@( @{ "contentType" = "application/vnd.microsoft.card.adaptive"; "content" = @{ "$schema" = "http://adaptivecards.io/schemas/adaptive-card.json"; "type" = "AdaptiveCard"; "version" = "1.2"; "body" = @( @{ "type" = "TextBlock"; "text" = "Hi user1. `nMS-Teams メッセージ投稿"; "wrap" = $True; "markdown" = $True; } ) # body "msteams" = @{ "width" = "Full"; "entities" = @( @{ "type" = "mention"; "text" = "user1"; "mentioned" = @{ "id" = "username@xxxx.onmicrosoft.com"; "name" = "ユーザ表示名"; } } ) } # msteams } # content } ) }