Corrigir Erro de Limite de Taxa 429 do Bot do Discord em Operações em Massa
🔍 WiseChecker

Corrigir Erro de Limite de Taxa 429 do Bot do Discord em Operações em Massa

Quando seu bot do Discord envia ou exclui muitas mensagens rapidamente, você pode ver um erro 429: “You are being rate limited.” Isso acontece porque a API do Discord impõe limites sobre quantas requisições seu bot pode fazer em uma janela de tempo. Operações em massa, como limpar um canal inteiro ou enviar anúncios para centenas de usuários, frequentemente disparam esse limite. Este artigo explica por que o erro 429 ocorre e fornece estratégias de código específicas para evitá-lo.

Principais Conclusões: Evite Erros 429 do Bot do Discord em Operações em Massa

  • Cabeçalhos de limite de taxa (X-RateLimit-Remaining, Retry-After): Verifique esses cabeçalhos após cada chamada de API para saber quando pausar.
  • Manipuladores internos do discord.py ou discord.js: Use recursos da biblioteca que respeitam automaticamente os limites de taxa e repetem após atraso.
  • Processamento em lote com asyncio.sleep(): Insira um pequeno atraso entre cada requisição para permanecer abaixo do limite por rota.

ADVERTISEMENT

Por que o Discord Retorna um Erro de Limite de Taxa 429

Os limites de taxa da API do Discord protegem seus servidores de serem sobrecarregados por muitas requisições. Cada endpoint, como enviar uma mensagem ou excluir uma mensagem, tem um limite específico medido em requisições por minuto. Quando seu bot excede esse limite, o Discord retorna o status HTTP 429 junto com um cabeçalho Retry-After que informa ao seu bot quanto tempo esperar antes de tentar novamente. Operações em massa, como excluir 100 mensagens em um canal ou enviar mensagens diretas para 500 usuários, podem facilmente exceder esses limites se você enviar requisições consecutivas sem atrasos.

O limite de taxa é calculado por rota. Por exemplo, excluir mensagens em um único canal usa a rota /channels/{channel.id}/messages/bulk-delete. Essa rota permite um número limitado de requisições por minuto. Se seu bot enviar 10 requisições de exclusão em rápida sucessão, a 11ª requisição dispara um erro 429. O mesmo se aplica ao enviar mensagens em um servidor ou mensagens diretas para vários usuários. Entender o limite por rota é fundamental para projetar a lógica do seu bot.

Cabeçalhos de Limite de Taxa que Você Deve Ler

Toda resposta da API inclui estes cabeçalhos que informam o status atual do seu limite de taxa:

  • X-RateLimit-Limit: Total de requisições permitidas por janela (geralmente 5 ou 10 por segundo para a maioria dos endpoints).
  • X-RateLimit-Remaining: Requisições restantes na janela atual.
  • X-RateLimit-Reset: Timestamp Unix de quando a janela é redefinida.
  • Retry-After: Segundos que seu bot deve esperar antes de tentar novamente uma requisição limitada.

O código do seu bot deve ler esses cabeçalhos e pausar conforme necessário. Ignorá-los leva a erros 429 repetidos e possíveis banimentos temporários da API do Discord.

Passos para Corrigir o Erro de Limite de Taxa 429 do Bot do Discord em Operações em Massa

Método 1: Usar o Tratamento de Limite de Taxa Interno da Biblioteca

Tanto discord.py quanto discord.js possuem mecanismos internos que respeitam automaticamente os limites de taxa. Em muitos casos, simplesmente atualizar sua biblioteca para a versão mais recente resolve o problema. No entanto, se você estiver fazendo requisições HTTP brutas sem usar essas bibliotecas, precisará implementar o tratamento de limite de taxa manualmente.

  1. Verifique a versão da sua biblioteca
    Para discord.py, execute pip show discord.py e garanta a versão 2.0 ou superior. Para discord.js, execute npm list discord.js e busque a versão 14 ou superior.
  2. Ative o tratamento de limite de taxa da biblioteca
    No discord.py, o cliente padrão lida com limites de taxa automaticamente. No discord.js, o Client padrão faz o mesmo. Nenhum código extra é necessário.
  3. Teste com um lote pequeno primeiro
    Envie ou exclua 5 mensagens e confirme que nenhum erro 429 aparece. Aumente o tamanho do lote gradualmente.

Método 2: Implementar Lógica de Limite de Taxa Personalizada

