使用 discord.py 忽略 python3 中的机器人生成的错误

Posted

技术标签:

【中文标题】使用 discord.py 忽略 python3 中的机器人生成的错误【英文标题】:Ignore an error generated by a bot in python3 with discord.py 【发布时间】:2020-11-17 23:57:32 【问题描述】:

感谢 discord.py 插件,我在 python3 中开发了一个小型机器人,它必须向 Discord 服务器中的所有用户发送私人消息。

@bot.event
async def on_message(message):
    if message.content.startswith('!mmb'):
        channel = message.channel
        x = message.guild.members
        text = 'Test'
        for member in x:
            print(member)
            if member.bot == "True":
                print(f"Message non envoyé à member.name.")
            else :
                await member.send(text)
                print(f"Messages envoyé à member.name")
        print("Tous les messages ont été envoyés.")

所以我创建了服务器上所有用户的列表,然后我创建了一个循环,通过删除机器人将所述消息发送给所有用户。 问题是在这个用户列表中,有些人在服务器上禁用了私人消息,因此机器人无法发送消息并产生错误:

Ignoring exception in on_message
Traceback (most recent call last):
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\client.py", line 312, in _run_event
    await coro(*args, **kwargs)
  File "./main.py", line 31, in on_message
    await member.send(text)
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\abc.py", line 856, in send
    data = await state.http.send_message(channel.id, content, tts=tts, embed=embed, nonce=nonce)
  File "C:\Users\antoi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\http.py", line 221, in request
    raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this user

因此,尽管出现错误,我希望机器人继续列表。 因此,我们可以找到该参数并使用条件删除已禁用私人消息的用户,或者忽略它产生的错误并继续执行循环。

不用告诉你,我自己没有找到解决方案。 提前感谢您的所有回答。

PS = 我是比利时人(会说法语),所以上面的英语不应该是最佳的,我很抱歉。 谢谢谷歌翻译(=

【问题讨论】:

discordpy.readthedocs.io/en/latest/… 它引发了Forbidden,你可以抓住它。也可以使用discord.DMChannel,抢先查看是否有权限。 【参考方案1】:

在这里使用 try/catch 可以解决您的问题。正如有人在评论中指出的那样,它引发了一个 Forbidden 错误,所以类似这样的东西会起作用,它会捕获错误并在 DM 被禁用时继续前进:

try:
    await member.send(text)
    print(f"Messages envoyé à member.name")
except discord.Forbidden:
    print("User has DMs disabled.")

请注意,它也可能引发 HTTPException 错误,因此包含它可能也是一个好主意。

【讨论】:

以上是关于使用 discord.py 忽略 python3 中的机器人生成的错误的主要内容,如果未能解决你的问题,请参考以下文章

Bash:Python3:找不到命令(Windows,discord.py)

如何使用 discord.py 让 discord bot ping 用户 [关闭]

如何让我的机器人忽略来自具有特定角色的人的消息? (不和谐.py)

Python 3.8.1 Discord.py 重写反应

找不到 discord.py 命令

使用 Discord.py,有没有办法读取嵌入的消息?