Você tem um workspace no Slack onde sua equipe posta mensagens importantes, mas deseja que essas mensagens apareçam em um canal do Discord com a formatação adequada. Webhooks do Discord podem receber dados do Slack, mas o formato das mensagens difere entre as duas plataformas. O Slack usa sua própria formatação com recursos como menções a usuários, links de canais e anexos ricos, enquanto o Discord espera uma estrutura JSON diferente. Este artigo explica como configurar um webhook do Discord, configurar o Slack para enviar mensagens para ele e converter a formatação do Slack para um formato compatível com o Discord usando um script simples ou middleware.
Principais conclusões: Webhook do Discord para Mensagens do Slack com Conversão de Formatação
- URL do Webhook do Discord em Configurações do Servidor > Integrações > Webhooks: Crie um webhook que fornece uma URL única para receber mensagens.
- Webhook de Saída do Slack ou Workflow do Slack com Solicitação de Webhook: Envie mensagens do Slack para a URL do webhook do Discord com um payload JSON.
- Conversão de Formatação via Função em Nuvem ou Script: Transforme campos da mensagem do Slack como texto, user_id e canal em campos de conteúdo ou embed do Discord.
Como os Webhooks do Discord Funcionam com Mensagens do Slack
Um webhook do Discord é um endpoint HTTP simples que aceita payloads JSON e os publica em um canal específico do Discord. O Slack pode enviar mensagens para qualquer endpoint HTTP usando seus Webhooks de Saída ou Workflows do Slack. No entanto, a estrutura JSON que o Slack envia difere do que o Discord espera. Webhooks do Discord esperam um payload com campos como content, embeds, username e avatar_url. O Slack envia campos como text, user_name, channel_name e attachments. Sem conversão, as mensagens do Slack aparecem como texto simples ou falham ao serem publicadas.
Pré-requisitos
Antes de começar, você precisa de um servidor Discord onde tenha permissão para Gerenciar Webhooks, um workspace Slack onde possa criar Webhooks de Saída ou Workflows, e uma maneira de executar uma função serverless ou um script pequeno. Este artigo usa uma Google Cloud Function gratuita como middleware, mas você pode usar qualquer endpoint HTTP que controle, como AWS Lambda, Azure Function ou um servidor Node.js em um Raspberry Pi.
Entendendo as Diferenças de Formatação
O Slack envia mensagens em um objeto JSON que inclui o texto da mensagem, o usuário que a enviou, o canal e anexos opcionais. Webhooks do Discord aceitam um objeto JSON com content para texto simples, embeds para cartões ricos e allowed_mentions para controlar menções. As principais diferenças incluem:
- O Slack usa
textpara o corpo da mensagem; o Discord usacontent. - O Slack usa
user_namepara o nome do remetente; o Discord usausernameno payload do webhook. - O Slack suporta menções
@usuarioe#canal; o Discord usa<@id_usuario>e<#id_canal>. - Os anexos do Slack contêm
title,text,colorefields; os embeds do Discord contêmtitle,description,colorefields.
Passos para Configurar o Webhook do Discord e Encaminhar Mensagens do Slack
- Criar um Webhook do Discord
Abra o Discord e vá para seu servidor. Clique em Configurações do Servidor > Integrações > Webhooks. Clique em Novo Webhook. Dê um nome, selecione o canal de destino e clique em Copiar URL do Webhook. Salve esta URL para usar depois. - Configurar o Webhook de Saída do Slack
No Slack, vá para o painel de API do Slack em api.slack.com/apps. Crie um novo aplicativo ou use um existente. Em Recursos, clique em Webhooks de Entrada e ative-os. Ou use Webhooks de Saída no mesmo aplicativo. Para Webhooks de Saída, defina a URL para o endpoint do middleware que você criará no próximo passo. Se usar Workflows do Slack, crie um novo workflow com um gatilho de Solicitação de Webhook e defina a URL para seu endpoint de middleware. - Criar o Middleware de Conversão de Formatação
Escreva um endpoint HTTP simples que receba payloads do Slack, converta-os para o formato do Discord e os encaminhe. Exemplo usando Node.js e Google Cloud Functions:exports.slackToDiscord = (req, res) => { const slackPayload = req.body; const discordPayload = { content: slackPayload.text || '', username: slackPayload.user_name || 'Usuário do Slack', avatar_url: slackPayload.user_icon || 'https://exemplo.com/icone-padrao.png', embeds: [] }; if (slackPayload.attachments) { slackPayload.attachments.forEach(att => { discordPayload.embeds.push({ title: att.title || '', description: att.text || att.fallback || '', color: att.color ? parseInt(att.color, 16) : 0, fields: att.fields ? att.fields.map(f => ({name: f.title, value: f.value, inline: f.short})) : [] }); }); } fetch(DISCORD_WEBHOOK_URL, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(discordPayload) }); res.status(200).send('OK'); };Implante esta função no Google Cloud Functions, AWS Lambda ou qualquer endpoint HTTP. Defina a variável de ambiente
DISCORD_WEBHOOK_URLcom a URL que você copiou no passo 1. - Testar a Integração
No Slack, envie uma mensagem que inclua texto, um anexo ou um link. A mensagem deve aparecer no seu canal do Discord em segundos. Verifique o canal do Discord para a mensagem formatada. Se não aparecer, verifique os logs da sua função de middleware para erros. - Lidar com Menções e Referências a Canais do Slack
O Slack usa<@U12345>para menções a usuários e<#C12345>para referências a canais. O Discord usa<@123456789>e<#123456789>com IDs numéricos. Escreva uma função de conversão que mapeie IDs de usuários do Slack para IDs de usuários do Discord se você precisar que as menções funcionem. Para encaminhamento simples, você pode remover a sintaxe de menção ou substituí-la pelo nome de exibição do usuário a partir de uma tabela de consulta.
Problemas Comuns e Como Corrigi-los
A Mensagem do Slack Não Aparece no Discord
Verifique os logs da função de middleware. Causas comuns incluem URL do webhook do Discord incorreta, variável de ambiente ausente ou a função de middleware retornando um erro. Certifique-se de que sua função de middleware retorne um status 200 para o Slack; caso contrário, o Slack pode tentar novamente e causar duplicatas.
A Formatação Parece Errada no Discord
Os anexos do Slack e os embeds do Discord têm nomes de campo ligeiramente diferentes. Mapeie o text do Slack para description do Discord, a color do Slack (string hexadecimal) para color do Discord (inteiro) e fields[].title do Slack para fields[].name do Discord. Além disso, os embeds do Discord têm um limite de 6000 caracteres no total; trunque mensagens longas do Slack.
Nomes de Usuário Não Aparecendo Corretamente
O Slack envia user_name como nome de exibição. Webhooks do Discord aceitam um campo username no payload raiz. Se você quiser o ícone do usuário do Slack, inclua o campo avatar_url. Observe que os webhooks do Discord ignoram o campo username se você defini-lo como um nome de bot que viola os termos do Discord.
Webhook do Discord vs Webhook do Slack: Principais Diferenças
| Item | Webhook do Discord | Webhook do Slack |
|---|---|---|
| Formato do payload | JSON com content, embeds, username, avatar_url | JSON com text, attachments, channel, username, icon_url |
| Sintaxe de menção | <@id_usuario> ou <@&id_cargo> | <@id_usuario> ou <!subteam^id_grupo> |
| Suporte a anexos | Embeds com title, description, fields, color, image, footer | Attachments com title, text, fields, color, image_url, thumb_url |
| Limites de taxa | 30 requisições por segundo por webhook | 1 mensagem por segundo por webhook |
| Nome de usuário personalizado | Sim, definido no payload | Sim, definido no payload |
Após configurar o middleware, você pode encaminhar mensagens do Slack para o Discord com a formatação adequada. O script de conversão lida com texto, anexos e nomes de usuário. Para uso avançado, estenda o script para mapear menções de usuários do Slack para IDs de usuários do Discord usando uma tabela de consulta. Essa integração mantém sua equipe sincronizada em ambas as plataformas sem necessidade de repostagem manual.