Bots advanced

Escopo: transversal. Aplica-se a qualquer linguagem ou stack do projeto. Pré-requisito: bots.md, que cobre webhook, polling, command routing, session e rate limit.

Cada plataforma de mensageria resolve os mesmos problemas de um jeito próprio. Esta página cobre o que muda de uma para a outra: como o bot prova quem é, quais elementos de UI (User Interface · Interface do Usuário) a plataforma oferece e onde ela impõe limites. O gateway (ponto de entrada da plataforma) é o servidor por onde os eventos chegam ao bot.

Conceitos fundamentais

ConceitoO que é
Gateway Intent (intenção de gateway)Declaração de quais categorias de eventos o bot quer receber do Discord; reduz tráfego desnecessário
Slash Command (comando de barra)Comando registrado na plataforma com /prefixo; aparece com autocomplete para o usuário
Embed (mensagem incorporada)Mensagem rica do Discord com título, descrição, cor, imagem e campos estruturados
Inline Keyboard (teclado inline)Botões renderizados abaixo de uma mensagem no Telegram; cada botão dispara um callback
BotFather (bot oficial do Telegram que cria bots)Bot oficial do Telegram para criar e configurar bots: gera o token de autenticação
Bot Token (token do bot)Credencial de autenticação emitida pela plataforma; nunca exposta em código ou repositório
Business API (API empresarial)API oficial do WhatsApp para envio de mensagens; exige aprovação Meta e número homologado
Unofficial Client (cliente não-oficial)Biblioteca que simula o cliente WhatsApp Web para automação; sem suporte oficial e sujeita a banimento
Template Message (mensagem de modelo)Formato de mensagem pré-aprovado pela Meta para o primeiro contato com o usuário no WhatsApp

Discord

Autenticação e setup

O bot se identifica com um Bot Token criado no Discord Developer Portal. O token viaja no header Authorization: Bot <token> em toda chamada à API (Application Programming Interface · Interface de Programação de Aplicações) REST (Representational State Transfer · Transferência de Estado Representacional), e também na conexão WebSocket com o Gateway.

Criar ApplicationAdd Bot → copiar token → convidar bot ao servidor com OAuth2 URL

O token de uma conta de usuário (self-bot) nunca serve para isso. Usá-lo viola os Termos de Serviço do Discord e leva a banimento permanente da conta.

Gateway Intents

O Discord só entrega ao bot os eventos que ele pediu. Esse pedido é feito com Gateway Intents, e o evento cuja intent não foi declarada nunca chega. As intents privilegiadas (Presence, Guild Members, Message Content) dão acesso a dados sensíveis, então passam por aprovação manual da plataforma quando o bot está em mais de 100 servidores.

IntentEventos incluídos
GUILDSCriação, atualização e exclusão de servidores e canais
GUILD_MESSAGESMensagens em canais de servidor
MESSAGE_CONTENTConteúdo textual das mensagens (privilegiada)
DIRECT_MESSAGESMensagens diretas entre usuário e bot
GUILD_MEMBERSEntrada, saída e atualização de membros (privilegiada)

Slash Commands

O comando precisa ser registrado na API do Discord antes de aparecer para o usuário. O registro global demora até uma hora para propagar; o registro por servidor vale na hora, e é o que se usa em desenvolvimento.

Definir schema do comando → POST /applications/:id/commands → Discord registra → usuário digita / → autocomplete aparece → usuário confirma → Discord envia Interaction → bot responde

O bot tem 3 segundos para responder a uma Interaction. Quando o processamento demora mais que isso, o bot chama deferReply para segurar a interação e edita a resposta quando o trabalho termina.

Embeds

O Embed é o formato de mensagem rica do Discord: título, descrição, cor, imagem e campos, tudo em um cartão estruturado. Ele cabe melhor que uma mensagem longa em Markdown quando há vários campos para mostrar.

Limites de embed:

  • Título: 256 caracteres
  • Descrição: 4096 caracteres
  • Campos: máximo 25 por embed
  • Total de caracteres por mensagem: 6000

Telegram

Autenticação e setup

O Bot Token do Telegram vem do BotFather (@BotFather), o bot oficial que cria bots. Toda requisição à Bot API carrega o token dentro da própria URL (Uniform Resource Locator · Localizador Uniforme de Recurso): https://api.telegram.org/bot<token>/método.

/newbot no BotFather → define nome e username → BotFather entrega o token

Como o token vai na URL, ele aparece em log de servidor e em histórico de proxy com facilidade. Trate cada URL da Bot API como material sensível.

Modos de conexão

O Telegram aceita os dois modos, webhook e polling. Para webhook, o endpoint precisa de certificado TLS válido, e um certificado autoassinado só funciona com configuração extra.

Webhook:  POST https://api.telegram.org/bot<token>/setWebhook?url=<sua-url>
Polling:  GET  https://api.telegram.org/bot<token>/getUpdates?offset=<ultimo-update-id>

No polling, o parâmetro offset avisa ao Telegram o que já foi consumido. Ele avança para o update_id do último evento processado mais um. Esquecer de avançá-lo faz o bot reprocessar o mesmo lote de eventos para sempre.

Inline Keyboard

São três tipos de botão, com comportamentos diferentes:

TipoComportamento
InlineKeyboardButton com callback_dataEnvia callback silencioso ao bot; não cria nova mensagem
InlineKeyboardButton com urlAbre link externo no browser do usuário
ReplyKeyboardMarkupBotões que substituem o teclado do usuário; cria mensagem de texto ao clicar

