Purpose
TeamsのWebhookにメッセージを送信するときの自分的ポイントをまとめる。
取り組んでいたこと
ディスクの空き容量を計算して、計算結果を関係者に通知するという単純な定期バッチを実装した。通知方法は、これまでメールを使っていたが、メンテナンスがつらかったので、Teamsに代替することを考えた。
極力Powershellの基本機能だけを利用してスクリプトを組みたかったため、WebhookのURLにメッセージをPostする方式で解決できる方法を探した。
前提
メッセージを送信するためには、メッセージの受信者が必要になる。今回は、temasのWebhookを利用するため、あらかじめ、こちらの拡張機能を「チーム」のなかの、チャンネルに設定する必要がある。概要の方法に従って設定ができる。
!注意! ガイドには、以下のようにある。
- Webhook を追加するチャネルに移動し、上部のナビゲーション バーから (•••) [その他のオプション] を選択します。
- ドロップダウン メニューから [コネクタ] を選択し、受信 Webhook を検索します。
が、しかし、そんなドロップダウンのメニューが見つからない場合は、左メニューの[アプリ]からIncoming Webhookを検索すると設定ができる。
メッセージの送信
シンプルなメッセージ
チュートリアルでは、以下のコマンドでHelloworldしている。
Invoke-RestMethod -Method post -ContentType 'Application/Json' -Body '{"text":"Hello World!"}' -Uri <YOUR WEBHOOK URL>
これを参考にしたら、すぐにメッセージの送信ができた。 一行程度のメッセージだけであれば、これで問題ない。
若干複雑なメッセージの送信
複数行にわたるアウトプットや、画像を表示させたいなどの要望があったため、もう少し調べた。メッセージ送信のチュートリアルの冒頭に以下の記載がある。
Office 365 コネクタまたは着信 Webhook 経由でメッセージを送信するには、Webhook URL に JSON ペイロードを投稿します。 通常、このペイロードは Office 365 コネクタ カードの形式になります。
そして、その下に、サンプルとなるメッセージカード(Jsonペイロード?)が示されている。これを-Bodyの引数に渡してやれば、メッセージが送信できる。大枠ができれば、このサンプルをテンプレートとして、いろいろな値を直したり、カードのレイアウトをいじったりするとオリジナルのテンプレートが作成できる。レイアウトの編集が結構大変である。
↓は↑のテンプレートをちょっといじってみたやつ。今のところ、アクションを使う予定はないため、一旦スルーした。
{ "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "0076D7", "summary": "Summary", "sections": [{ "activityTitle": "This is ActivityTitle", "activitySubtitle": "This is ActivitySubtitle", "activityImage": "https://teamsnodesample.azurewebsites.net/static/img/image9.png", "facts": [{ "name": "The No.1 item of Facts", "value": "Value" }, { "name": "The No.2 item of Facts", "value": "Value" }, { "name": "The No.3 item of Facts", "value": "Value" }, { "name": "The No.4 item of Facts", "value": "if markdown is true, We can use **markdown** format!" }], "markdown": true }] }
その他の若干複雑なメッセージの送信(アダプティブカード)
チュートリアルには、Office 365 コネクタ カードの形式が基本となると記載されているが、その他の形式として、アダプティブカードも掲載されている。名前が違うだけあって先ほどのOffice365形式のものとは別のJson構造になっている。
{ "type":"message", "attachments":[ { "contentType":"application/vnd.microsoft.card.adaptive", "contentUrl":null, "content":{ "$schema":"http://adaptivecards.io/schemas/adaptive-card.json", "type":"AdaptiveCard", "version":"1.2", "body":[ { "type": "TextBlock", "text": "For Samples and Templates, see [https://adaptivecards.io/samples](https://adaptivecards.io/samples)", } ] } } ] }
こちらの形式では、bodyの中でカードのレイアウトを定義していくような形になっている。上記の例では、1つのTextBlockが配置されているだけのカードが作成される。
このアダプティブカードのいい点は、レイアウトをカスタマイズするための編集ツールがWebで公開されている点だと思う。
これを使えば、ASP.NET WebformのUI作成のような感覚でカードを作成できる。注意点は以下の2点。
1. 作成したJsonは、丸ごとコピーして、上記テンプレートのcontentの中身と交換する。置換場所を間違えるとメッセージが送信できなくて詰む。
2. ${} 形式で書かれている埋め込み式の変数はWebhook向けのペイロードでは利用できない。これらはあくまでBotFrameworkのSDK用のものらしい。残念。
{ "type":"message", "attachments":[{ "contentType":"application/vnd.microsoft.card.adaptive", "contentUrl":null, "content":{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.3", "body": [ { "type": "TextBlock", "text": "Your registration is almost complete", "size": "Medium", "weight": "Bolder", "wrap": true }, { "type": "TextBlock", "text": "What type of food do you prefer?", "wrap": true }, { "type": "ImageSet", "imageSize": "medium", "images": [ { "type": "Image", "url": "https://contososcubademo.azurewebsites.net/assets/chicken.jpg" }, { "type": "Image", "url": "https://contososcubademo.azurewebsites.net/assets/tofu.jpg" }, { "type": "Image", "url": "https://contososcubademo.azurewebsites.net/assets/steak.jpg" } ] }]} } ] }
まとめ
Incoming Webhookで複雑なレイアウトを作りたい場合は、アダプティブカードを選ぶ。デザイナーもあって便利。変数機能は使えないので、自作する。