Discord.py(重写):错误处理函数中的“不正确的令牌”

Posted

技术标签:

【中文标题】Discord.py(重写):错误处理函数中的“不正确的令牌”【英文标题】:Discord.py (rewrite): Error Handling "Improper Token" In Function 【发布时间】:2019-10-30 16:01:15 【问题描述】:

我觉得我缺少解决此问题的简单方法,但我似乎找不到处理discord.errors.LoginFailure: Improper token has been passed. 错误的方法。我想要做的是运行一个函数,该函数基本上运行一个机器人,如果遇到任何错误(try:except:)并且如果它捕获到“不正确的令牌”错误然后更改设置我的代码,然后重试。

我认为正在发生的事情是 try/except 没有捕获错误并且它停止了程序(打印过程中的整个错误)。我尝试了一些快速的解决方案,比如将函数变成一个 while 语句,直到它到达程序的末尾,它会不断重复自己,但是如果没有发现错误,我就无法继续任何代码。

我的代码很乱,并且与这个大型 python 文件中之前定义的许多变量有关,所以我不会展示我的整个函数。

这里是简化版:

def code(mainText):
    mainLines = mainText.split("\n")
    # Do some stuff editing mainText
    final = "\n".join(mainLines)
    try:
        exec(final, globals())
    except Exception as e:
        print(str(e))
        # edit 'final' a bit
        exec(final, globals())

完整的错误信息:

Task exception was never retrieved
future: <Task finished coro=<Client.start() done, defined at E:\DiscordBot\lib\site-packages\discord\client.py:526> exception=LoginFailure('Improper token has been passed.')>
Traceback (most recent call last):
  File "E:\DiscordBot\lib\site-packages\discord\http.py", line 258, in static_login
    data = await self.request(Route('GET', '/users/@me'))
  File "E:\DiscordBot\lib\site-packages\discord\http.py", line 222, in request
    raise HTTPException(r, data)
discord.errors.HTTPException: 401 UNAUTHORIZED (error code: 0): 401: Unauthorized

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "E:\DiscordBot\lib\site-packages\discord\client.py", line 542, in start
    await self.login(*args, bot=bot)
  File "E:\DiscordBot\lib\site-packages\discord\client.py", line 400, in login
    await self.http.static_login(token, bot=bot)
  File "E:\DiscordBot\lib\site-packages\discord\http.py", line 262, in static_login
    raise LoginFailure('Improper token has been passed.') from exc
discord.errors.LoginFailure: Improper token has been passed.

在撰写本文时,我发现“从未检索到任务异常”这是什么重要的事情,还是通常的“不正确的令牌”错误?

谢谢你,对于我糟糕的编码习惯和缺乏使用 Stack Overflow 的经验,提前道歉。

【问题讨论】:

你为什么使用 exec?为什么不直接编写另一个函数并发送该函数以运行? 我必须使用 exec,因为 'final' 是一个从多个输入源提取的字符串,我宁愿在仍然使用 exec 的同时找到解决问题的方法。 【参考方案1】:

看到有一个 HTTPException 和一个登录失败的事实,你应该把它们都放在后面,像这样:


try:
    bot.run(BOT_TOKEN)
except discord.errors.HTTPException and discord.errors.LoginFailure as e:
    print("Login unsuccessful.")

这也将捕获 HTTPException。因为就像我说的那样,如果您阅读错误,您会看到 HTTPException LoginFailure。如果您想捕获错误并制作自定义错误消息,则需要捕获这两个。

【讨论】:

【参考方案2】:

试试这个。我自己没试过。这是我从您的问题和错误消息中可以理解的最佳答案:

#Put this at the bottom of your .py file
try:
    bot.run(BOT_TOKEN)
except discord.errors.LoginFailure as e:
    print("Login unsuccessful.")

【讨论】:

不起作用,即使排除所有异常,错误也会通过 try/except。 @Miggy 这对我有用。我还编辑了我的帖子以确保它与我刚刚尝试过的相同。您也可以使用 bot.login(token, bot=True),但它必须在函数中并且必须等待。您的错误确实提到了不正确的令牌已通过。仅当在 bot.run(token) 或 bot.login(token) 中使用无效令牌时才会引发 Is。 一定有什么东西让我的结果和你的不同。我在运行最终脚本的 exec() 中尝试了 try/except,但无论如何都会出现错误。 @Miggy,将您的整个脚本发布在记事本上,然后将其上传到可访问的位置,例如 Google Drive 或 Microsoft OneDrive。我可能需要查看完整的脚本。您可以删除您需要的任何机器人凭据。【参考方案3】:

你的令牌是字符串吗? 你是从不和谐的开发者门户网站上得到的吗?也就是说,你确定它是正确的令牌吗?

确保 BOT_TOKEN 是一个字符串并且你的令牌是有效的

【讨论】:

我认为你不明白我问的问题。我正在寻找的是一种捕获任何登录失败错误的方法,而不是修复它们。

以上是关于Discord.py(重写):错误处理函数中的“不正确的令牌”的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 重写 get_member() 函数,为除 bot 之外的所有用户返回 None

如何让机器人在 discord.py 重写中为频道设置慢速模式?

禁止命令 discord.py 的问题(重写分支)

Discord Bot 响应短语(Discord.py 重写)

试图获取公会中的所有成员(discord.py 重写)

Discord.py(重写)静音命令总是返回相同的响应