我一直试图在控制台中打印出只有公会 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)
答案 0 :(得分:1)
如果您查看 client.get_guild
的文档,它指出如果无法找到公会,它将返回 None
,这就是此处发生的情况以及导致您出错的原因。因为 None
正在被返回,而您正试图访问 channels
返回的内容,它会抛出一个错误,因为 None
没有名为 channels
的属性。
get_guild
可以返回 None
的原因是因为它只检查公会的内部缓存,实际上并没有进行 API 调用。因此,如果公会不在缓存中,它将返回 None
。解决方案是使用 client.fetch_guild
代替。 get_guild
和 fetch_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)