Configurar notificações do Microsoft Teams usando o plugin discourse-chat-integration

Este guia descreve como configurar o provedor do Microsoft Teams incluído em discourse-chat-integration.

Configuração do Microsoft Teams

No Microsoft Teams:

  1. Na barra de navegação vertical à esquerda, clique no botão de reticências () e selecione Fluxos de trabalho no menu.

  2. Clique no botão + Criar do zero no canto superior direito da página Fluxos de trabalho.

  3. No modal de fluxo de trabalho personalizado, pesquise por webhook e selecione o gatilho Quando uma solicitação de webhook do Teams for recebida.

  4. No campo Quem pode acionar o fluxo, selecione Qualquer pessoa. [1]

  5. Clique em + Nova etapa.

  6. Em seguida, pesquise por card e selecione a ação Publicar cartão em um bate-papo ou canal.

  7. Preencha os campos da seguinte forma:

  • Publicar como: Escolha de quem as mensagens devem vir; você pode deixar o valor padrão ou escolher Usuário para que a mensagem apareça como se fosse sua.

  • Publicar em: Selecione Canal, o que fará com que mais campos apareçam:

    • Equipe: Selecione a equipe desejada.
    • Canal: Selecione o canal desejado.
    • Cartão Adaptável: Clique no campo de entrada, o que abrirá um pop-up (descrito na próxima etapa).

  1. Clique no campo Cartão Adaptável para abrir um pop-up [2] para inserir conteúdo dinâmico ou uma expressão. Mude para a guia Expressão e digite triggerBody() no campo de expressão.

  2. Clique em Salvar.

  3. Você deverá ver agora um fluxo de trabalho chamado manual → Publicar cartão em um bate-papo ou canal na sua lista. Clique no botão de reticências verticais neste fluxo de trabalho e selecione Detalhes no menu suspenso.

  4. Nesta página, clique em Copiar link do webhook para obter o link para as próximas etapas. Enquanto estiver aqui, você pode opcionalmente editar o nome do fluxo de trabalho para refletir sua finalidade para outras pessoas da sua equipe.

Configuração do Discourse

Agora, de volta ao Discourse:

  1. Na área de administração do seu Discourse, ative a configuração Chat integration enabled para ligar o plugin de Integração de Chat e a configuração Chat integration Teams enabled para suportar o Microsoft Teams.

  2. Na barra lateral, encontre a seção Plugins e clique em Integrações de Chat, depois clique em + Criar Canal.

  3. No modal Editar Canal, preencha os campos da seguinte forma:

  • Nome: Insira um nome que deixe claro a qual canal do Microsoft Teams você está se conectando; não precisa ser uma correspondência exata.
  • URL do Webhook: Cole a URL do webhook que você copiou na etapa 11 da seção de configuração do Teams acima.
  1. Clique em Salvar Canal.

Teste a integração

Agora é hora de garantir que tudo esteja funcionando como esperado.

  1. No Discourse, clique em Testar no canal recém-criado.

  2. Pesquise um tópico por ID, título ou URL; selecione o tópico desejado; e clique em Enviar Mensagem de Teste.

  3. No Microsoft Teams, uma nova mensagem com informações do tópico deve ser postada no canal:

Opcional: Configure Regras para seu canal

Agora que você confirmou que tudo está funcionando, você pode voltar ao Discourse e configurar regras adicionais para seu canal para personalizar a mensagem.

Depuração

Se você não vir a mensagem no Microsoft Teams como esperado, vá para a página Detalhes do Fluxo de Trabalho (consulte a etapa 10 na seção de configuração do Teams acima) e verifique a seção Histórico de Execuções. Isso deve mostrar logs de cada execução de mensagem.

Clique na execução com falha, o que o levará para a área Power Automate, onde você poderá ver uma mensagem de erro na parte superior da página. (Na captura de tela abaixo, a execução foi bem-sucedida, mas a seta indica onde o erro aparecerá em uma execução com falha.)

Isso deve detalhar o problema, que você pode então corrigir ou compartilhar conosco aqui para que possamos ajudar.


    1. O Discourse atualmente não suporta webhooks autenticados para o Teams, então apenas a opção “Qualquer pessoa” funciona.
    ↩︎
  1. se o pop-up não aparecer, digite algo temporariamente no campo Cartão Adaptável, salve o fluxo de trabalho, abra-o novamente para edição e o pop-up deverá aparecer ↩︎

