Настройка уведомлений Microsoft Teams с помощью плагина discourse-chat-integration

Это руководство описывает, как настроить провайдера Microsoft Teams, включенного в discourse-chat-integration.

Настройка Microsoft Teams

В Microsoft Teams:

  1. В левой вертикальной панели навигации нажмите кнопку с многоточием () и выберите из меню Workflows.

  2. Нажмите кнопку + Build from scratch в правом верхнем углу страницы Workflows.

  3. В модальном окне пользовательского рабочего процесса найдите webhook и выберите триггер When a Teams webhook request is received.

  4. В поле Who can trigger the flow выберите Anyone.[1]

  5. Нажмите + New step.

  6. Далее найдите card и выберите действие Post card in a chat or channel.

  7. Заполните поля следующим образом:

  • Post as: Выберите, от кого должны исходить сообщения; вы можете оставить значение по умолчанию или выбрать User, чтобы сообщение появлялось от вашего имени.

  • Post in: Выберите Channel, после чего появятся дополнительные поля:

    • Team: Выберите нужную команду.
    • Channel: Выберите нужный канал.
    • Adaptive Card: Кликните в поле ввода, чтобы открыть всплывающее окно (описано на следующем шаге).

  1. Кликните внутри поля Adaptive Card, чтобы открыть всплывающее окно [2] для вставки динамического содержимого или выражения. Переключитесь на вкладку Expression и введите triggerBody() в поле выражения.

  2. Нажмите Save.

  3. Теперь в вашем списке должен появиться рабочий процесс с именем manual → Post card in a chat or channel. Нажмите кнопку с вертикальным многоточием на этом рабочем процессе и выберите из выпадающего меню Details.

  4. На этой странице нажмите Copy webhook link, чтобы скопировать ссылку для следующих шагов. По желанию вы можете изменить имя рабочего процесса, чтобы оно отражало его назначение для других членов вашей команды.

Настройка Discourse

Теперь вернемся к Discourse:

  1. В административной панели Discourse включите настройку Chat integration enabled, чтобы активировать плагин Chat Integration, и настройку Chat integration Teams enabled, чтобы добавить поддержку Microsoft Teams.

  2. В боковой панели найдите раздел Plugins и нажмите Chat Integrations, затем нажмите + Create Channel.

  3. В модальном окне Edit Channel заполните поля следующим образом:

  • Name: Введите имя, которое четко указывает, к какому каналу Microsoft Teams вы подключаетесь; оно не обязательно должно точно совпадать.
  • Webhook URL: Вставьте URL вебхука, скопированный на шаге 11 раздела настройки Teams выше.
  1. Нажмите Save Channel.

Тестирование интеграции

Теперь давайте убедимся, что всё работает как ожидалось.

  1. В Discourse на newly созданном канале нажмите Test.

  2. Найдите тему по ID, заголовку или URL; выберите нужную тему и нажмите Send Test Message.

  3. В Microsoft Teams в канале должно появиться новое сообщение с информацией из темы:

Опционально: Настройка правил для вашего канала

Теперь, когда вы убедились, что всё работает, вы можете вернуться в Discourse и настроить дополнительные правила для вашего канала, чтобы кастомизировать сообщения.

Отладка

Если вы не видите сообщение в Microsoft Teams, как ожидалось, перейдите на страницу Workflow Details (см. шаг 10 в разделе настройки Teams выше) и проверьте раздел Run history. Там должны быть отображены логи каждого запуска сообщения.

Нажмите на неудачный запуск, который переведет вас в область Power Automate, где вы увидите сообщение об ошибке в верхней части страницы. (На скриншоте ниже запуск был успешным, но стрелка указывает, где появится ошибка при неудачном запуске.)

Здесь должно быть подробно описано проблему, которую вы затем можете исправить или сообщить нам здесь, чтобы мы могли помочь.


    1. Discourse в настоящее время не поддерживает аутентифицированные вебхуки для Teams, поэтому работает только опция “Anyone”.
    ↩︎
  1. если всплывающее окно не появляется, временно введите что-либо в поле Adaptive Card, сохраните рабочий процесс, снова откройте его для редактирования, и всплывающее окно должно появиться ↩︎

12 лайков

Только что попробовал, и сначала всё работало, но только в первый раз, когда я нажал кнопку тестирования.
Правила настроены следующим образом:

  • Тип: обычный
  • Фильтр: Все темы (?) и ответы (перевод с немецкого)
  • Категория: Песочница

Когда я написал ответ на тестовую тему в моей категории «Песочница», в разделе интеграций чата появился значок предупреждения, но при нажатии на треугольник предупреждения отображается сообщение unknown error..., а само сообщение об ошибке — null.

