Repository navigation
chatbot gateway
Home > Chatbot > Gateways REST
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Nível: intermediário
Em uma frase: TRALChatGateway liga o robô a um gateway REST de
WhatsApp não oficial (Evolution API, WPPConnect Server, Z-API) ou a qualquer outro
serviço que mande e receba mensagens por JSON, configurado no Object Inspector.
Você vai precisar: o pacote RALModuleChatPackage, um cliente RAL (motor de
cliente ligado ao programa), o gateway rodando e um TRALChatWebhookModule no servidor
para receber.
Warning
Os gateways de WhatsApp não oficiais violam os termos do WhatsApp: o número
pode ser banido, mais ainda com envio em massa. Use um número reserva. Por isso os
limites de envio vêm baixos (1 mensagem por segundo, 1 a cada 3 segundos por
conversa); aumente por sua conta e risco em Rates.
Profile preenche endereços, cabeçalhos e campos do gateway escolhido:
| perfil | gateway | autenticação do envio | prova do webhook |
|---|---|---|---|
gpEvolution |
Evolution API v2 | cabeçalho apikey
|
segredo num cabeçalho (configure nos headers do webhook da instância) |
gpWPPConnect |
WPPConnect Server |
Bearer com o token da sessão |
nenhuma: só por lista de IPs (AllowedIPs) |
gpZAPI |
Z-API | Client-Token |
Client-Token |
gpCustom |
qualquer outro | o que você configurar | o que você configurar |
FGateway := TRALChatGateway.Create(Self);
FGateway.Profile := gpEvolution;
FGateway.BaseUrl := 'http://localhost:8080';
FGateway.Instance := 'minha-instancia';
FGateway.TokenSource := tsEnvironment; // a apikey da instância
FGateway.TokenName := 'EVOLUTION_APIKEY';
FGateway.Verification.Secret := GetEnvironmentVariable('EVOLUTION_WEBHOOK_SECRET');
FGateway.Bot := FBot;
FBot.Channels.Add.Channel := FGateway;No gateway, aponte o webhook para a rota do canal no TRALChatWebhookModule
(/gateway, ou o ChannelName que você der).
Verification.Mode:
-
gvSecret: um segredo num cabeçalho (HeaderName), comparado em tempo constante. -
gvHMAC: assinatura HMAC do corpo (SHA-1, SHA-256 ou SHA-512, em hex ou base64, comPrefixe, se o gateway mandar, o horário emTimestampHeadereTemplate). -
gvIPList: só os endereços deAllowedIPs(IP exato ou faixa IPv410.0.0.0/8); atrás de um proxy,IPHeader(X-Forwarded-For). -
gvNone: aceita tudo e avisa noOnLoga cada pedido. Só para testes.
Sem o segredo ou a lista preenchidos, todo webhook é recusado (401): um gateway mal configurado não deixa qualquer um falar pelo seu robô.
Tudo que o perfil preenche fica editável:
-
Outgoing: um endereço por tipo de mensagem (Text,Image,Document,Audio,Video,Location,Contact,Buttons,List,Typing,Edit,Delete), cada um comUrl,MethodeBody. NoBody, marcadores entre chaves viram valores JSON já escapados:{chat},{text},{caption},{media},{mime},{filename},{latitude},{longitude},{buttons},{rows}... NaUrl,{instance}e os demais entram codificados. Um tipo sem endereço vira texto peloFallbackdo robô. -
AuthHeader/AuthValue(com{token}),Headersextras. -
Incoming: os caminhos no JSON do webhook (TextPath,ChatIdPath,EventIdPath,SenderNamePath,MediaUrlPath...), vários separados por ponto e vírgula (vale o primeiro que existir);KindRulesdiz o tipo da mensagem por regrascaminho|valor|tipo;EventPath/EventValuesfiltram os eventos que interessam;FromMePathignora o que o próprio número mandou. - Mídia que chega por URL só é baixada do endereço do gateway e de
MediaHosts, atéMaxDownloadSize; o token nunca vai para outro endereço.
Os perfis foram montados a partir da documentação pública de cada gateway; os envios
de texto, mídia, localização e lista são os mais seguros. Botões, edição e remoção
mudam entre versões dos gateways: se um deles falhar, ajuste o Url/Body daquele
tipo em Outgoing.
| sintoma | causa | o que fazer |
|---|---|---|
| webhook responde 401 | o gateway não manda o segredo, ou o IP não está na lista | configure o cabeçalho no gateway, ou use gvIPList
|
| aviso "sem verificação" no log a cada pedido | gvNone |
só em teste; em produção, segredo ou lista de IPs |
| envio dá 401/403 | token ou Instance errado |
confira a apikey/token da instância |
| número banido | envio em massa por gateway não oficial | API oficial (WhatsApp Cloud) para volume |
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar