1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Teamsのチャンネルにアプリケーションから通知を投げる

Last updated at Posted at 2024-10-16

Microsoft Teamsにアプリケーションから通知を投げる方法の概略です。最新の方法に対応した日本語リソースがほぼ見つからなかったので、備忘録的に書いておきます。

やりたいこと

やりたかったことは以下の2つです。

  • 時間がかかるジョブの進行状況を知りたい
  • ジョブが異常終了したことを検知できるようにしたい

これを実現するために、アプリケーションからチャットにジョブの進行状況を投げることにしました。Slack使えよって言われそうですけど、もろもろの事情によりMicrosoft Teamsしか使えない状況にあると思ってください。

Webhookの設定

まずはwebhookのURLを取得します。以下のサイトを参考にしました。

Create incoming webhooks with Workflows for Microsoft Teams - Microsoft Support (英語)

ここでは2つの方法が示されています。

  1. Set up an incoming webhook workflow from a template
  2. 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で同等の処理をコーディングすれば良いはずです。

notify_test.py
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は上記サイトの例にはありませんが、こちらのサンプルによると、カードサイズに収まらないテキストを折り返して表示するオプションぽいです。デフォルトでは省略されてしまうので、つけておいたほうがいいでしょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?