Microsoft Teamsの通知をdiscourse-chat-integrationプラグインを使って設定する

このガイドでは、discourse-chat-integration に含まれる Microsoft Teams プロバイダーの設定方法について説明します。

Microsoft Teams の設定

Microsoft Teams で次の手順を実行します。

  1. 左側の縦型ナビゲーションバーから、省略記号ボタン をクリックし、メニューから ワークフロー を選択します。

  2. ワークフローページの右上隅にある + スクラッチから構築 ボタンをクリックします。

  3. カスタムワークフローモーダルで webhook を検索し、Teams の Webhook リクエストが受信されたときのトリガーを選択します。

  4. フローをトリガーできるユーザーフィールドで、Anyone を選択します。[1]

  5. + 新しいステップ をクリックします。

  6. 次に、card を検索し、チャットまたはチャネルにカードを投稿するアクションを選択します。

  7. フィールドを次のように入力します。

  • 投稿者: メッセージの送信元を選択します。既定値のままにするか、User を選択してメッセージが自分から送信されたようにすることができます。

  • 投稿先: Channel を選択すると、さらにフィールドが表示されます。

    • チーム: 目的のチームを選択します。
    • チャネル: 目的のチャネルを選択します。
    • アダプティブカード: 入力フィールドをクリックすると、ポップアップが開きます(次のステップで説明します)。

  1. アダプティブカードフィールド内をクリックしてポップアップを開きます[2]タブに切り替え、式フィールドに triggerBody() と入力します。

  2. 保存 をクリックします。

  3. これで、リストに manual → Post card in a chat or channel という名前のワークフローが表示されます。このワークフローの縦の省略記号ボタンをクリックし、ドロップダウンメニューから 詳細 を選択します。

  4. このページで、Webhook リンクをコピー をクリックして、次の手順用のリンクを取得します。このページで、必要に応じてワークフロー名を編集して、チームの他のメンバーにとって目的がわかりやすいようにすることができます。

Discourse の設定

次に、Discourse に戻ります。

  1. Discourse 管理領域で、Chat Integration プラグインを有効にするために Chat integration enabled 設定を有効にし、Microsoft Teams をサポートするために Chat integration Teams enabled 設定を有効にします。

  2. サイドバーで プラグイン セクションを見つけて チャット統合 をクリックし、次に + チャネルを作成 をクリックします。

  3. チャネルの編集モーダルで、フィールドを次のように入力します。

  • 名前: 接続している Microsoft Teams チャネルが明確にわかる名前を入力します。完全に一致している必要はありません。
  • Webhook URL: 上記の Teams 設定セクションのステップ 11 でコピーした Webhook URL を貼り付けます。
  1. チャネルを保存 をクリックします。

統合のテスト

これで、すべてが期待どおりに機能していることを確認する番です。

  1. Discourse で、新しく作成したチャネルの テスト をクリックします。

  2. トピックID、タイトル、またはURLで検索し、目的のトピックを選択して、テストメッセージを送信 をクリックします。

  3. Microsoft Teams で、トピックからの情報を含む新しいメッセージがチャネルに投稿されます。

オプション: チャネルのルールの設定

すべてが機能していることを確認したので、Discourse に戻り、チャネルの追加ルールを設定してメッセージをカスタマイズできます。

デバッグ

予期したとおりにメッセージが Microsoft Teams に表示されない場合は、ワークフローの詳細ページ(上記の Teams 設定セクションのステップ 10 を参照)に移動し、実行履歴セクションを確認します。ここには、各メッセージ実行のログが表示されるはずです。

失敗した実行をクリックすると Power Automate 領域に移動し、ページ上部でエラーメッセージを確認できます。(下のスクリーンショットでは、実行は成功していますが、矢印は失敗した実行でエラーが表示される場所を示しています。)

これにより問題が詳しく説明されるため、修正するか、ここで共有していただければ、私たちがサポートできます。


    1. Discourse は現在、Teams への認証済み Webhook をサポートしていないため、「Anyone」オプションのみが機能します。
    ↩︎
  1. ポップアップが表示されない場合は、一時的にアダプティブカードフィールドに何かを入力し、ワークフローを保存して再度編集用に開くと表示されるはずです。 ↩︎

「いいね!」 12

試してみましたが、最初は動作しているように見えました。ただし、テストボタンをクリックしたのは最初だけです。
ルールは次のように設定されています:

  • タイプ:通常
  • フィルター:すべてのトピック(?) と返信(ドイツ語から翻訳)
  • カテゴリ:Sandbox

Sandbox カテゴリのテストトピックに返信を書いたところ、チャット統合のページに警告アイコンが表示されましたが、警告の三角形をクリックすると「不明なエラー…」と表示され、エラーメッセージは null でした。

