Discord.py角色检查命令报错求助:无法输出无指定角色的服务器成员
解决Discord.py命令中的AttributeError问题
先直接说你遇到的核心问题:AttributeError: can't set attribute 完全是由代码里这一行错误导致的:
for guild.members in range(10):
guild.members 是Discord.py提供的只读属性,用来获取服务器的成员集合,你不能把它当作循环变量来赋值,这就像你试图修改一个固定值一样,自然会触发属性错误。
另外你的代码逻辑也偏离了需求:原本是要找出没有Free Customers角色的成员,但你却在遍历成员后,重复10次发送整个服务器的成员列表,这显然不是你想要的结果。
修正后的完整代码
@client.command() @commands.has_permissions(ban_members=True) async def check(ctx): guild = ctx.guild # 先获取目标角色,避免后续重复查找 target_role = discord.utils.get(guild.roles, name='Free Customers') # 先检查角色是否存在,防止后续报错 if not target_role: await ctx.send("服务器里找不到名为'Free Customers'的角色,请检查角色名称拼写!") return # 用列表推导式收集所有没有该角色的成员,高效又清晰 members_without_role = [member for member in guild.members if target_role not in member.roles] # 处理空结果的情况 if not members_without_role: await ctx.send("所有成员都已经拥有'Free Customers'角色啦!") return # 格式化成员列表,显示昵称和ID方便识别 member_list = "\n".join([f"- {member.display_name} (ID: {member.id})" for member in members_without_role]) # 处理Discord消息长度限制(单条消息最多2000字符) if len(member_list) > 2000: # 把长内容拆分成多个块发送 chunks = [member_list[i:i+2000] for i in range(0, len(member_list), 2000)] for chunk in chunks: await ctx.send(f"未拥有'Free Customers'角色的成员:\n{chunk}") else: await ctx.send(f"未拥有'Free Customers'角色的成员:\n{member_list}")
关键修正说明
- 移除错误循环:删掉了
for guild.members in range(10):这行错误代码,替换为正确的成员筛选逻辑 - 角色预检查:先确认目标角色存在,避免后续代码因为找不到角色而报错
- 高效筛选成员:用列表推导式一次性收集符合条件的成员,比嵌套循环更简洁
- 处理边界情况:考虑了角色不存在、所有成员都有角色的特殊场景
- 适配Discord限制:拆分过长的消息内容,避免超过单条消息2000字符的限制
额外注意事项
如果你发现返回的成员列表只有Bot自己,那是因为你没有开启服务器成员意图。需要在Discord开发者门户的Bot设置里开启「Server Members Intent」,同时在代码中启用:
intents = discord.Intents.default() intents.members = True # 初始化Bot时传入intents client = commands.Bot(command_prefix='你的命令前缀', intents=intents)
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

