PHPで作るTeamsへの通知Bot

2023年2月9日

はじめに

PHPを使って、Teamsへ通知するBotを作成する方法です。
メンションを付けて、対象を指定すること方法も記載します。

 

 

環境

この記事は、以下の管理人の検証環境にて記事にしています。

PHP 8.1

 

ソースコードを取得する場合は、以下のURLから取得できます。

 

 

Webhookの準備

Teamsへの通知Botを作るには、まず「チーム」の「コネクタ」で「Incoming Webhook」サービスを追加する必要があります。

では、早速やっていきましょう!

 

チーム選択後の右上にある「・・・」をクリックするとメニューが開きます。
「コネクト」を選択してください。

 

 

サービスの一覧から「Incoming Webhook」を探し、追加ボタンをクリックしてください。

 

 

ちなみに追加後は、構成というボタンに変わります。

 

 

「Incoming Webhook」を開くと、通知するBotの名称とアイコンのアップロードが表示されます。名称は必須項目です。
設定が完了したら、作成を押してください。

ちなみに、この情報は後で変更が可能です。
というか、一つのチャンネルに一つしか作れないっぽいです。

 

 

作成が完了すると、WebhookのURLが発行されます。
このURLは後で使うので、忘れずにメモしてください。

 

これで通知先の準備は完了です。

 

PHPで通知する

Webhookの準備ができましたら、PHPを使ってTeams宛に通知を行ってみます。

 

テキストをPOSTする

まずは「Hellow Team」というテキストを通知してみます。
curlを使って、POSTでwebhook宛に送信します。
これが基本の動作になります。

 

$url = 'https://....';// Incoming Webhook のURL
$data = array(
  'text' => 'Hellow Teams'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$http_str = curl_exec($ch);
curl_close($ch);

echo '送信しました';

 

■結果

 

テキストに装飾をする

メッセージに装飾を付けて送信します。
「**太文字**」「_イタリック_」「- すいか」のようなMarkdownで設定することができます。

ベタなJSONを変数に突っ込んでるので、フォーマットのブレを整える為に、「json_decode」で配列に書き直してから、「json_encode」で再度JSONに戻す作業を行います。

ココがポイント

文字の「改行(\r)」や「$schema」を使う時には、「\(バックスラッシュ)」を使う必要があります。

 

$data = <<<TEAMSMESSAGE
{
  "type": "message",
  "attachments": [{
    "contentType": "application/vnd.microsoft.card.adaptive",
    "content": {
      "\$schema": "https://adaptivecards.io/schemas/adaptive-card.json",
      "type": "AdaptiveCard",
      "version": "1.0",
      "body": [
        {
          "type": "TextBlock",
          "text": "これは **太文字** です"
        },
        {
          "type": "TextBlock",
          "text": "これは _イタリック_ です"
        },
        {
          "type": "TextBlock",
          "text": "- すいか \\r- メロン \\r",
          "wrap": true
        },
        {
          "type": "TextBlock",
          "text": "1. Macbook\\r2. Mac Mini\\r",
          "wrap": true
        },
        {
          "type": "TextBlock",
          "text": "リンクの設定 → [Adaptive Cards](https://adaptivecards.io)"
        }
      ]
    }
  }]
}
TEAMSMESSAGE;

$data = json_decode($data);// 念のためフォーマットを揃えるためにデコードする

 

■結果

 

参考
https://learn.microsoft.com/ja-jp/outlook/actionable-messages/message-card-reference#design-guidelines

 

メンションを送る

メンションが送れなければ、通知Botの魅力が80%ダウンしてしまいます。
ようやくWebhookでも対応しました。

「<at>カバノキ</at>」対象を設定して、「entities」で対象と対象IDと表示名を設定します。
当然ですが、複数のメンションも設定が可能です。

メンションを送る為には、ユーザーのIDを必要になります。「@[*****].onmicrosoft.com」のアドレスがIDになります。

 

$data = &amp;lt;&amp;lt;&amp;lt;TEAMSMESSAGE
{
  "type": "message",
  "attachments": [{
    "contentType": "application/vnd.microsoft.card.adaptive",
    "content": {
      "type": "AdaptiveCard",
      "body": [
        {
          "type": "TextBlock",
          "size": "Medium",
          "weight": "Bolder",
          "text": "メンションを送信できるかのテストです"
        },
        {
          "type": "TextBlock",
          "text": "こんにちは &amp;lt;at&amp;gt;カバノキ&amp;lt;/at&amp;gt;, &amp;lt;at&amp;gt;カバノキ2&amp;lt;/at&amp;gt;"
        }
     ],
     "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
     "version": "1.2",
     "msteams": {
       "entities": [
         {
           "type": "mention",
           "text": "&amp;lt;at&amp;gt;カバノキ&amp;lt;/at&amp;gt;",
           "mentioned": {
             "id": "[email protected]",
             "name": "カバノキ"
           }
         },
         {
           "type": "mention",
           "text": "&amp;lt;at&amp;gt;カバノキ2&amp;lt;/at&amp;gt;",
           "mentioned": {
             "id": "[email protected]",
             "name": "カバノキ2"
           }
         }
       ]
     }
    }
  }]
}
TEAMSMESSAGE;

$data = json_decode($data);// 念のためフォーマットを揃えるためにデコードする

 

■結果

 

参考
https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cconnector-html#sample-adaptive-card-with-a-mention

 

画像を送る

画像も送ることができます。
外部サーバーの画像も設定可能です。

 

$data = &amp;lt;&amp;lt;&amp;lt;TEAMSMESSAGE
{
  "type": "message",
  "attachments": [{
    "contentType": "application/vnd.microsoft.card.adaptive",
    "content": {
      "type": "AdaptiveCard",
      "body": [
        {
          "type": "Image",
          "url": "https://picsum.photos/200/200?image=110",
          "msTeams": {
            "allowExpand": true
          }
        }
      ],
      "\$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
      "version": "1.2"
    }
  }]
}
TEAMSMESSAGE;

$data = json_decode($data);// 念のためフォーマットを揃えるためにデコードする

 

■結果

 

参考
https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-format?tabs=adaptive-md%2Cdesktop%2Cconnector-html#stage-view-for-images-in-adaptive-cards

 

メッセージのテンプレート

今回は解説しませんが、様々なメッセージのテンプレートも用意されています。
気になる方は下記の参考URLをご覧ください。

メッセージカードのテンプレート
https://messagecardplayground.azurewebsites.net/

現状はレガシーにしか対応していないようです。

 

Github

 

Microsoft Frow

 

Trello

 

 

さいごに

PHPを使って、SlackみたいにTeamsにも通知を送れないかなぁと調べる事一年前。
その時点で通知を送る事ができると判明したものの、まだMicrosoftも手探りなのか、メンションの送信することができませんでした。
久々に調べてみたら、メンションも使えるようになってる!というわけで、記事にしてみました。

はたして、この通知機能は何使えるのでしょうか?

今日はこの辺で~

 

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-PHP
-,