別のテスト通知を送信しようとすると、別のエラー「500 Internal Server Error」が表示されます。
トラブルシューティングのヒントがあれば幸いです。もし、この投稿は別の場所(例えばチャット統合プラグインのページ)に投稿すべき、あるいは別トピックにするべきであれば、移動してください、またはお知らせください。

「いいね!」 3

@SHilser さん、こんにちは。サイト内の /logs を確認し、関連する情報がないか確認していただけますか?

「いいね!」 2

関連すると思われることが 2 つあります。

  • ソケットエラー
  • 内部サーバーエラー

ログを以下にコピーしました(ドメイン名は mydomain.tld に置き換えています)

ソケットエラー

メッセージ(4 件の報告)

SocketError(outlook.office.com:443 への TCP 接続の確立に失敗しました(getaddrinfo: 名前解決の一時的な失敗))
app/controllers/application_controller.rb:340:in `block in with_resolved_locale'
app/controllers/application_controller.rb:340:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:336:in `call'
config/initializers/100-quiet_logger.rb:19:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:22:in `call'
lib/middleware/request_tracker.rb:176:in `call'

バックトレース

/usr/local/lib/ruby/2.6.0/net/http.rb:949:in `rescue in block in connect'
/usr/local/lib/ruby/2.6.0/net/http.rb:946:in `block in connect'
/usr/local/lib/ruby/2.6.0/timeout.rb:93:in `block in timeout'
/usr/local/lib/ruby/2.6.0/timeout.rb:103:in `timeout'
/usr/local/lib/ruby/2.6.0/net/http.rb:945:in `connect'
/usr/local/lib/ruby/2.6.0/net/http.rb:930:in `do_start'
/usr/local/lib/ruby/2.6.0/net/http.rb:919:in `start'
/usr/local/lib/ruby/2.6.0/net/http.rb:1470:in `request'
rack-mini-profiler (2.0.4) lib/patches/net_patches.rb:19:in `block in request_with_mini_profiler'
rack-mini-profiler (2.0.4) lib/mini_profiler/profiling_methods.rb:33:in `step'

環境

HTTP HOSTS: mysite.tld

内部サーバーエラー

メッセージ(4 件の報告)

エラー: 内部サーバーエラー
URL: https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js
行: 1
列: 267890
ウィンドウの場所: https://mysite.tld/admin/plugins/chat/teams

バックトレース

o/t<</@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:267890
o/t<@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:267993
o@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:268074
trigger@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:545343
A</e._onError/<@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:550189
f</t.invoke@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:490190
f</t.flush@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:489198
p</t.flush@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:491205
t</t._end@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:496596Here
t</t.end@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:493157

環境

HTTP HOSTS: mysite.tld

ご協力ありがとうございます :slight_smile:

「いいね!」 2

これは、あなたのサーバーが DNS 解決に問題を抱えていることを示唆しています。標準的な Docker ベースのインストールを使用していますか?それとも開発環境ですか?

「いいね!」 3

約1週間前に、別のDigitalOcean dropletでセットアップしました(ワンクリックインストール。現在はバージョン 2.6.0.beta1 (310952fd6a)です)。サブドメインを使用しており、DNS レコードも DigitalOcean で管理しています。IP アドレスを指す A レコードと、こちらの手順 に従ってメール返信用のサブドメイン名を指す MX レコードを設定しています。ただし、DMARC レコードは公開していません。

DNS 関連で私が行ったことといえばこれだけです。しかし、これまで予想通りに動作していました。サイトはセットアップ済みで、サブドメイン名を通じてアクセスでき、ログインもでき、トピックの作成(メール経由でも)なども問題なく行えています。

ただ、最初のメッセージは届いたのに、その後のメッセージが届かないという状況に驚いています :man_shrugging:

「いいね!」 2

DNS 解決とは、あなたのサーバーが outlook.office.com に接続できない状態を指します。フォーラムの DNS レコードの設定は、これには影響しません。

SSH を介してサーバーに接続し、以下のコマンドを実行してみてください。

host outlook.office.com

以下のような出力が得られるはずです。

outlook.office.com は substrate.office.com のエイリアスです。
substrate.office.com は substrate.ms-acdc.office.com のエイリアスです。
substrate.ms-acdc.office.com は afd-k.office.com のエイリアスです。
afd-k.office.com は outlook-office-com.k-0002.k-msedge.net のエイリアスです。
outlook-office-com.k-0002.k-msedge.net は k-0002.k-msedge.net のエイリアスです。
k-0002.k-msedge.net のアドレスは 13.107.18.11 です。
k-0002.k-msedge.net の IPv6 アドレスは 2620:1ec:c::11 です。
「いいね!」 3

