discord.py中如何将公会ID转为可调用text_channels属性的对象
核心错误点
你的代码存在两个直接导致报错的问题:
input()返回值是字符串类型,discord.py所有依赖ID查询的方法都要求传入整数类型ID,且你当前存储的只是纯ID值,并非Guild类实例,自然无法访问.text_channels属性。Guild.text_channels是Guild实例自带的可迭代属性,不需要用with上下文管理器包裹,你的写法属于语法误用。
正确实现步骤
- 将输入的ID字符串强转为整数,增加异常捕获避免输入非数字内容导致崩溃
- 通过Bot实例的
get_guild()方法传入整数ID,从本地缓存获取对应Guild对象;若缓存未命中,可使用协程方法fetch_guild()主动向Discord接口拉取数据 - 判空校验Guild对象是否存在(ID错误、Bot未加入目标公会时会返回None/抛出NotFound异常)
- 直接迭代Guild对象的
text_channels属性即可拿到所有文本频道
修正后代码
# 此处bot为你初始化的discord.py Bot/Client实例 async def guildNuke(): raw_id = input("Nuke guild ID: ") # 转换ID为整数 try: guild_id = int(raw_id) except ValueError: print("错误:请输入有效的数字ID") return # 从缓存获取公会对象 nukeguild = bot.get_guild(guild_id) # 缓存未命中时主动拉取 if not nukeguild: try: nukeguild = await bot.fetch_guild(guild_id) except discord.NotFound: print("错误:未找到对应公会,请确认ID正确且Bot已加入该公会") return # 遍历所有文本频道 for channel in nukeguild.text_channels: print(channel.name, channel.id)
补充说明
没有更简便的绕开步骤,所有对公会资源的操作都必须先拿到合法的Guild实例,上述流程是discord.py操作公会资源的标准写法,不存在省略步骤的可能。
内容的提问来源于stack exchange,提问作者wsheep
相关产品推荐
相关产品推荐

