Webhooks do Discord permitem enviar mensagens automáticas para canais de texto sem um bot completo. O OAuth2 é o padrão do Discord para autorizar aplicativos de terceiros a acessar dados do usuário. Combinar ambos permite criar um sistema seguro onde um app externo envia notificações para um canal específico do Discord somente após o usuário conceder permissão via OAuth2. Este artigo explica como configurar um aplicativo Discord, gerar uma URL de autorização OAuth2 e usar o token de acesso resultante para enviar mensagens via webhook.
Principais Pontos: Webhook Discord + Autorização OAuth2
- Portal do Desenvolvedor Discord > Applications > OAuth2 > URL Generator: Crie uma URL de autorização com o escopo webhook.incoming para que os usuários aprovem seu app.
- URI de redirecionamento OAuth2: Seu app recebe um código temporário que deve ser trocado por um token de acesso usando uma requisição POST ao endpoint de token do Discord.
- URL do webhook na resposta do token: A resposta do token inclui um objeto webhook contendo o ID do canal e a URL completa do webhook para enviar mensagens.
Como Funciona a Autorização de Webhook do Discord com OAuth2
Webhooks do Discord são endpoints HTTP simples que aceitam payloads JSON. Normalmente você cria um webhook manualmente nas configurações de Integrações de um canal e copia sua URL. Essa URL contém um ID e token únicos que qualquer pessoa pode usar para postar mensagens sem autenticação adicional.
O OAuth2 adiciona uma camada de consentimento do usuário. Em vez de compartilhar uma URL de webhook estática, seu aplicativo solicita permissão de um usuário do Discord para criar um webhook em nome dele. O usuário clica em um link de autorização, faz login e aprova o escopo webhook.incoming. O Discord então retorna um token de acesso que seu app pode usar para criar um webhook em um canal específico escolhido pelo usuário.
Pré-requisitos
Antes de começar, você precisa de um aplicativo Discord registrado no Portal do Desenvolvedor. Também precisa de um servidor web ou uma função serverless que possa lidar com requisições HTTP e armazenar tokens com segurança. O usuário que autoriza o aplicativo deve ter a permissão Gerenciar Webhooks no servidor Discord de destino.
Passos para Autorizar um Webhook Usando OAuth2
Este processo tem três fases: criar a URL de autorização, trocar o código por um token e usar o token para enviar uma mensagem via webhook.
Fase 1: Gerar a URL de Autorização OAuth2
- Abra o Portal do Desenvolvedor Discord
Acesse https://discord.com/developers/applications e faça login com sua conta Discord. - Selecione seu aplicativo
Clique no aplicativo que deseja usar. Se não tiver criado um, clique em New Application, dê um nome e confirme. - Navegue até as configurações de OAuth2
Na barra lateral esquerda, clique em OAuth2. Na aba General, você vê o Client ID e o Client Secret. Copie o Client ID — você precisa dele para a URL de autorização. - Adicione uma URI de redirecionamento
Role para baixo até Redirects. Clique em Add Redirect e insira a URL para onde o Discord enviará o código de autorização. Para testes locais, usehttp://localhost:3000/callback. Clique em Save Changes. - Monte a URL de autorização
Use o URL Generator no topo da página OAuth2. Selecione o escopo webhook.incoming. Em Redirect URL, escolha o redirecionamento que você acabou de adicionar. O gerador mostra uma URL como esta:https://discord.com/api/oauth2/authorize?client_id=SEU_CLIENT_ID&redirect_uri=SUA_REDIRECT_URI&response_type=code&scope=webhook.incoming
Copie esta URL. Quando um usuário a visitar, o Discord pedirá que ele selecione um servidor e um canal onde o webhook será criado.
Fase 2: Trocar o Código de Autorização por um Token de Acesso
- Lide com o redirecionamento
Após o usuário aprovar a autorização, o Discord redireciona o navegador dele para sua URI de redirecionamento com um parâmetro de consultacode. Por exemplo:http://localhost:3000/callback?code=abc123. - Envie uma requisição POST para o endpoint de token
Seu backend deve trocar este código por um token de acesso. Envie uma requisição POST parahttps://discord.com/api/oauth2/tokencom os seguintes parâmetros no corpo (use dados de formulário codificados na URL):client_id=SEU_CLIENT_ID&client_secret=SEU_CLIENT_SECRET&grant_type=authorization_code&code=abc123&redirect_uri=SUA_REDIRECT_URI - Analise a resposta
O Discord retorna um objeto JSON contendoaccess_token,token_type(sempreBearer),expires_in,refresh_tokene um objetowebhook. O objetowebhookincluiid,type,name,avatar,channel_ideurl. Aurlé a URL completa do webhook que você usará para enviar mensagens. - Armazene o token e a URL do webhook
Salve oaccess_tokene owebhook.urlem seu banco de dados. O token expira após 7 dias. Use orefresh_tokenpara obter um novo token sem pedir que o usuário reautorize.
Fase 3: Enviar uma Mensagem via Webhook Usando o Webhook Autorizado
- Prepare o payload JSON
Crie um objeto JSON com um campocontent. Por exemplo:{ "content": "Olá do seu webhook autorizado!" }
Você também pode incluir camposembeds,usernameeavatar_url. - Envie a requisição POST
Use qualquer cliente HTTP para enviar uma requisição POST para a URL do webhook que você armazenou. A URL se parece com:https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN
Defina o cabeçalhoContent-Typecomoapplication/json. Nenhuma autenticação adicional é necessária porque a própria URL do webhook é a credencial. - Verifique a resposta
Se a requisição for bem-sucedida, o Discord retorna204 No Content. Se você receber um400 Bad Request, verifique se seu JSON é válido. Um404significa que o webhook foi excluído ou o token está errado.
Erros Comuns e Limitações
Webhook Não Aparece na Resposta do Token
Se a resposta do token não incluir um objeto webhook, o usuário não completou o fluxo de autorização corretamente. A causa mais comum é que o usuário não selecionou um canal durante a tela de consentimento OAuth2. Lembre o usuário de escolher um canal antes de clicar em Authorize.
Token de Acesso Expira Antes de Enviar uma Mensagem
O token de acesso expira após 7 dias. Depois de obter a URL do webhook, você não precisa mais do token de acesso para enviar mensagens. A URL do webhook é permanente, a menos que o webhook seja excluído. Armazene a URL do webhook imediatamente após o fluxo OAuth2 e use-a diretamente.
Usuário Não Consegue Selecionar o Servidor ou Canal
O usuário deve ter a permissão Gerenciar Webhooks no servidor onde deseja criar o webhook. Se o menu suspenso de servidores estiver vazio, o usuário não tem essa permissão em nenhum servidor que possua ou gerencie. Peça ao usuário para verificar suas funções no servidor de destino.
Escopo Bot vs Escopo Webhook.incoming
Não confunda o escopo bot com webhook.incoming. O escopo bot adiciona um usuário bot ao servidor, o que requer permissões adicionais e um token de bot. O escopo webhook.incoming apenas cria um webhook — nenhum usuário bot é adicionado. Use webhook.incoming quando você só precisa enviar mensagens programaticamente.
Escopo Webhook OAuth2 vs Escopo Bot
| Item | Escopo webhook.incoming | Escopo bot |
|---|---|---|
| O que cria | Uma URL de webhook para enviar mensagens | Um usuário bot que entra no servidor |
| Permissões necessárias | Gerenciar Webhooks no canal de destino | Definidas no inteiro de permissão do bot |
| Método de autenticação | URL do webhook (ID + token) | Token do bot do Portal do Desenvolvedor |
| Pode ler mensagens | Não | Sim, com intents apropriados |
| Pode editar/excluir mensagens | Não | Sim, se as enviou |
| Consentimento do usuário necessário | Sim, via autorização OAuth2 | Sim, via autorização OAuth2 |
| Melhor para | Notificações, logs, postagem simples de mensagens | Comandos interativos, moderação, lógica complexa |
Use o escopo webhook.incoming quando seu aplicativo precisar apenas enviar mensagens para um canal do Discord e não precisar ler ou interagir com usuários. Use o escopo bot quando precisar de um bot interativo completo que possa ouvir eventos, responder a comandos e gerenciar recursos do servidor.
O fluxo OAuth2 para o escopo bot é idêntico ao fluxo do webhook, exceto que o valor do escopo é bot e você também deve especificar o parâmetro permissions como um inteiro bitwise. O token retornado é um token de bot, não uma URL de webhook. Você pode combinar ambos os escopos em uma única requisição de autorização separando-os por um espaço, por exemplo: scope=bot webhook.incoming.
Agora você pode configurar um webhook do Discord autorizado via OAuth2 para seu aplicativo. Os passos principais são gerar a URL de autorização correta com o escopo webhook.incoming, lidar com o callback para trocar o código por um token e armazenar a URL do webhook para envio futuro de mensagens. Para uso em produção, implemente a renovação do token com o refresh_token para evitar pedir que os usuários reautorizem a cada 7 dias. Você também pode combinar o escopo webhook.incoming com outros escopos como identify para acessar informações adicionais do usuário no mesmo fluxo OAuth2.