host -d outlook.office.comと入力すると、以下のような結果になります。

Trying "outlook.office.com"
Host outlook.office.com not found: 2(SERVFAIL)
Received 36 bytes from 127.0.0.53#53 in 43 ms

ポート :443 を追加すると、別のエラーが発生します。

Trying "outlook.office.com:443"
Host outlook.office.com:443 not found: 3(NXDOMAIN)
Received 40 bytes from 127.0.0.53#53 in 3 ms
Received 40 bytes from 127.0.0.53#53 in 3 ms

google.com や、私の Discourse インスタンスのドメイン(h-da.transformative-praxis.cc)などの他のドメイン、あるいは他のサイトでは、あなたが説明しているものと似た期待通りの出力が得られます。

最初のエラーについていくつか検索しましたが、その原因についてはまだ確信が持てません。以下の情報を読んだのですが、これが実際に私の問題に関連するかどうかを判断できませんでした。

「いいね!」 1

何度も再試行しましたが、今回はあなたが説明した結果が、

host outlook.office.com

と入力した際に得られました。そのため、この時点ではすべて正常に見えました。念のため、そのコマンドを約15回、それぞれ約10秒の間隔で繰り返し実行しましたが、ある時点で以前と同じ「servfail」エラーが発生しました。ただし、大半の場合は正常に動作していました。

一方、テストメッセージを送信しようとする場合は、逆の状況が起きます。10回に1回程度しか成功せず、それ以外は以前と同じエラーが発生します。また、チャンネルに設定したルールに合致する通常のメッセージを投稿しても、通知もログにエラーメッセージも表示されません。
一見すると完全にランダムに思えるため、何が原因なのか特定できません。

私は、各サブドメインに対して2つのドロプレットとそれに対応する2つのAレコード、そしてメインドメイン向けのNSレコード1セット(ns1.digitalocean.comを指す)という私の設定を疑い続けていました。そのため、dnsstuffで私のサイトを診断したところ「SOAレコードチェック」が失敗し、whatsmydns.netでNSレコードを確認しましたが、それでも私の問題との関連性を特定できませんでした。

この時点で、エラーの原因が私自身の誤ったDNS設定(@david 氏によると、これは影響しないはずですが)、サーバーの設定や問題、それともMS Teams(outlook.office.com)側の不具合や何らかのブロックなのか、全く混乱しています。

エラーを特定するために確認すべきことや行うべきこと、あるいは私の手助けを超えていると思われる場合はどこに相談すべきかについても、ヒントをいただけると幸いです。

これまでのご支援に心から感謝申し上げます。

「いいね!」 1

こんにちは、ありがとうございます。ステップ「Discourse 5」で失敗し続けています。ダイアログボックスに受信 Webhook URL が無効と表示されます。

ご支援いただけますと幸いです!

Dan

「いいね!」 1

ウェブフック URL の形式を教えていただけますか?私への PM で、または事前に無効化していただければ、このトピック内で共有してください。

「いいね!」 1

@Dan_Turner さん、ありがとうございます。バリデーションを少し緩和しましたので、これで状況が改善するはずです。お試しください。うまくいったか教えてくださいね。

「いいね!」 2

ありがとうございます!試してみます。

ダン

「いいね!」 1

おバカな質問で申し訳ありませんが、Discourse を更新する必要がありますか、それとも修正手順に記載されている通りファイルを直接編集すればよいのでしょうか?
ありがとう、Dan

「いいね!」 1

プラグインの更新が必要です。/admin/upgrade にアクセスし、「Discourse-chat-integration」の横にある更新ボタンを押してください。

「いいね!」 2

こんにちは、申し訳ありませんが、私の対応が不十分で。ホストされたDiscourseインスタンスを利用している場合、実際にこの機能を試すにはどうすればよいでしょうか?よろしくお願いいたします。Dan

「いいね!」 1

プラグインの更新については、ホスティングプロバイダーに依頼する必要があります。discourse.org では、この変更ですでにすべての顧客に適用されていますので、別の場所でホストされているのでしょうか?

「いいね!」 1

はい、Discourse のホスティングについてです。どのバージョンでしょうか?それを伝えてアップデートを依頼します。

「いいね!」 1

プラグインにはバージョン番号はありませんが、以下のコミットリンクを共有してください: https://github.com/discourse/discourse-chat-integration/commit/00ec1f486a3fd1dc523cdf242cfb1c78baaa407e

「いいね!」 2

この非常に便利なプラグインをありがとうございます。

メッセージでグループメンションを追加すると、Teams側で通知が生成されるため、大きな改善になるでしょう。

Webhook APIにはこの機能が(実装されていなかったようですが)実装されていないようですが、最近実装されたという人もいます。

簡単に実装できると思いますか?