在discord.py中使用discord.Server触发KeyError: 'id'错误求助
解决discord.py中
KeyError: 'id'的问题 哥们,你的问题出在**手动实例化discord.Server()(现在discord.py里已经改叫Guild了)**这个操作上。这个类的构造函数需要接收完整的服务器数据(从Discord API返回的字典),你直接调用discord.Server()的话,内部的guild参数根本没有id这个键,自然会触发KeyError。而且这类对象本来就不该由我们手动创建,应该通过机器人实例来获取。
下面给你正确的实现步骤:
1. 正确获取服务器(Guild)对象
你需要通过机器人的实例来获取服务器,而不是自己new一个。常见的两种场景:
场景1:机器人启动后获取指定服务器
import discord from discord.ext import commands bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) # 记得开启必要的intents,比如members @bot.event async def on_ready(): print(f"已登录为 {bot.user}") # 替换成你的服务器ID(数字) target_guild_id = 123456789012345678 server = bot.get_guild(target_guild_id) if not server: print("找不到指定服务器,请检查ID是否正确,以及机器人是否在该服务器中") return # 接下来处理你的用户ID列表 user_id_list = [987654321098765432, 112233445566778899] for user_id in user_id_list: member = server.get_member(user_id) if member: print(f"用户ID {user_id} 的用户名:{member.name},服务器昵称:{member.display_name}") else: print(f"用户ID {user_id} 不在该服务器中,或者机器人无法获取到该用户信息")
场景2:在命令中获取当前服务器
如果是通过命令触发查询,直接从上下文拿服务器更方便:
@bot.command() async def get_username(ctx, *user_ids: int): server = ctx.guild # 从命令上下文获取当前服务器 for user_id in user_ids: member = server.get_member(user_id) if member: await ctx.send(f"✅ 用户ID `{user_id}` 的用户名是:**{member.name}**") else: await ctx.send(f"❌ 未找到用户ID `{user_id}`,请检查该用户是否在服务器中")
2. 关键注意事项
- Intents权限:要获取成员信息,必须在Discord开发者后台开启
Server Members Intent,并且代码里初始化Bot时传入intents=discord.Intents.all()(或者按需开启需要的intents)。 - 机器人权限:确保机器人在目标服务器中有「查看服务器成员」的权限,否则
get_member会返回None。
内容的提问来源于stack exchange,提问作者Sizzle




