🟣

(2024年8月時点)監視メッセージをTeamsチャネルに送信する

2024/08/21に公開

突然のお知らせ

Microsoft Teams 内の Office 365 コネクタの廃止
https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/

突然のお知らせに困惑しつつも、Microsoftの恩恵を預かっているのでしょうがない。
そう決めて、取り組んだことを改めて文章にします。

CopilotやChatGPT等に投げやすくするため、コードは最小限にしました。
下のソースから派生させてみてください。

これまで

監視メッセージ(基本的にはエラーメッセージ)を特定のディレクトリに配置し、
BashプログラムでチャネルごとのURLにPOSTする仕組みでした。

具体的には、2つのシェルを使用しています。
①複数サーバーから出されるメッセージをファイル化した後、特定のディレクトリに配置する
②特定のディレクトリに配置されたメッセージファイルをもとに送信すべきTeamsチャネルを判定し、チャネルにPOSTする

今回のOffice 365 コネクタ廃止に関して、影響を受けるのは②です。
最も各チャネルのコネクタURLにPOSTしていることが影響原因です。

これから

上記ページに記載されている通り、推奨移行先はPower Automateです。
Power Automateの紹介は割愛しますが、Copilotの力を借りてちょちょいとフローを組めました。

Powerautomate

使用するフロー

  • 「Teams Webhook 要求を受信したとき」
  • 「チャットやチャネルにカードを投稿する」

これらを直列につなぎ、各項目を設定するだけでOKです。
Adaptive card欄には「添付ファイルアダプティーカード」をいれてください。
※この添付ファイルアダプティーカードがカギです。
※割愛していますが、送信先チャネルの判定を入れています。

Bash

バージョン

Linux: Red Hat Enterprise Linux release 8.4 (Ootpa)

コード

message_to_teams.sh
#!/bin/bash

export MSGDIR="いわゆる特定のディレクトリ"
export ERRORMSGDIR="xxx"

handle_error() {
  local ERRORMSG=$1
  local ERRORFILE=$2

  echo `date +"%Y/%m/%d %H:%M:%S"` "${ERRORMSG} ${ERRORFILE}" >> ${ERRORMSGDIR}/failed_send_msg_to_teams.log
}

send_message() {
  local MSGDIR=$1
  local MSGFILE=$2
  local AUTOMATE_URL="Power AutomateのフローのURL"

  local POSTMSG=$(cat ${MSGDIR}/${MSGFILE} | nkf --oc=UTF-8-BOM)

  if [ $? -ne 0 ]; then
    handle_error "文字コード変換に失敗しました。" ${MSGDIR}/${MSGFILE}
  fi

  data=$(cat << EOS
  {
    "attachments": [
      {
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
          "schema": "http://adaptivecards.io/schemas/adaptive-card.json",
          "type": "AdaptiveCard",
          "version": "1.4",
          "msTeams": {
            "width": "full"
          },
          "body": [
            {
              "type": "Container",
              "items": [
                {
                  "type": "RichTextBlock",
                  "inlines": [
                    {
                      "type": "TextRun",
                      "text": "${POSTMSG}",
                      "wrap": true
                    }  
                  ]
                }
              ]
            }
          ]
        }
      }
    ]
  }
EOS
  )

  curl -H "Content-Type: application/json" -d "${data}" ${AUTOMATE_URL}

  if [ $? -ne 0 ]; then
    handle_error "メッセージ送信に失敗しました。" ${MSGDIR}/${MSGFILE}
  else
  fi
}

for MSG in `ls -tr ${MSGDIR}/`; do
  send_message ${MSGDIR} ${MSG}
done

exit 0

こちらのシェルの実行時に、特定のディレクトリにメッセージファイルがなければ、空振りします。
cronでぶん回すため、空振りしても問題ないようにしています。
※その他に、変数名や細かなコメント、排他処理等を追加および変更しています。

まとめ

Incoming hookを使用していた時に比べ、コード量が減少しました。
送信先チャネルの判定をPower Automateで行っているからです。
維持管理しやすくなったので、これはこれで良かったです。

また、Microsoftからの突然のお知らせに困惑することがあると思いますが、
実はうれしいことかもしれません。

GitHubで編集を提案

Discussion