O clique chega ao bot como um evento callback_query. Depois de tratar o clique, o bot chama answerCallbackQuery, e é essa chamada que apaga o indicador de carregamento girando na tela do usuário.

Tipos de chat

TipoDescrição
privateConversa direta entre usuário e bot
groupGrupo com até 200 membros; bot só recebe mensagens se for adicionado
supergroupGrupo com mais de 200 membros ou migrado; bot precisa de permissão para ler mensagens
channelCanal de broadcast; bot pode ser admin e enviar mensagens

Em grupo e supergrupo, o Telegram protege a privacidade da conversa: o bot só enxerga a mensagem que o menciona (@bot), a menos que a leitura ampla seja habilitada nas configurações do BotFather.


WhatsApp

API oficial ou cliente não-oficial

A automação do WhatsApp tem dois caminhos, com consequências bem diferentes.

Business API (oficial)Bibliotecas não-oficiais
ExemplosMeta Cloud API, On-Premise APIBaileys, whatsapp-web.js
AprovaçãoExige conta Meta Business e número homologadoQualquer número
CustoPor conversa (modelo de pricing Meta)Gratuito
Risco de banimentoNenhum se dentro dos Termos de ServiçoAlto; número pode ser banido sem aviso
SuporteOficial via MetaComunidade
RecomendaçãoProdução e uso comercialPrototipação e uso pessoal

Com usuários reais ou dados sensíveis em jogo, use a Business API oficial. O número banido leva junto o histórico de conversas e o contato dos clientes.

Business API: fluxo de mensagens

O bot não pode abrir uma conversa com texto livre. O primeiro contato sai como Template Message, um modelo que a Meta aprovou antes. Quando o usuário responde, abre uma janela de 24 horas em que o bot conversa livremente. Passadas as 24 horas sem resposta, o próximo contato volta a exigir template.

Bot envia Template → usuário responde → janela de 24h aberta → troca livre → janela fecha → novo Template necessário

O webhook da Business API entrega os eventos aninhados neste formato:

{
  "entry": [{
    "changes": [{
      "value": {
        "messages": [{ "from": "5511...", "text": { "body": "Olá" } }]
      }
    }]
  }]
}

O endpoint responde 200 OK na hora. Processar a mensagem dentro do handler do webhook estoura o tempo de espera da Meta, e ela reenvia o evento. Grave o evento numa fila e processe depois.

Verificação do webhook

Antes de ativar o webhook, a Meta precisa confirmar que a URL pertence a quem diz ser dono dela. Ela manda um GET com hub.verify_token (o segredo que você cadastrou) e hub.challenge (um número aleatório). O bot confere o token e devolve o hub.challenge no corpo da resposta.

GET /webhook?hub.mode=subscribe&hub.verify_token=<token>&hub.challenge=<nonce>
Bot responde: 200 OK com body = hub.challenge

Slack

Autenticação e setup

O app usa um Bot Token (xoxb-...), emitido na seção OAuth & Permissions do painel da Slack. O Signing Secret (segredo de assinatura) serve para o caminho contrário: com ele o app confere que a requisição HTTP (HyperText Transfer Protocol · Protocolo de Transferência de Hipertexto) recebida veio mesmo da Slack. No Socket Mode entra um terceiro, o App-Level Token (xapp-...) com scope connections:write, que dispensa a URL pública.

Criar app em api.slack.comBasic InformationSigning Secret
OAuth & PermissionsAdd scopes → Install app → Bot Token
App-Level Tokens (para Socket Mode)Generate → connections:write

Os três ficam em variável de ambiente. Nenhum deles entra no código.

Conexão de saída ou endpoint público

Socket ModeHTTP Mode
ConexãoWebSocket via App-Level TokenHTTP POST com verificação de Signing Secret
URL públicaNão necessárioObrigatório
Token adicionalSLACK_APP_TOKEN (xapp-...)Não necessário
Uso recomendadoDesenvolvimento e bots internosProdução e apps distribuídos

No Socket Mode o app abre a conexão de dentro para fora, então funciona atrás de firewall e na máquina de desenvolvimento, sem túnel nem domínio.

Block Kit

O Block Kit é o sistema de interface interativa da Slack. A mensagem é montada como uma lista de blocos tipados, e cada elemento interativo carrega um action_id que identifica o clique quando ele volta para o bot.

Tipo de blocoPara que serve
sectionTexto com Markdown (mrkdwn) e elemento acessório opcional
actionsLinha de botões, selects ou date pickers
imageImagem com título e texto alternativo
dividerSeparador visual entre blocos
headerTítulo em plain text em fonte maior
inputCampo de entrada para modais e Home Tab

O clique chega em app.action(action_id, handler). O ack() (confirmação de recebimento) precisa sair em até 3 segundos, e ele é o que remove o indicador de carregamento do botão na tela do usuário. Sem ack(), o botão gira para sempre.

Scopes

Peça em OAuth & Permissions apenas os scopes que o app usa. Cada scope a mais amplia o estrago que um token vazado causa, e scope desnecessário também trava a aprovação em app directory.

ScopePara que serve
chat:writeEnviar mensagens como o bot
commandsReceber slash commands
app_mentions:readReceber eventos de menção (app_mention)
channels:historyLer mensagens de canais públicos
im:historyLer mensagens diretas com o bot
reactions:writeAdicionar reações a mensagens

Veja também

DoDocs v3.7.0 · Desenvolvido por @thiagocajadev · Baseado no trabalho de pmndrs/docs · Poimandres.