При попытке отправить ещё одно тестовое уведомление возникает другая ошибка: 500 internal server error.

Буду благодарен за любые подсказки, с чего начать устранение этой проблемы. Если этот вопрос лучше разместить в другом месте (например, на странице плагина интеграции чата) или создать отдельную тему, пожалуйста, переместите его соответствующим образом или дайте знать.

3 лайка

Привет @SHilser, не могли бы вы проверить /logs на вашем сайте и посмотреть, есть ли там что-то relevant?

2 лайка

Кажется, есть два релевантных момента.

  • Ошибка сокета
  • Внутренняя ошибка сервера

Я скопировал логи ниже (я заменил своё доменное имя на mydomain.tld)

Ошибка сокета

Сообщение (4 сообщения)

SocketError (Не удалось установить TCP-соединение с outlook.office.com:443 (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 лайка

Настроил всё примерно неделю назад на отдельном Droplet от DigitalOcean (установка в один клик, сейчас у меня версия 2.6.0.beta1 (310952fd6a)). Использую поддомен, и записи DNS также размещены в DigitalOcean. У меня есть A-запись, указывающая на IP-адрес, и 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, что и раньше. Но в большинстве случаев всё работало.

Обратная ситуация наблюдается, когда я пытаюсь отправить тестовое сообщение. Возможно, оно проходит один раз из десяти. В остальных случаях я получаю те же ошибки, что и раньше. А когда я публикую обычное сообщение, соответствующее правилам, установленным для канала, я не получаю ни уведомления, ни сообщения об ошибке в логах.
Мне это кажется настолько случайным, что я не могу понять, что вызывает проблему.

Я продолжал подозревать свою настройку с двумя droplet для каждого поддомена и двумя соответствующими A-записями, плюс один набор NS-записей для моего основного домена, указывающих на ns1.digitalocean.com. Поэтому я проверил dnsstuff для моего сайта и получил Fail при проверке SOA record, а также whatsmydns.net для моих NS-записей, но всё ещё не смог найти никаких возможных связей с моей проблемой.

На данный момент я совершенно запутался: кто вызывает ошибку — я, сделав неправильные DNS-настройки (что, по словам @david, не должно на это влиять), настройки сервера или проблемы с сервером, или же это просто MS-Teams (outlook.office.com) ведёт себя странно или блокирует меня каким-то образом?

Буду благодарен за любые подсказки, что можно проверить или сделать, чтобы найти ошибку, включая то, куда ещё можно обратиться за помощью, если вы считаете, что это выходит за рамки того, чем вы можете помочь мне здесь.

Огромное спасибо за всю помощь до сих пор.

1 лайк

Привет, спасибо за это. Я постоянно терплю неудачу на шаге Discourse 5: в диалоговом окне сообщается, что мой входящий URL веб-хука недействителен?

Любая помощь будет оценена!

Дэн

1 лайк

Не могли бы вы показать, как выглядит ваш URL вебхука? Либо в ЛС мне, либо, если вы сможете сначала его аннулировать, здесь в теме?

1 лайк

Спасибо, @Dan_Turner. Я немного ослабил валидацию, что должно помочь решить проблему. Пожалуйста, попробуйте и дайте знать, если станет лучше.

2 лайка

Спасибо! Попробую.

Дэн

1 лайк

Извините за глупость, но мне нужно обновить Discourse или отредактировать файл напрямую, как описано в исправлении?
Спасибо, Дэн

1 лайк

Вам необходимо обновить плагин. Перейдите на страницу /admin/upgrade и нажмите кнопку обновления рядом с “Discourse-chat-integration”.

2 лайка

Привет — извини за мою некомпетентность, но как мне на самом деле попробовать это, если я использую размещённый экземпляр Discourse? Спасибо, Дэн.

1 лайк

Вам нужно попросить вашего хостинг-провайдера обновить плагин для вас. На discourse.org это изменение уже было применено ко всем нашим клиентам, так что, возможно, вы размещены где-то еще?

1 лайк

Да, для меня это хостинг Discourse. Укажите, пожалуйста, какую версию они используют, чтобы я мог попросить их обновить её.

1 лайк

У нас нет номеров версий для плагинов, но вы можете поделиться этой ссылкой на коммит: https://github.com/discourse/discourse-chat-integration/commit/00ec1f486a3fd1dc523cdf242cfb1c78baaa407e

2 лайка

Спасибо за этот полезный плагин!
Отличным улучшением было бы добавить упоминание группы в сообщении для генерации уведомлений на стороне Teams.
Кажется, что API вебхуков не поддерживал эту функцию (или поддерживал?), но некоторые говорят, что она была реализована недавно.
Как вы думаете, это можно легко реализовать?