12 curtidas

Acabei de testar e pareceu funcionar no início, mas apenas na primeira vez que cliquei no botão de teste.
As regras estão configuradas da seguinte forma:

  • Tipo: normal
  • Filtro: Todos os tópicos (?) e respostas (traduzindo do alemão aqui)
  • Categoria: Sandbox

Quando escrevi uma resposta ao tópico de teste na minha categoria Sandbox, apareceu um sinal de alerta ao acessar minhas integrações de chat, mas ao clicar no triângulo de alerta, diz erro desconhecido... com a mensagem de erro sendo null.

Quando tento enviar outra notificação de teste, recebo outro erro: 500 internal server error.

Qualquer dica sobre por onde começar a solucionar esse problema é bem-vinda. Se isso deveria ser postado em outro lugar (por exemplo, na página do plugin de integração de chat) ou se deve ser um tópico separado, fique à vontade para movê-lo ou me avisar.

3 curtidas

Olá @SHilser - por favor, verifique /logs no seu site e veja se há algo relevante lá?

2 curtidas

Há duas coisas que parecem relevantes.

  • Erro de Socket
  • Erro Interno do Servidor

Copiei os logs abaixo (substituí meu nome de domínio por mydomain.tld)

Erro de Socket

Mensagem (4 cópias relatadas)

SocketError (Falha ao abrir conexão TCP para outlook.office.com:443 (getaddrinfo: Falha temporária na resolução de nome))
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'

Ambiente

HTTP HOSTS: mysite.tld

Erro Interno do Servidor

Mensagem (4 cópias relatadas)

Erro: Erro Interno do Servidor
URL: https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js
Linha: 1
Coluna: 267890
Local da Janela: 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:496596Aqui
t</t.end@https://mysite.tld/assets/ember_jquery-1ed3f3559e6f967733b4088aa729ff7039dff2c09c5a5f787a214b016f58aabc.js:1:493157

Ambiente

HTTP HOSTS: mysite.tld

Obrigado pela ajuda :slight_smile:

2 curtidas

Isso sugere que seu servidor está com problemas na resolução de DNS. Você está usando uma instalação padrão baseada em Docker? Ou isso é em ambiente de desenvolvimento?

3 curtidas

Configurei há cerca de uma semana em um droplet DigitalOcean separado (instalação com um clique; agora estou na versão: 2.6.0.beta1 (310952fd6a). Uso um subdomínio e também tenho os registros DNS no DigitalOcean. Tenho um registro A apontando para o IP e um registro MX apontando para o nome do subdomínio para respostas por e-mail, conforme estas instruções). O único detalhe é que não publiquei um registro DMARC.

Isso é tudo que consigo lembrar ter feito em relação às configurações de DNS. No entanto, até agora tudo funcionou conforme o esperado. O site está configurado, consigo acessá-lo pelo nome do subdomínio, fazer login, criar tópicos (até mesmo por e-mail), etc.

Só fiquei surpreso que a primeira mensagem tenha chegado, mas as subsequentes não :man_shrugging:

2 curtidas

Quando falo em resolução de DNS, quero dizer que seu servidor está com dificuldades para se conectar a outlook.office.com. A configuração dos registros DNS do seu fórum não deve afetar isso.

Você pode tentar se conectar ao seu servidor via SSH e executar

host outlook.office.com

Você deve obter algo como

outlook.office.com é um alias para substrate.office.com.
substrate.office.com é um alias para substrate.ms-acdc.office.com.
substrate.ms-acdc.office.com é um alias para afd-k.office.com.
afd-k.office.com é um alias para outlook-office-com.k-0002.k-msedge.net.
outlook-office-com.k-0002.k-msedge.net é um alias para k-0002.k-msedge.net.
k-0002.k-msedge.net tem o endereço 13.107.18.11
k-0002.k-msedge.net tem o endereço IPv6 2620:1ec:c::11
3 curtidas

Quando eu executo

host -d outlook.office.com

recebo o seguinte:

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

