Repository navigation
chatbot telegram
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Nível: intermediário
Em uma frase: TRALChatTelegram é o canal do Telegram do chatbot: recebe
as mensagens por webhook ou perguntando ao Telegram (polling) e envia texto, botões,
teclados, mídia, localização e enquetes pela Bot API.
Você vai precisar: os pacotes RALModuleChatPackage e RALModuleChatTelegramPackage,
um cliente RAL com HTTPS (a OpenSSL ao lado do executável, ou um motor com TLS próprio)
e o token de um robô do Telegram.
- No Telegram, abra a conversa com @BotFather e mande
/newbot. - Escolha o nome e o usuário do robô (termina em
bot). - O BotFather responde com o token (
123456:ABC...). Ele dá controle total do robô: guarde fora do código.
FTelegram.TokenSource := tsEnvironment;
FTelegram.TokenName := 'TELEGRAM_TOKEN';O verbo "Testar token" (clique direito no componente) pergunta ao Telegram de quem é o token e mostra o usuário do robô.
Polling é o jeito mais simples: o canal pergunta ao Telegram numa thread própria. Não precisa de servidor nem de endereço público; serve para desenvolver, para um robô atrás de firewall e para robôs pequenos.
FTelegram.ReceiveMode := crmPolling;
FTelegram.Active := True;Webhook é o Telegram chamando o seu servidor a cada mensagem: menos espera, menos
tráfego, e serve vários robôs no mesmo servidor. Precisa de um endereço HTTPS público
(portas 443, 80, 88 ou 8443) e de um TRALChatWebhookModule (chatbot):
FTelegram.ReceiveMode := crmWebhook;
FTelegram.SecretToken := GetEnvironmentVariable('TELEGRAM_SECRET');Registre o endereço uma vez, pelo verbo "Registrar webhook" ou no código com
RegisterWebhook('https://meu.dominio/telegram', vRelatorio); RemoveWebhook volta ao
polling. O Telegram manda o SecretToken num cabeçalho em cada chamada e o módulo
recusa (401) o que vier sem ele. Sem SecretToken, todo webhook é recusado.
Com crmAuto o canal decide ao ativar: webhook se houver um registrado no Telegram,
polling se não houver.
| recurso | como |
|---|---|
| texto formatado |
TextMode: MarkdownV2 (padrão) ou HTML; o RAL escapa o que precisa |
| botões na mensagem |
AddButton; ButtonsPerRow por linha; AutoAnswerCallback para o relógio do botão parar na hora |
| teclado de respostas |
AddKeyboardRow; ids especiais cRALChatTelegramRequestContact e cRALChatTelegramRequestLocation pedem o telefone e a localização; RALChatTelegramRemoveKeyboard tira o teclado |
| mídia |
Media na mensagem que sai (arquivo, stream ou URL); na que chega, LoadMedia baixa até MaxDownloadSize (a Bot API vai até 20 MB) |
| editar, apagar, "digitando" |
Edit, Delete, SendTyping do robô |
| grupos | um comando /start@outrobot é ignorado se BotUsername for o seu |
| o que pedir ao Telegram |
AllowedUpdates (por exemplo ["message","callback_query"]) |
Os limites do Telegram (cerca de 30 mensagens por segundo no total e 1 por segundo por
conversa) já vêm em Rates; uma resposta 429 do Telegram faz a fila esperar o tempo
que ele pediu.
| sintoma | causa | o que fazer |
|---|---|---|
| "Testar token" diz 401 | token errado ou revogado | peça outro ao BotFather (/token) |
| polling não recebe nada | há um webhook registrado | "Remover webhook", ou crmAuto
|
| webhook não chega | endereço sem HTTPS válido ou porta fora de 443/80/88/8443 | um certificado do domínio (certificado automático) |
| webhook responde 401 |
SecretToken diferente do registrado |
registre o webhook de novo |
texto com _ ou * sai quebrado |
MarkdownV2 com marcação escrita à mão |
Reply(..., AMarkup = False) deixa o RAL escapar, ou TextMode HTML |
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