Pular para o conteúdo

Publicar o bot

Long polling contra webhook, o segredo do cabeçalho, e por que deploy não existe.

Os dois modos#

Long pollingWebhook
comoo bot pergunta ao Telegramo Telegram chama o bot
exigesó saída para a internetHTTPS com certificado válido
custouma conexão aberta o tempo todonada enquanto ninguém fala
quandodesenvolvimento, e bots pequenosproduçã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#

dataforge
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#

bash
dataforge telegram doctor

Um 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 perguntaO 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#

dataforge
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.

bash
dataforge devops docker --porta=8443     # o Dockerfile
dataforge telegram doctor                # o que falta
GET <caminho>/saude                      # métricas e erros

Onde continuar#