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

Discord.py中on_raw_reaction_add事件无法从Payload获取用户,添加角色时报错求助

解决Discord机器人中member变量为None的问题

这个错误很典型,根源在于机器人的成员缓存里没有找到对应的用户,导致discord.utils.get(guild.members, id=payload.user_id)返回了None。下面是两种靠谱的解决办法:

1. 直接从Discord API拉取成员(推荐,不受缓存限制)

guild.members只包含机器人缓存到的成员,而guild.fetch_member()会直接向Discord API请求用户数据,不管用户是否在缓存里。修改你的代码如下:

async def on_raw_reaction_add(self, payload):
    if payload.message_id == client.data.get("rulemessage"):
        guild = client.get_guild(payload.guild_id)  # 替换find,更高效的获取服务器方式
        if not guild:
            return  # 找不到服务器直接返回
        if payload.emoji.name == "✅":
            role = discord.utils.get(guild.roles, name="Accepted Rules")
            if not role:
                print("找不到指定的「Accepted Rules」角色!")
                return
            try:
                # 从API拉取成员,不依赖本地缓存
                member = await guild.fetch_member(payload.user_id)
                await member.add_roles(role)
            except discord.NotFound:
                print("未找到对应用户!")
            except discord.Forbidden:
                print("机器人没有权限为用户添加角色,请检查权限设置!")

2. 启用成员缓存(适合频繁访问成员数据的场景)

如果你希望依赖缓存来获取成员,需要完成两步配置:

  • 在代码中开启成员意图:
    intents = discord.Intents.default()
    intents.members = True  # 开启成员缓存意图
    client = discord.Client(intents=intents)
    
  • 前往Discord开发者后台,找到你的机器人应用,在「Privileged Gateway Intents」板块中开启「Server Members Intent」权限。

完成配置后,机器人会自动缓存服务器内的所有成员,discord.utils.get(guild.members, id=payload.user_id)就能正常拿到成员对象了。

内容的提问来源于stack exchange,提问作者Sanel Trnka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:02:52