在repl.it上运行discord.py机器人时,如何解决"429:Too Many Requests"错误?

6

我的代码(见下文)一直运行得很好,但突然出现了以下错误,无法消除:

"http.py", line 293, in static_login
    data = await self.request(Route('GET', '/users/@me')
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/http.py", line 209, in request
    raise HTTPException(r, data)
discord.errors.HTTPException: 429 Too Many Requests (error code: 0): "

我搜索了这个错误,发现有些人是在多台服务器上运行强大的程序,或者在单台服务器上反复运行相同的代码。但是,我只在一台服务器上运行它,而且代码非常简单。

以下是参考代码(它在 repl.it 上运行)(os.getenv 是用来隐藏机器人令牌的):

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
  print ('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return
  
  if message.content.startswith('$hello'):
    await message.channel.send('Hello!')

client.run(os.getenv('TOKEN'))
3个回答

6
除了避免错误外,有一种方法可以解决它。如果在replit控制台中出现discord.errors.HTTPException:429,只需使用shell中的命令kill 1。此命令完全退出脚本,当您再次点击运行时,它将从不同的IP地址运行,绕过Discord速率限制。
如果该错误经常发生,则可能会带来麻烦。自动解决方案是拥有另一个名为“restarter.py”的文件,其中包含以下代码:
from time import sleep
from os import system
sleep(7)
system("python main.py")

然后在你的主脚本中:

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
  print ('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return
  
  if message.content.startswith('$hello'):
    await message.channel.send('Hello!')

try:
    client.run(os.getenv('TOKEN'))
except discord.errors.HTTPException:
    print("\n\n\nBLOCKED BY RATE LIMITS\nRESTARTING NOW\n\n\n")
    system("python restarter.py")
    system('kill 1')

5
在重新启动之前,应该检查HTTPException是否为429。你不希望因为403400而不得不重新启动机器人。 - TheFungusAmongUs

0

Cohen的解决方案对我来说效果还不错。然而,有时候机器人陷入了一次又一次尝试重新启动并不断崩溃的循环中。直到Cloudflare禁令到期(1小时)后才解决了这个问题。我真的无法弄清楚为什么或发生了什么,但我找到了一个解决方案。

我有一个main.py文件,它导入了我的bot.py文件,其中包含了所有机器人代码。runbot函数只是bot.run(token)。

import bot.bot as bot
from bot.keep_alive import keep_alive
import os
import discord

while __name__ == '__main__':
  try:
    keep_alive()
    bot.runbot(os.environ['token'])
  except discord.errors.HTTPException as e:
    print(e)
    print("\n\n\nBLOCKED BY RATE LIMITS\nRESTARTING NOW\n\n\n")
    os.system('kill 1')

不使用restarter.py文件,我只是使用一个while循环。这样可以确保一切按照正确的顺序执行。

-2

这个完美运行。如果它继续发出被速率限制的垃圾邮件,那么只需再次运行kill 1,它就会正常。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - user11717481
请不要将“谢谢”作为答案。一旦您拥有足够的声望,您就可以投票支持有用的问题和答案。- 来自审核 - claudius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接