Se você estiver usando um cliente HTTP personalizado ou precisar de mais controle, implemente um manipulador de limite de taxa que leia os cabeçalhos da resposta.

  1. Capture a resposta após cada chamada de API
    Leia o código de status e os cabeçalhos. Se o status for 429, extraia o valor Retry-After.
  2. Aguarde pela duração do Retry-After
    Use asyncio.sleep(retry_after) em Python ou setTimeout() em Node.js. Não envie nenhuma requisição durante esse período.
  3. Tente novamente a requisição falha
    Após a espera, reenvie a mesma requisição. Repita até obter sucesso ou até atingir um número máximo de tentativas.
  4. Adicione um atraso entre cada requisição
    Mesmo quando não estiver limitado, insira um atraso de 1 segundo entre operações em massa. Isso mantém você bem abaixo do limite.

Método 3: Usar Processamento em Lote com Atrasos

Para operações de mensagens em massa, processe as mensagens em blocos com uma pausa entre cada bloco.

  1. Divida a lista total de mensagens em lotes
    Para excluir mensagens, use o endpoint de exclusão em massa que aceita até 100 IDs de mensagens por requisição. Para enviar mensagens, agrupe de 10 a 20 mensagens por grupo.
  2. Envie um lote e depois aguarde
    Após enviar um lote, chame asyncio.sleep(2) (Python) ou setTimeout() (Node.js) por 2 segundos antes de enviar o próximo lote.
  3. Monitore o limite de taxa restante
    Verifique X-RateLimit-Remaining após cada lote. Se cair para 1, aumente o tempo de espera para 5 segundos.
  4. Registre todos os erros 429
    Escreva os detalhes do erro em um arquivo de log. Isso ajuda a ajustar tamanhos de lote e atrasos para execuções futuras.

ADVERTISEMENT

Se o Discord Ainda Retornar 429 Após a Correção Principal

Bot Limitado pelo Limite Global de Taxa

O Discord também impõe um limite global de taxa que se aplica a todas as requisições do seu bot, independentemente do endpoint. Se seu bot exceder 50 requisições por segundo em todas as rotas, o Discord retorna um 429 global. Para corrigir isso, reduza a frequência geral de requisições. Use um sistema de fila que limite o total de requisições a 45 por segundo.

Limite de Taxa Não Diminui Após Esperar

Às vezes, o valor Retry-After é muito longo, como 60 segundos ou mais. Isso indica que seu bot foi temporariamente banido de fazer requisições para essa rota específica. Não envie nenhuma requisição para essa rota durante toda a duração. Continuar tentando cedo prolongará o banimento.

Bot Usa Múltiplos Tokens para o Mesmo Servidor

Se seu bot usa múltiplos tokens (contas de usuário ou tokens de bot separados) para realizar operações no mesmo servidor, cada token tem seu próprio limite de taxa. No entanto, o Discord pode aplicar um limite combinado se as requisições se originarem do mesmo IP. Use um único token para operações em massa para evitar confusão.

Métodos de Operação de Mensagens em Massa: Exclusão em Massa vs Exclusão Individual

Item Endpoint de Exclusão em Massa Endpoint de Exclusão Individual
Descrição Exclui até 100 mensagens em uma única chamada de API Exclui uma mensagem por chamada de API
Limite de taxa por rota 5 requisições a cada 5 segundos 10 requisições por segundo
Máximo de mensagens por minuto 500 (5 lotes × 100 mensagens) 600 (10 requisições × 60 segundos)
Melhor caso de uso Limpar o histórico completo do canal Remover algumas mensagens específicas
Risco de 429 Menor porque menos requisições são feitas Maior devido a muitas requisições rápidas

Para operações em massa, sempre prefira o endpoint de exclusão em massa quando disponível. Ele reduz o número de chamadas de API e diminui a chance de atingir o limite de taxa. Para enviar mensagens, agrupe os usuários em lotes e use um atraso entre cada lote.

Agora você pode identificar por que seu bot do Discord recebe um erro 429 e aplicar a correção adequada. Comece atualizando sua biblioteca para a versão mais recente. Se ainda vir erros, implemente um manipulador de limite de taxa personalizado que leia os cabeçalhos Retry-After. Para operações de mensagens em massa, sempre use processamento em lote com atrasos. Uma dica concreta: defina um limite global de requisições de 45 por segundo no código do seu bot para ficar com segurança abaixo do limite global do Discord.

ADVERTISEMENT