Como Enviar Webhooks do Discord a Partir de um Cron Job
🔍 WiseChecker

Como Enviar Webhooks do Discord a Partir de um Cron Job

Você quer enviar mensagens automatizadas para um canal do Discord em horários agendados. Um cron job em um servidor Linux pode acionar uma URL de webhook que publica mensagens no Discord. Essa configuração permite enviar relatórios diários, alertas de servidor ou qualquer notificação periódica sem esforço manual. Este artigo explica como criar um webhook do Discord, escrever um script que envia dados para ele e agendar esse script com cron.

Principais Conclusões: Enviando Webhooks do Discord via Cron

  • Configurações do Servidor > Integrações > Webhooks: Crie uma URL de webhook que publique mensagens em um canal específico.
  • Comando curl com payload JSON: Envie uma requisição POST com content-type application/json para a URL do webhook.
  • crontab -e: Agende o script para rodar em qualquer intervalo usando a sintaxe do cron.

O que é um Webhook do Discord e Como Funciona

Um webhook do Discord é uma forma simples de enviar mensagens para um canal do Discord a partir de uma fonte externa. Você cria uma URL de webhook dentro de um canal do servidor, e qualquer aplicação que envie uma requisição HTTP POST formatada corretamente para essa URL pode publicar uma mensagem. A mensagem pode incluir texto, embeds, anexos de arquivos e menções. Nenhum token de bot ou OAuth é necessário. O webhook age como uma conta de usuário que publica mensagens com o nome e avatar definidos durante a criação.

Pré-requisitos para Enviar Webhooks a Partir do Cron

Antes de começar, você precisa de três coisas. Primeiro, um servidor do Discord onde você tenha permissão Gerenciar Webhooks. Segundo, um servidor Linux ou Unix onde você possa editar o crontab e executar scripts. Terceiro, o comando curl deve estar instalado nesse servidor. A maioria das distribuições Linux inclui curl por padrão. Se estiver faltando, instale-o com seu gerenciador de pacotes, por exemplo sudo apt install curl no Debian ou Ubuntu.

Como o Agendamento Cron Funciona

Cron é um agendador de tarefas baseado em tempo em sistemas operacionais Unix-like. Você define um agendamento usando cinco campos: minuto, hora, dia do mês, mês e dia da semana. Um cron job executa um comando ou script nos horários especificados. Por exemplo, 0 9 executa um job todos os dias às 9:00. O daemon cron executa o job em um ambiente mínimo, então você deve usar caminhos absolutos para scripts e comandos.

Passos para Criar e Agendar um Webhook do Discord com Cron

Passo 1: Criar um Webhook no Discord

  1. Abra as Configurações do Servidor
    Clique com o botão direito no nome do servidor na barra lateral esquerda e selecione Configurações do Servidor. Se você não vir essa opção, não tem permissão Gerenciar Servidor.
  2. Vá para Integrações
    No menu esquerdo das Configurações do Servidor, clique em Integrações. Em seguida, clique no botão Webhooks.
  3. Crie um Webhook
    Clique no botão Criar Webhook. Uma nova entrada de webhook aparece com um nome e avatar padrão.
  4. Defina o Canal e o Nome
    Clique na entrada do webhook para expandi-la. Em Canal, selecione o canal de texto onde as mensagens aparecerão. Em Nome, digite um nome de exibição como Alertas do Servidor. Você também pode enviar um avatar personalizado.
  5. Copie a URL do Webhook
    Clique no botão Copiar URL do Webhook. A URL se parece com https://discord.com/api/webhooks/1234567890/abcdefg. Salve esta URL em um local seguro. Qualquer pessoa com esta URL pode publicar mensagens no canal.

Passo 2: Escrever um Script que Envia o Webhook

Crie um script shell que use curl para enviar uma requisição POST para a URL do webhook. O payload mínimo é um objeto JSON com um campo content. Abaixo está um exemplo completo de script chamado send-discord.sh.

#!/bin/bash

WEBHOOK_URL="https://discord.com/api/webhooks/1234567890/abcdefg"
MESSAGE="Olá do cron job em $(date)"

curl -H "Content-Type: application/json" \
     -X POST \
     -d "{\"content\":\"$MESSAGE\"}" \
     $WEBHOOK_URL

Substitua o valor de WEBHOOK_URL pela URL que você copiou. Salve o arquivo e torne-o executável com chmod +x send-discord.sh. Teste o script executando ./send-discord.sh no terminal. Você deve ver a mensagem aparecer no seu canal do Discord.

Passo 3: Payloads Avançados com Embeds

Você pode enviar mensagens mais ricas usando objetos embed do Discord. Um embed pode incluir título, descrição, barra de cor, campos, rodapé e timestamp. Abaixo está um exemplo de script que envia um embed.

