Discord bot创建单次唯一邀请链接时获取guild出现IndexError问题
错误核心原因
client.guilds 是Python原生列表,存储机器人已加入的所有服务器对象,你遇到的两个报错都源于对这个列表的错误使用:
- 直接传服务器ID作为列表下标:列表只支持从0开始的数字索引,你传入的服务器ID远大于列表长度,所以触发
IndexError: list index out of range - 调用列表不存在的
get()方法:Python原生列表没有get方法,所以触发AttributeError
正确获取指定服务器的写法
方法1:使用discord内置工具函数筛选
import discord token = 'my discord bot token' # 注意先配置Intents,新版discord.py必须开启对应权限才能获取服务器列表 intents = discord.Intents.default() intents.guilds = True client = discord.Client(intents=intents) number_of_links = input('How many links do you want to create? ') @client.event async def on_ready(): # 按ID筛选服务器 g = discord.utils.get(client.guilds, id=809743502665056306) if not g: print("未找到对应服务器,请确认机器人已加入该服务器,且Intents配置正确") exit() c = g.get_channel(809803698212700190) # 后续逻辑
方法2:手动遍历列表匹配
g = None for guild in client.guilds: if guild.id == 809743502665056306: g = guild break
附加优化建议
- 你创建邀请的代码可以简化,不需要调用
discord.abc.GuildChannel的静态方法,直接用频道对象的实例方法即可:
# 原写法 i = await discord.abc.GuildChannel.create_invite(c, max_uses=1, max_age=0, unique=True) # 简化后写法 i = await c.create_invite(max_uses=1, max_age=0, unique=True)
- 你当前的循环逻辑存在冗余,while循环内直接break,完全可以去掉while,直接生成指定数量的邀请即可:
invites = [] for _ in range(int(number_of_links)): new_invite = await c.create_invite(max_uses=1, max_age=0, unique=True) invites.append(new_invite) print(f"已生成邀请:{new_invite.url}")
- 请确认你在Discord开发者平台的Bot管理页面,已经开启了
Server Members Intent和Guilds Intent权限,否则机器人无法正常获取服务器列表。
内容的提问来源于stack exchange,提问作者S..
相关产品推荐
相关产品推荐

