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
相关产品推荐
相关产品推荐

