Discord Bot Client.User 在 Python 中转换为 Discord.Utils 时出错

Posted

技术标签:

【中文标题】Discord Bot Client.User 在 Python 中转换为 Discord.Utils 时出错【英文标题】:Discord Bot Client.User Error Converting to Discord.Utils in Python 【发布时间】:2020-11-26 06:32:14 【问题描述】:

python 3.7.3 不和谐.py 1.3.4 树莓派 4

在一切正常之后,我一开始就卡住了。

我从头开始。当我使用 for 循环后跟 print(f'client.user 时,我没有任何问题,机器人用户名会打印到终端。当我放弃循环并使用guild = discord.utils.get(client.guilds, name=GUILD) 代码时,我在终端中收到以下错误。

忽略 on_ready 中的异常 回溯(最近一次通话最后): _run_event 中的文件“/home/pi/.local/lib/python3.7/site-packages/discord/client.py”,第 312 行 等待 coro(*args, **kwargs) 文件“/home/pi/TackleBot/bot2.py”,第 27 行,on_ready f'client.user 连接到以下公会:\n' AttributeError: 'NoneType' 对象没有属性 'name'

如果我在guild = discord.utils.get 命令之后直接添加print(client.user) 命令,它将在那里打印用户名,但仍然在下面出错。我花了几个小时梳理文档,这就是我现在所处的位置。还是一头雾水。如果我注释掉 for 循环,我会收到错误消息。如果我注释掉 discord 实用程序命令,它工作正常。永远不要使用 print(f'client.user 块更改任何内容。

我边走边学,非常感谢任何帮助或建议。谢谢!

    import os
    
    import discord

    from dotenv import load_dotenv

    load_dotenv()
    TOKEN = os.getenv('DISCORD_TOKEN')
    GUILD = os.getenv('DISCORD_GUILD')
    
    client = discord.Client()

    @client.event
    async def on_ready():
        guild = discord.utils.get(client.guilds, name=GUILD)
        if guild is not None:
            channel = discord.utils.get(guild.text_channels, name=GUILD)
    # when the lines 18-20 are used, line 26 throws an object type error 'none'
    # when lines 23-25 are used, there is no error
    #    for guild in client.guilds:
    #        if guild.name == GUILD:
    #            break
        print(
            f'client.user is connected to the following guild:\n'
            f'guild.name(id: guild.id)'
        )
        
        members = '\n - '.join([member.name for member in guild.members])
        print(f'guild.name:\n - members')
    
    client.run(TOKEN)

【问题讨论】:

请在收到错误时发布完整的回溯。 你不能恢复你的提交(例如使用git bisect)来找到你破坏代码的地方吗?如果您甚至不使用 git 之类的东西,我强烈建议您将其列入您的学习清单。另外,作为这里的新用户,请使用tour 并阅读How to Ask。 抱歉,我已经添加了完整的回溯。 我现在也在学习 git,对于这个问题,它与第一个代码块是隔离的,我可以通过不使用 'guild = discord.utils.get' 行让它消失。试图理解为什么会出错,这让我发疯了。 【参考方案1】:

如果我理解正确,您是在尝试先在 on_ready 函数中打印公会信息,对吧?

你可以这样做:

client = discord.Client()
@client.event
async def on_ready():
     for guild in client.guilds:
         print(
          f'client.user is connected to the following guild:\n'
          f'guild.name(id: guild.id)'
         )
     members = '\n - '.join([member.name for member in guild.members])
     print(f'Guild Members:\n - members')

最后:

client.run(TOKEN)

【讨论】:

谢谢你,Costa,是的,目的是确保机器人连接到正确的公会,并通过在终端打印机器人用户名和公会信息来确认。为了“清理”我的代码,我想用不和谐的实用函数 get 替换 for 循环。出于某种原因,当我这样做时,它会在 print client.user 代码行出错。啊。再次感谢您! 原来如此,我只是回到使用@client.event 方法,而不是作为新手尝试使用它 lol 再次感谢您的帮助。

以上是关于Discord Bot Client.User 在 Python 中转换为 Discord.Utils 时出错的主要内容,如果未能解决你的问题,请参考以下文章

discord.py bot 看不到成员

类型错误:不是 NODE JS DIScord Bot 中的函数 [关闭]

client.get_user() 在 discord.py 中不起作用

如何使用 Discord.py 重写更改机器人用户名/头像?

我如何获得由 discord bot maker 创建的 Discord Bot 在 Heroku 上工作

@bot.event 在一个 cog discord.py