如何获取Discord服务器非机器人成员列表并验证用户名有效性
解决Discord机器人获取服务器非机器人成员列表的问题
核心问题分析
你当前代码里的全局Users列表无法动态同步服务器成员的变化,也没有正确获取服务器内的非机器人用户。正确的做法是在命令执行时实时获取当前服务器的成员列表,而非提前存储在全局变量中。
解决方案步骤
确保Intents配置正确
除了代码里的intents = discord.Intents.all(),你需要在Discord开发者门户的机器人页面,开启Server Members Intent(服务器成员意图),否则机器人无法获取服务器成员数据。修改代码,实时获取非机器人成员
不需要全局的Users列表,在Fight命令内部直接获取当前服务器的非机器人成员即可:
intents = discord.Intents.all() bot = commands.Bot(command_prefix='!logan', intents=intents, help_command=None) # 若你有自定义helpCommand,替换成你的实现即可 @bot.command() async def Fight(ctx, target_username): # 实时获取当前服务器所有非机器人成员的用户名 non_bot_users = [member.name for member in ctx.guild.members if not member.bot] if ctx.author.name == target_username: await ctx.send("你不能和自己决斗") return if target_username in non_bot_users: # 找到对应成员对象,方便后续发送私信 target_member = discord.utils.get(ctx.guild.members, name=target_username) # 优化文件操作:用with语句自动管理文件关闭 with open(str(ctx.author.name), "w") as f: f.write(f"{target_username}\n300\nTurn") with open(target_username, "w") as f: f.write(f"{ctx.author.name}\n300\nNot") await ctx.author.send(f"你现在正在和 {target_username} 决斗") if target_member: await target_member.send(f"你现在正在和 {ctx.author.name} 决斗") else: await ctx.send("该用户不在此服务器中")
额外注意事项
- 用户名重复问题:Discord允许不同用户使用相同用户名,仅靠
name验证可能出错。更可靠的方式是让用户输入用户ID或使用discord.Member类型参数,直接获取成员对象:
这种方式用户只需@目标用户,机器人就能自动解析成成员对象,彻底避免用户名重复的问题。@bot.command() async def Fight(ctx, target_member: discord.Member): if target_member == ctx.author: await ctx.send("你不能和自己决斗") return if target_member.bot: await ctx.send("不能和机器人决斗") return # 后续逻辑直接使用target_member对象,比如target_member.name、target_member.send()
内容的提问来源于stack exchange,提问作者Logan Rothe
相关产品推荐
相关产品推荐

