Publicar o bot
Long polling contra webhook, o segredo do cabeçalho, e por que deploy não existe.
Os dois modos#
| Long polling | Webhook | |
|---|---|---|
| como | o bot pergunta ao Telegram | o Telegram chama o bot |
| exige | só saída para a internet | HTTPS com certificado válido |
| custo | uma conexão aberta o tempo todo | nada enquanto ninguém fala |
| quando | desenvolvimento, e bots pequenos | produção |
Os dois passam pelo mesmo caminho por dentro: atender recebe um update e não sabe de onde ele veio. Sem isso, um bot testado em polling quebra ao virar webhook — que é justamente quando ele vai para produção.
Webhook#
app.publicar("https://bot.seudominio.dev",
porta := 8443,
segredo := Tg.segredo_do_ambiente("WEBHOOK_SEGREDO"))Ou em dois passos, quando o servidor já existe: dataforge telegram webhook https://bot.seudominio.dev registra, e app.montar("/telegram", segredo) devolve um app Kiln para você montar onde quiser.
O webhook responde 200 sempre, mesmo quando o tratador falha: o Telegram reenvia o update quando a resposta demora ou dá erro, e isso faria o mesmo comando rodar três vezes.
Quando o bot fica calado#
dataforge telegram doctorUm bot que não responde não dá erro — ele simplesmente fica calado, e as causas são sempre as mesmas:
| O que o doctor pergunta | O que costuma ser |
|---|---|
| o Telegram aceita o token? | token revogado, ou com espaço em volta |
| há webhook registrado? | ele e o polling não convivem — o getUpdates responde 409 para sempre |
| o bot lê tudo em grupo? | a privacidade vem ligada: ele só vê /comandos e menções |
| o bot entra em grupos? | /setjoingroups no @BotFather |
| quantos updates estão na fila? | o servidor do webhook não está respondendo 200 |
Ritmo#
app := Tg.app(Tg.segredo_do_ambiente(),
limitador := Tg.limitar(por_segundo := 25,
por_chat_por_minuto := 18))O Telegram corta acima de ~30 mensagens por segundo, e num grupo o limite é de cerca de 20 por minuto. Segurar aqui custa milissegundos; ser bloqueado custa minutos — e o retry_after que ele devolve é obedecido ao pé da letra, porque repetir antes dele só gasta a cota.
`deploy` não existe — de propósito#
Registrar o webhook é do bot, e isso existe. Onde essa URL vai morar — Docker, systemd, uma PaaS, um túnel — é uma opinião sobre infraestrutura que o projeto não tem, pelo mesmo motivo que dataforge vitrine deploy não existe.
dataforge devops docker --porta=8443 # o Dockerfile
dataforge telegram doctor # o que falta
GET <caminho>/saude # métricas e erros