#!/bin/bash

WEBHOOK_URL="https://discord.com/api/webhooks/1234567890/abcdefg"

curl -H "Content-Type: application/json" \
     -X POST \
     -d '{
       "embeds": [{
         "title": "Relatório Diário",
         "description": "Status do servidor em $(date)",
         "color": 5814783,
         "fields": [
           {"name": "Carga da CPU", "value": "0.45", "inline": true},
           {"name": "Uso de Memória", "value": "3.2 GB / 8 GB", "inline": true}
         ],
         "footer": {"text": "Cron Job"},
         "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
       }]
     }' \
     $WEBHOOK_URL

O valor da cor é uma representação decimal de uma cor hexadecimal. Por exemplo, 5814783 corresponde à cor hexadecimal #58B9FF. Use um conversor de cores para encontrar o valor decimal de qualquer cor.

Passo 4: Agendar o Script com Cron

  1. Abra o Editor do Crontab
    Execute crontab -e no terminal. Se for a primeira vez, pode ser solicitado que você escolha um editor. Selecione nano ou vim.
  2. Adicione uma Linha de Cron Job
    No final do arquivo, adicione uma linha que defina o agendamento e o caminho do script. Use o caminho absoluto para o script. Por exemplo, para executar o script todos os dias às 9h:
    0 9
    /home/usuario/send-discord.sh
  3. Salve e Saia
    No nano, pressione Ctrl+O para salvar, depois Ctrl+X para sair. No vim, pressione Esc, digite :wq e pressione Enter. O cron instala o novo agendamento e começa a executar o job nos horários especificados.

Passo 5: Verificar se o Cron Job Está Rodando

Verifique o log do cron para ver se o job foi executado. Na maioria dos sistemas, os logs do cron são gravados em /var/log/syslog ou /var/log/cron. Procure pelo nome do seu script com grep send-discord /var/log/syslog. Você também pode adicionar um arquivo de log simples dentro do seu script acrescentando uma linha como echo "$(date): Mensagem enviada" >> /home/usuario/cron.log.

Problemas Comuns ao Enviar Webhooks a Partir do Cron

Script Roda no Terminal Mas Não no Cron

O cron executa com uma variável de ambiente PATH limitada. Se o curl não estiver no PATH padrão, o script falha. Use o caminho completo para o curl no seu script. Descubra-o executando which curl — tipicamente /usr/bin/curl. Substitua curl por /usr/bin/curl no script. Além disso, use caminhos absolutos para todas as referências de arquivos.

URL do Webhook Exposta no Script

Armazenar a URL do webhook em um arquivo de script é um risco de segurança se o script for legível por outros usuários. Defina permissões restritivas com chmod 700 send-discord.sh. Alternativamente, armazene a URL em uma variável de ambiente e referencie-a no script. Adicione a variável ao seu crontab com WEBHOOK_URL=sua_url antes da linha do job, depois use $WEBHOOK_URL no script.

Payload JSON Malformado

Se a API do Discord retornar um erro 400 Bad Request, o payload JSON é inválido. Erros comuns incluem vírgulas faltando, aspas duplas não escapadas dentro de strings ou vírgulas à direita em arrays. Valide seu JSON com uma ferramenta como jq. Execute echo 'seu_json' | jq . para ver erros de análise.

Limitação de Taxa por Postagens Frequentes

O Discord impõe limites de taxa em requisições de webhook. O limite é de 30 requisições por 60 segundos por webhook. Se seu cron job rodar mais de uma vez a cada dois segundos, você pode receber respostas 429 Too Many Requests. Agende seu cron job em intervalos de pelo menos dois segundos ou implemente lógica de repetição com backoff exponencial.

Padrões de Agendamento Cron vs Tipos de Payload do Webhook do Discord

Item Mensagem de Texto Simples Embed com Campos
Tamanho do payload Pequeno, abaixo de 2000 caracteres Maior, até 6000 caracteres no total
Caso de uso Alertas rápidos ou atualizações de status Relatórios detalhados com dados estruturados
Complexidade do curl JSON simples de uma linha JSON de várias linhas com objetos aninhados
Suporte a cores Não Sim, via campo color
Múltiplos campos Não Até 25 campos

Agora você tem um sistema funcional que envia mensagens do Discord automaticamente usando cron. A URL do webhook e o script curl cuidam da comunicação. Para estender essa configuração, considere adicionar lógica condicional no script para enviar mensagens diferentes com base em métricas do servidor. Um próximo passo útil é incluir anexos de arquivos usando o tipo de conteúdo multipart/form-data em vez de JSON.