Microsoft Teamsにアプリケーションから通知を投げる方法の概略です。最新の方法に対応した日本語リソースがほぼ見つからなかったので、備忘録的に書いておきます。
やりたいこと
やりたかったことは以下の2つです。
- 時間がかかるジョブの進行状況を知りたい
- ジョブが異常終了したことを検知できるようにしたい
これを実現するために、アプリケーションからチャットにジョブの進行状況を投げることにしました。Slack使えよって言われそうですけど、もろもろの事情によりMicrosoft Teamsしか使えない状況にあると思ってください。
Webhookの設定
まずはwebhookのURLを取得します。以下のサイトを参考にしました。
Create incoming webhooks with Workflows for Microsoft Teams - Microsoft Support (英語)
ここでは2つの方法が示されています。
- Set up an incoming webhook workflow from a template
- Set up an incoming webhook workflow from scratch
今回は後半の方を参考にしました。Teamsの左側にアイコンが縦に並んでいる中で、Workflowsを選択します。もしWorkflowsがない場合は...
をクリックしてWorkflowsを検索します。
すると「人気の高いTeamsテンプレートで開始する (英語では Start with a popular Teams template)」にいくつかのテンプレートがリストされているはずです。ここに、
- Webhook要求を受信するとチャネルに投稿する (Post to a channel when a webhook request is received)
- Webhook要求を受信したらチャットに投稿する (Post to a chat when a webhook request is received)
があるはずです。通知をチャンネルに投げたい場合は前者を、チャットまたはチャットグループに投げたい場合は後者を選びます。ここではチャンネルに通知を投げたいので、前者を選択します。
設定に迷うことはないと思うので設定を進めてください。POST用の最終的にURLを取得できますのでコピーしておいてください。
通知を投げる
POST用URLに向けて通知を投げます。以下のサイトを参考にしました。
Microsoft Teams Webhook - Microsoft Support (英語)
POSTするデータの構造はAdaptive Card JSONというものらしく、仕様がかっちり決まっているようです。いくつか固定値等の注意書きがあるので、"text"
フィールド以外をいじるのは避けたほうがよさそうです。基本 Request Body Example の書式をそのままパクりましょう。また、Example of Sending RequestsにはC#とJavaScriptのサンプルコードがあります。
通知を投げるアプリケーションはPythonだったので、Pythonで同等の処理をコーディングすれば良いはずです。
import json
import sys
import requests
def notify(message):
payload = {
'type': 'message',
'attachments': [
{
'contentType': 'application/vnd.microsoft.card.adaptive',
'contentUrl': None,
'content': {
'$schema': 'http://adaptivecards.io/schemas/adaptive-card.json',
'type': 'AdaptiveCard',
'version': '1.2',
'body': [
{
'type': 'TextBlock',
'text': message,
'wrap': True
}
]
}
}
]
}
webhook_url = 'ここにWorkflowsの設定で取得したURLをセット'
response = requests.post(
webhook_url,
headers={'Content-Type': 'application/json'},
data=json.dumps(payload)
)
return response
if __name__ == '__main__':
notify(sys.argv[1])
こんな感じのスクリプトを書いて、
python3 notify_test.py "これはテストです"
とかすれば、あら不思議、Teamsに通知が飛んでいきます。
なお、'wrap': True
は上記サイトの例にはありませんが、こちらのサンプルによると、カードサイズに収まらないテキストを折り返して表示するオプションぽいです。デフォルトでは省略されてしまうので、つけておいたほうがいいでしょう。