如何修复Discord API报错:'member_descriptor' object is not subscriptable
问题分析与修复
你遇到的'member_descriptor' object is not subscriptable错误,核心原因是直接操作Discord.py的类属性而非实例对象,同时代码里还有多处语法和逻辑错误:
关键错误点拆解
discord.Invite.code[int]:discord.Invite是类,code是类的属性描述符,不是实例的具体值,不能用[int]这种下标方式转换类型,而且你根本没获取到具体的Invite实例,直接操作类必然报错。guild.Guild.shard_id、discord.guild.Guild.id[int]:同理,Guild是类,shard_id、id是类属性,必须通过具体的服务器实例(比如message.guild)才能访问这些值。- 函数内部定义
__getitem__:这个特殊方法是给类用的,在普通函数里定义完全无效;另外print[id]是语法错误,print是函数,正确用法是print(id)。 - 缺少
random模块导入:random.randint会报未定义错误。 s = discord.client.Client只是引用了Client类,没有实例化客户端,无法正常运行机器人。
修复后的代码示例
假设你想实现的是基础聊天交互,以及获取邀请链接code、服务器ID的功能,以下是修正后的代码:
import discord import random # 补上缺失的导入 from discord.ext import commands # 用commands框架更便捷 # 实例化机器人,开启所需权限 intents = discord.Intents.default() intents.message_content = True # 必须开启消息内容权限 bot = commands.Bot(command_prefix='!', intents=intents) def handle_response(message_content) -> str: p_message = message_content.lower() if p_message == 'hello': return 'Hey' if p_message == 'roll': return str(random.randint(1,6)) if p_message == '!help': return "`This is a help message.`" if p_message.startswith('url'): # 示例:用户发送"url 邀请链接"时提取code parts = p_message.split() if len(parts) < 2: return "请附上邀请链接,比如:url https://discord.gg/abc123" return parts[1].split('/')[-1] # 从链接中提取code @bot.event async def on_message(message): if message.author.bot: # 忽略机器人自身消息 return response = handle_response(message.content) if response: await message.channel.send(response) # 替换为你的机器人Token bot.run('YOUR_BOT_TOKEN')
针对邀请code获取的进阶补充
如果需要通过API验证邀请链接并获取更多信息,可以修改url分支为:
if p_message.startswith('url'): parts = p_message.split() if len(parts) < 2: return "请附上邀请链接,比如:url https://discord.gg/abc123" invite_url = parts[1] try: invite = await bot.fetch_invite(invite_url) return f"邀请code:{invite.code}\n所属服务器ID:{invite.guild.id}" except discord.errors.NotFound: return "无效的邀请链接" except discord.errors.Forbidden: return "无权限获取该邀请信息"
额外注意事项
- 必须在Discord开发者后台开启机器人的消息内容Intent,否则无法读取用户消息。
- 所有属性访问都要通过实例对象(比如
message.guild是Guild实例,invite是Invite实例),禁止直接操作Discord.py的类。
内容的提问来源于stack exchange,提问作者Sinnoh Industries
相关产品推荐
相关产品推荐

