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

Acabo de probarlo y pareció funcionar al principio, pero solo la primera vez que hice clic en el botón de prueba.
Las reglas están configuradas de la siguiente manera:

  • Tipo: normal
  • Filtro: Todos los temas (?) y respuestas (traduciendo del alemán)
  • Categoría: Sandbox

Cuando escribí una respuesta al tema de prueba en mi categoría Sandbox, apareció un signo de advertencia al ir a mis integraciones de chat, pero al hacer clic en el triángulo de advertencia dice error desconocido... con el mensaje de error siendo null.

Cuando intento enviar otra notificación de prueba, obtengo otro error: 500 error interno del servidor.

Cualquier pista sobre por dónde comenzar a solucionar este problema es bienvenida. Si esto debería publicarse en otro lugar (por ejemplo, en la página del plugin de integración de chat) o crearse como un tema separado, siéntete libre de moverlo en consecuencia o avísame.

3 Me gusta

Hola @SHilser: ¿podrías revisar /logs en tu sitio y ver si hay algo relevante allí?

2 Me gusta

Hay dos cosas que parecen relevantes.

  • Error de socket
  • Error interno del servidor

He copiado los registros a continuación (he reemplazado mi nombre de dominio con mydomain.tld)

Error de socket

Mensaje (4 copias reportadas)

SocketError (Error al abrir la conexión TCP a outlook.office.com:443 (getaddrinfo: Fallo temporal en la resolución de nombres))
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'

Entorno

HTTP HOSTS: mysite.tld

Error interno del servidor

Mensaje (4 copias reportadas)

Error: Error interno del servidor
URL: https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js
Línea: 1
Columna: 267890
Ubicación de la ventana: 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:496596Aquí
t</t.end@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:493157

Entorno

HTTP HOSTS: mysite.tld

Gracias por la ayuda :slight_smile:

2 Me gusta

Eso sugiere que tu servidor está teniendo problemas con la resolución de DNS. ¿Estás utilizando una instalación estándar basada en Docker? ¿O esto es en desarrollo?

3 Me gusta

Acabo de configurarlo hace aproximadamente una semana en un droplet separado de DigitalOcean (instalación en un solo clic; ahora estoy en la versión 2.6.0.beta1 (310952fd6a)). Uso un subdominio y tengo los registros DNS también en DigitalOcean. Tengo un registro A que apunta a la IP y un registro MX que apunta al nombre del subdominio para las respuestas por correo electrónico, tal como se indica en estas instrucciones. Lo único que me falta es un registro DMARC publicado.

Eso es todo lo que puedo recordar haber hecho en relación con la configuración DNS. Sin embargo, hasta ahora todo ha funcionado como se esperaba. El sitio está configurado, puedo acceder a él mediante el nombre del subdominio, iniciar sesión, crear temas (incluso por correo electrónico), etc.

Solo me sorprendió que el primer mensaje llegara, pero los siguientes no :man_shrugging:

2 Me gusta

Cuando hablo de resolución de DNS, me refiero a que tu servidor tiene problemas para contactar a outlook.office.com. La configuración de los registros DNS de tu foro no debería afectar eso.

¿Puedes intentar conectarte a tu servidor mediante SSH y ejecutar

host outlook.office.com

Deberías obtener algo como

outlook.office.com es un alias para substrate.office.com.
substrate.office.com es un alias para substrate.ms-acdc.office.com.
substrate.ms-acdc.office.com es un alias para afd-k.office.com.
afd-k.office.com es un alias para outlook-office-com.k-0002.k-msedge.net.
outlook-office-com.k-0002.k-msedge.net es un alias para k-0002.k-msedge.net.
k-0002.k-msedge.net tiene la dirección 13.107.18.11
k-0002.k-msedge.net tiene la dirección IPv6 2620:1ec:c::11
3 Me gusta

Cuando ingreso

host -d outlook.office.com

recibo lo siguiente:

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

Al agregar el puerto :443, obtengo otro 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

Para otros dominios como google.com o el dominio de mi instancia de Discourse en cuestión (h-da.transformative-praxis.cc), u otros sitios, obtengo la salida esperada, similar a la que describes.

He realizado algunas búsquedas sobre el primer error, pero aún no estoy seguro de su origen. He leído lo siguiente, pero no pude determinar si esto es realmente relevante para mi problema:

1 me gusta

Seguí intentándolo y esta vez obtuve los resultados que describiste al escribir

host outlook.office.com

Así que todo parecía estar bien en ese momento. Lo repetí muchas veces seguidas para asegurarme (unas 15 veces con un intervalo de unos 10 segundos) y en algún momento obtuve el mismo error de servfail que antes. Pero la mayoría de las veces funcionó.

El caso contrario ocurre cuando intento enviar un mensaje de prueba. Quizás funcione una de cada diez veces. Las otras veces obtengo los mismos errores que antes. Y cuando publico un mensaje regular que cumple con la regla que configuré para el canal, no recibo ninguna notificación ni mensaje de error en los registros.
Simplemente parece tan aleatorio que no puedo averiguar qué lo causa.

Seguí sospechando de mi configuración con dos droplets para cada subdominio y dos registros A respectivos, más un conjunto de registros NS para mi dominio principal que apunta a ns1.digitalocean.com. Así que probé dnsstuff para mi sitio y obtuve un fallo en la verificación del registro SOA, y whatsmydns.net para mis registros NS, pero aún no pude encontrar ninguna conexión posible con mi problema.

En este punto estoy totalmente confundido sobre quién está causando el error: si soy yo por haber configurado mal algunos registros DNS (lo cual, según @david, no debería afectarlo), si son problemas de configuración del servidor, o si es simplemente MS-Teams (outlook.office.com) actuando de forma extraña o bloqueándome de alguna manera.

Agradecería cualquier sugerencia sobre qué puedo verificar o hacer para encontrar el error, incluyendo a dónde más acudir y preguntar, si crees que esto está más allá de lo que puedes ayudarme aquí.

Muchas gracias por toda la ayuda hasta ahora.

1 me gusta

Hola, gracias por esto. Sigo fallando en el paso Discourse 5: la caja de diálogo indica que mi URL de Webhooks entrantes no es válida.

¡Cualquier ayuda será apreciada!

Dan

1 me gusta

¿Te importaría compartir cómo se ve tu URL de webhook? Ya sea mediante mensaje privado para mí o, si puedes invalidarla primero, aquí en el tema?

1 me gusta

Gracias @Dan_Turner, he relajado un poco nuestra validación, lo que debería ayudar a la situación. Por favor, pruébalo y dime si funciona mejor para ti

2 Me gusta

¡Gracias! Lo probaré.

Dan

1 me gusta

Perdona que sea tonto, pero ¿necesito actualizar Discourse o editar el archivo directamente como se detalla en la solución?
Gracias, Dan

1 me gusta

Debes actualizar el plugin. Visita /admin/upgrade y haz clic en el botón de actualización junto a “Discourse-chat-integration”.

2 Me gusta

Hola, lo siento mucho por mi torpeza, pero ¿cómo puedo probar esto realmente si estoy en una instancia de Discourse alojada? Gracias, Dan.

1 me gusta

Necesitarás pedir a tu proveedor de alojamiento que actualice el plugin por ti. En discourse.org, este cambio ya se ha implementado para todos nuestros clientes, así que supongo que debes estar alojado en otro lugar.

1 me gusta

Sí, el alojamiento de Discourse para mí. ¿Qué versión es, por favor? Y les pediré que la actualicen.

1 me gusta

No tenemos números de versión para los complementos, pero puedes compartir este enlace de commit con ellos: 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?