Discord-py - 使用 Guild ID 作为 Guild 对象

时间:2021-06-23 08:43:20

标签: python-requests discord discord.py

我一直试图在控制台中打印出只有公会 ID 的服务器的所有频道 ID;我一直在阅读文档以实现它: https://discordpy.readthedocs.io/en/rewrite/api.html#discord.Guild,这就是我目前所做的。

<router-outlet></router-outlet>

但是一旦我运行命令,我就会收到这个错误:

@client.command()
async def getchannels(ctx, id):
    a = client.get_guild(id)
    for c in a.channels():
        print(c.id)

2 个答案:

答案 0 :(得分:1)

如果您查看 client.get_guild 的文档,它指出如果无法找到公会,它将返回 None,这就是此处发生的情况以及导致您出错的原因。因为 None 正在被返回,而您正试图访问 channels 返回的内容,它会抛出一个错误,因为 None 没有名为 channels 的属性。

get_guild 可以返回 None 的原因是因为它只检查公会的内部缓存,实际上并没有进行 API 调用。因此,如果公会不在缓存中,它将返回 None。解决方案是使用 client.fetch_guild 代替。 get_guildfetch_guild 之间的区别在于 fetch_guild 会向 API 发送请求,而不是查看内部缓存。要记住的另一件事是您可能无法访问公会,在这种情况下将引发 Forbidden 异常。另一个问题是您在应该做 guild.channels() 的时候却在做 guild.channels。 channel 属性不是函数,因此您无需使用两个括号调用它。 最后,fetch_guild 是一个异步函数,这意味着您需要 await 它。

这是一些示例代码:

from discord import Forbidden

@client.command()
async def get_channels(ctx, id):
    try:
        guild = await client.get_guild(id)
    except Forbidden:
        await ctx.send("I do not have access to that guild or it doesn't exist.")
    else:
        for channel in guild.channels:
            print(channel.id)

答案 1 :(得分:0)

您刚刚错过了代码中的 for guild in client.guilds:。这引发了异常。此外,您不必在 for c in a.channels(): 中使用 ()。另外,我建议使用 await client.fetch_guild(id) 而不是 client.get_guild(id),因为它只使用其缓存。

@client.command()
async def getchannels(ctx, id):
    guild = await client.fetch_guild(id)
    for guild in client.guilds:
        for channel in guild.channels:
            print(channel.id)