You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就包含所有用户,排序和索引查找就不会出错了。

操作分两步:

  1. 去Discord开发者门户,找到你的bot应用,在Privileged Gateway Intents板块开启Server Members Intent。
  2. 在代码里初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:52:38