Pular para o conteúdo

Ritmo e limites do Telegram

30 mensagens por segundo, 20 por minuto num grupo, e o 429 que bloqueia por minutos.

O Telegram corta o bot que envia rápido demais, e o corte não é uma mensagem perdida: é um 429 com retry_after que pode passar de um minuto, e nesse intervalo o bot não responde ninguém.

LimiteAproximadoO que estoura
mensagens no total~30 por segundoum aviso para todos os assinantes num laço
num mesmo grupo~20 por minutoum bot que responde toda mensagem de um grupo ativo
num mesmo chat privado~1 por segundouma resposta dividida em vinte partes

Tg.limitar segura o ritmo antes de enviar — esperar alguns milissegundos custa menos que ser bloqueado por minutos:

dataforge
adopt Arcane.Telegram as Tg

lim := Tg.limitar(50, 18)             // até 50 por segundo, e 18 por minuto por chat
inicio := time()
cycle i in range(10):
    lim.esperar(1001)
decorrido := time() - inicio
assert decorrido bigger_eq 0.15       // dez envios a 50/s: ao menos 180 ms

Aviso para todos os assinantes#

O caso que mais estoura é o broadcast: mil assinantes num laço sem pausa. Com o limitador, o laço leva o tempo que o Telegram aceita — e numa fila, ele não segura o tratador que disparou o aviso.

dataforge
adopt Arcane.Telegram as Tg

app := Tg.app("123456:TESTE-exemplo")

assinantes := [1001, 1002, 1003]
lim := Tg.limitar(25, 18)

action avisar_todos(texto):
    cycle chat in assinantes:
        lim.esperar(chat)
        app.bot.enviar(chat, texto)

t := Tg.testar(app)
avisar_todos("Manutenção às 22h.")
assert t.quantas("sendMessage") is 3