Configurar notificaciones de Microsoft Teams usando el plugin discourse-chat-integration

Esta guía describe cómo configurar el proveedor de Microsoft Teams incluido en discourse-chat-integration.

Configuración de Microsoft Teams

En Microsoft Teams:

  1. En la barra de navegación vertical de la izquierda, haz clic en el botón de elipsis () y selecciona Flujos de trabajo en el menú.

  2. Haz clic en el botón + Crear desde cero en la esquina superior derecha de la página Flujos de trabajo.

  3. En la ventana modal de flujo de trabajo personalizado, busca webhook y selecciona el desencadenador Cuando se recibe una solicitud de webhook de Teams.

  4. En el campo Quién puede activar el flujo, selecciona Cualquiera. [1]

  5. Haz clic en + Nuevo paso.

  6. A continuación, busca tarjeta y selecciona la acción Publicar tarjeta en un chat o canal.

  7. Rellena los campos de la siguiente manera:

  • Publicar como: Elige de quién deben proceder los mensajes; puedes dejarlo en el valor predeterminado o elegir Usuario para que el mensaje aparezca como enviado por ti.

  • Publicar en: Selecciona Canal, lo que hará que aparezcan más campos:

    • Equipo: Selecciona el equipo deseado.
    • Canal: Selecciona el canal deseado.
    • Tarjeta adaptable: Haz clic en la entrada, lo que abrirá una ventana emergente (descrita en el siguiente paso).

  1. Haz clic dentro del campo Tarjeta adaptable para abrir una ventana emergente [2] para insertar contenido dinámico o una expresión. Cambia a la pestaña Expresión y escribe triggerBody() en el campo de expresión.

  2. Haz clic en Guardar.

  3. Ahora deberías ver un flujo de trabajo llamado manual → Publicar tarjeta en un chat o canal en tu lista. Haz clic en el botón de elipsis vertical de este flujo de trabajo y selecciona Detalles en el menú desplegable.

  4. En esta página, haz clic en Copiar vínculo del webhook para obtener el enlace para los siguientes pasos. Mientras estás aquí, puedes editar opcionalmente el nombre del flujo de trabajo para reflejar su propósito para otros miembros de tu equipo.

Configuración de Discourse

Ahora, volviendo a Discourse:

  1. En el área de administración de Discourse, habilita la configuración Chat integration enabled para activar el complemento de integración de chat y la configuración Chat integration Teams enabled para admitir Microsoft Teams.

  2. En la barra lateral, busca la sección Plugins y haz clic en Integraciones de chat, luego haz clic en + Crear canal.

  3. En la ventana modal Editar canal, rellena los campos de la siguiente manera:

  • Nombre: Introduce un nombre que deje claro a qué canal de Microsoft Teams te estás conectando; no tiene que ser una coincidencia exacta.
  • URL del webhook: Pega la URL del webhook que copiaste en el paso 11 de la sección de configuración de Teams anterior.
  1. Haz clic en Guardar canal.

Probar la integración

Ahora es el momento de asegurarse de que todo funciona como se espera.

  1. En Discourse, haz clic en Probar en el canal recién creado.

  2. Busca un tema por ID, título o URL; selecciona el tema deseado y haz clic en Enviar mensaje de prueba.

  3. En Microsoft Teams, se publicará un nuevo mensaje con información del tema en el canal:

Opcional: Configurar reglas para tu canal

Ahora que has confirmado que todo funciona, puedes volver a Discourse y configurar reglas adicionales para tu canal para personalizar el mensaje.

Depuración

Si no ves el mensaje en Microsoft Teams como esperabas, ve a la página Detalles del flujo de trabajo (consulta el paso 10 en la sección de configuración de Teams anterior) y comprueba la sección Historial de ejecuciones. Esto debería mostrar registros de cada ejecución del mensaje.

Haz clic en la ejecución fallida, lo que te llevará al área de Power Automate, donde podrás ver un mensaje de error en la parte superior de la página. (En la captura de pantalla siguiente, la ejecución fue exitosa, pero la flecha indica dónde aparecerá el error en una ejecución fallida).

Esto debería detallar el problema, que luego puedes solucionar o compartir con nosotros aquí para que podamos ayudarte.


    1. Discourse actualmente no admite webhooks autenticados a Teams, por lo que solo funciona la opción “Cualquiera”.
    ↩︎
  1. si la ventana emergente no aparece, escribe algo temporalmente en el campo Tarjeta adaptable, guarda el flujo de trabajo, ábrelo de nuevo para editar y la ventana emergente debería aparecer ↩︎

12 Me gusta

Just tried it out and it seemed to work at first, but only the first time I clicked on the test button.
Rules are set up as follows:

  • Type: normal
  • Filter: All topics(?) and replies (translating from German here)
  • Category: Sandbox

When I wrote a reply to the test topic in my Sandbox category I got a warning sign when I went to my chat integrations, but when clicking on the warning triangle it says unknown error... with the error message bein null.

When I try to send another test notification it gives me another error 500 internal server error

Any hints on where to start trouble shooting this are welcome. If this should be posted elsewhere (e.g. under the chat integration plugin page), or made a separate topic, feel free to move it accordingly or let me know.

3 Me gusta

Hi @SHilser - please can you check /logs on your site, and see if there is anything relevant there?

2 Me gusta

There’s two things that seem relevant.

  • Socket Error
  • Internal Server Error

I copied the logs below (I replaced my domain name with mydomain.tld)

Socket Errror

Message (4 copies reported)