Ao adicionar a porta :443, obtenho outro erro:

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 outros domínios, como google.com ou o domínio da minha instância do Discourse em questão (h-da.transformative-praxis.cc), ou outros sites, obtenho a saída esperada, semelhante à que você descreveu.

Fiz uma pesquisa sobre o primeiro erro, mas ainda não tenho certeza sobre sua origem. Li o seguinte, mas não consegui avaliar se isso é realmente relevante para o meu problema:

1 curtida

Continuei tentando novamente e, desta vez, obtive os resultados que você descreveu ao digitar:

host outlook.office.com

Então, tudo parecia estar correto nesse momento. Repeti isso várias vezes seguidas para ter certeza (cerca de 15 vezes, com intervalos de aproximadamente 10 segundos), e em algum momento recebi o mesmo erro de servfail de antes. Mas, na maior parte das vezes, funcionou.

O oposto ocorre quando tento enviar uma mensagem de teste. Talvez funcione apenas uma vez a cada dez tentativas. Nas outras vezes, recebo os mesmos erros de antes. E quando publico uma mensagem regular que atende à regra que configurei para o canal, não recebo nenhuma notificação, nem mensagem de erro nos logs.
Tudo parece tão aleatório para mim que não consigo descobrir o que está causando isso.

Fiquei suspeitando da minha configuração com dois droplets para cada subdomínio e dois registros A correspondentes, além de um conjunto de registros NS para meu domínio principal apontando para ns1.digitalocean.com. Então, testei dnsstuff para meu site e obtive um Falha na verificação do registro SOA, e whatsmydns.net para meus registros NS, mas ainda não consegui identificar nenhuma possível conexão com meu problema.

Neste ponto, estou totalmente confuso sobre quem está causando o erro: eu, por ter feito alguma configuração DNS incorreta (o que, segundo @david, não deveria afetar isso), configurações ou problemas no servidor, ou será que é apenas o MS-Teams (outlook.office.com) apresentando falhas ou me bloqueando de alguma forma?

Qualquer dica sobre o que posso verificar/fazer para encontrar o erro será bem-vinda, incluindo para onde mais posso ir e perguntar, caso você ache que isso está além do que você pode me ajudar aqui.

Muito obrigado por toda a ajuda até agora.

1 curtida

Olá, obrigado por isso. Estou falhando na etapa Discourse 5: a caixa de diálogo diz que minha URL de Webhooks de entrada é inválida?

Qualquer ajuda será apreciada!

Dan

1 curtida

Você se importaria de compartilhar como é sua URL de webhook? Seja via mensagem privada para mim ou, se você puder invalidá-la primeiro, aqui no tópico?

1 curtida

Obrigado, @Dan_Turner. Acabei de relaxar um pouco nossa validação, o que deve ajudar na situação. Por favor, teste e me avise se funciona melhor para você.

2 curtidas

Obrigado! Vou experimentar.

Dan

1 curtida

Desculpe ser lento, mas preciso atualizar o Discourse ou editar o arquivo diretamente conforme detalhado na correção?
Obrigado, Dan

1 curtida

Você precisa atualizar o plugin. Acesse /admin/upgrade e clique no botão de atualização ao lado de “Discourse-chat-integration”.

2 curtidas

Ei, desculpe por ser incompetente, mas como posso realmente testar isso, já que estou em uma instância do Discourse hospedada? Obrigado, Dan.

1 curtida

Você precisará solicitar ao seu provedor de hospedagem que atualize o plugin para você. No discourse.org, essa alteração já foi enviada a todos os nossos clientes, então imagino que você esteja hospedado em outro lugar?

1 curtida

Sim, hospedagem do Discourse para mim. Qual é a versão, por favor, para que eu possa pedir a eles para atualizar?

1 curtida

Não temos números de versão para os plugins, mas você pode compartilhar este link de commit com eles: https://github.com/discourse/discourse-chat-integration/commit/00ec1f486a3fd1dc523cdf242cfb1c78baaa407e

2 curtidas

Obrigado por este plugin - tão útil.
Uma grande melhoria seria: adicionar menção de grupo na mensagem para gerar notificações no lado do Teams.
Parece que a API de webhook não está (estava?) implementando este recurso, mas alguns dizem que foi implementado recentemente.
Você acha que poderia ser implementado facilmente?