You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动