Discord.py userinfo命令运行报错:ValueError - 指定成员不在列表中问题咨询
嘿,来解决你的Userinfo命令报错问题!
错误到底为啥会发生?
你碰到的ValueError说白了就是:你要找的用户不在你排序后的成员列表里,所以list.index(user)找不到对应项,直接抛出异常了。具体有两个核心原因:
- Discord.py的默认缓存坑:默认情况下,discord.py只会缓存服务器里的在线成员(或者最近活跃的成员),不会加载所有用户。如果查询的用户处于离线状态,或者刚好不在当前缓存的集合里,
ctx.guild.members就没有他,自然找不到索引。 - 小概率的
joined_at空值问题:极少数特殊情况(比如早期Discord账号、异常加入的成员)下,用户的joined_at字段可能是None,排序时会引发问题,但这不是你当前报错的直接原因。
两种靠谱的解决办法
根据你的服务器规模,选一个合适的方案:
方案1:开启全成员缓存(适合中小型服务器)
通过开启Discord的成员特权意图,让bot能获取服务器的所有成员(不管在线还是离线),这样ctx.guild.members就包含所有用户,排序和索引查找就不会出错了。
操作分两步:
- 去Discord开发者门户,找到你的bot应用,在
Privileged Gateway Intents板块开启Server Members Intent。 - 在代码里初始化bot时,启用成员意图:
import discord from discord.ext import commands # 初始化意图对象 intents = discord.Intents.default() intents.members = True # 开启成员意图 # 创建bot实例(替换成你的命令前缀) bot = commands.Bot(command_prefix="!", intents=intents) # 你的userinfo命令代码...
方案2:直接统计加入顺序(适合大型服务器,省内存)
如果你的服务器成员特别多,缓存所有成员会占不少内存,那咱们可以换个思路:直接数有多少人比目标用户更早加入服务器,再加1就是他的位置,不用排序整个成员列表。
把userinfo命令里关于"Posicion de Servidor"的代码替换成下面这段:
# 删掉原来的这两行: # members = sorted(ctx.guild.members, key=lambda m: m.joined_at) # embed.add_field(name="Posicion de Servidor", value=str(members.index(user)+1)) # 新的统计代码: joined_position = 1 for member in ctx.guild.members: # 跳过joined_at为空的异常用户,避免报错 if member.joined_at and member.joined_at < user.joined_at: joined_position += 1 embed.add_field(name="Posicion de Servidor", value=str(joined_position))
注意:如果用的是discord.py v2.x版本,还是得先开启成员意图,不然ctx.guild.members还是只能拿到部分成员。
额外的小优化建议
- 处理角色为空的情况:当用户只有@everyone角色时,现在的代码会跳过角色字段,你可以加个判断,显示"无特殊角色",更友好。
- 容错
joined_at空值:在统计或排序时,把joined_at为空的成员放到最后,避免潜在的报错。
内容的提问来源于stack exchange,提问作者user17033631
相关产品推荐
相关产品推荐