SocketError (Failed to open TCP connection to outlook.office.com:443 (getaddrinfo: Temporary failure in name resolution))
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'

Backtrace

/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'

Env

HTTP HOSTS: mysite.tld

Internal Server Error

Message (4 copies reported)

Error: Internal Server Error
Url: https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js
Line: 1
Column: 267890
Window Location: https://mysite.tld/admin/plugins/chat/teams

Backtrace

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

Env

HTTP HOSTS: mysite.tld

Thanks for the help :slight_smile:

2 Me gusta

That suggests that your server is having trouble with DNS resolution. Are you using a standard docker-based installation? Or is this in development?

3 Me gusta

Just set it up about a week ago on a separate DigitalOcean droplet (one-click installation, now I’m on Version: 2.6.0.beta1 (310952fd6a). I use a subdomain and have the DNS records also on DigitalOcean. I have an A-Record, pointing to the IP, MX-Record pointing to the sub-domain name for reply by email as per these instruction). Only thing there is that I don’t have a DMARC Record published.

That’s all I can think of that I did in relation to DNS stuff. However, so far everything worked as expected. The site is set up, I can reach it via the sub-domain name, log-in, create topics (even via email), etc.

I’m just startled the first message made it through, but subsequent ones didn’t :man_shrugging:

2 Me gusta

When I say DNS resolution, I mean your server is having trouble contacting outlook.office.com. The setup of your forum’s DNS records shouldn’t affect that.

Can you try connecting to your server via SSH and running

host outlook.office.com

You should get something like

outlook.office.com is an alias for substrate.office.com.
substrate.office.com is an alias for substrate.ms-acdc.office.com.
substrate.ms-acdc.office.com is an alias for afd-k.office.com.
afd-k.office.com is an alias for outlook-office-com.k-0002.k-msedge.net.
outlook-office-com.k-0002.k-msedge.net is an alias for k-0002.k-msedge.net.
k-0002.k-msedge.net has address 13.107.18.11
k-0002.k-msedge.net has IPv6 address 2620:1ec:c::11
3 Me gusta

When I enter

host -d outlook.office.com

I get the following:

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

When adding port :443 I get another error

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

For other domains like google.com or the domain of my discourse instance in question (h-da.transformative-praxis.cc), or other sites I get the expected output similar to what you describe.

I did some search for the first error, but I’m still not sure about its source. I’ve read the following, but wasn’t able to judge, if this is actually relevant to my problem:

1 me gusta

I kept retrying it and this time I got the results you described when typing

host outlook.office.com

So everything seemed fine at this point. I’ve repeated that many times in a row to make sure (like around 15 times with an interval of around 10 seconds) and at some point I got the same servfail error as before. But mostly it worked.

The opposite is the case when I try to send a test message. It maybe works one out of ten times. The other times I get the same errors as before. And when I post a regular message that fits to the rule I’ve set for the channel, I don’t get a notification, nor an error message in the logs.
It just seems so random to me that I can’t find out what causes it.

I kept suspecting my setup with two droplets for each subdomain and two respective A-Records, plus one set of NS-records for my main domain pointing to ns1.digitalocean.com. So I tried out dnsstuff for my site getting a Fail for the SOA record check and whatsmydns.net for my NS records, but I still couldn’t figure out any possible connections to my problem.

At this point I’m totally confused who’s causing the error, me having made some wrong DNS settings (which shouldn’t affect it according to @david), server settings/issues, or is it just MS-Teams (outlook.office.com) acting up, or blocking me in some way?

Any hints for what I could check/do to find the error are appreciated, including where else to go and ask, if you think this is beyond what you can do to help me here.

Thanks a lot for all the help so far.

1 me gusta

Hi, thanks for this. I keep failing at step Discourse 5: The dialogue box says my incoming Webhooks URL is invalid?

Any help appreciated!

Dan

1 me gusta

Would you mind sharing what your webhook URL looks like? Either via PM to me or, if you can invalidate it first, here in the topic?

1 me gusta

Thanks @Dan_Turner, I just relaxed our validation a little which should help the situation. Please give it a try and let me know if it works better for you

https://github.com/discourse/discourse-chat-integration/commit/00ec1f486a3fd1dc523cdf242cfb1c78baaa407e

2 Me gusta

Thanks! Will give it a try.

Dan

1 me gusta

Sorry to be thick but do I need to update Discourse or edit the file directly as detailed in the fix?
Thanks, Dan

1 me gusta

You need to update the plugin. Visit /admin/upgrade, and press the update button next to “Discourse-chat-integration”

2 Me gusta

Hey - so sorry for being incompetent but - how do I actually try this as I’m on a hosted discourse instance? Thanks. Dan

1 me gusta

You will need to ask your hosting provider to update the plugin for you. At discourse.org this change has already gone out to all our customers, so I guess you must be hosted elsewhere?

1 me gusta

yeah, discourse hosting for me. which version is it in please and I will ask them to update?

1 me gusta

We don’t have version numbers for plugins, but you can share this commit link with them: https://github.com/discourse/discourse-chat-integration/commit/00ec1f486a3fd1dc523cdf242cfb1c78baaa407e

2 Me gusta

Gracias por este plugin, que es muy útil.

Una gran mejora sería: añadir la mención de grupo en el mensaje para generar notificaciones en el lado de Teams.
Parece que la API de webhook no implementa (¿o implementaba?) esta función, pero algunos dicen que se ha implementado recientemente.
¿Crees que se podría implementar fácilmente?