使用discord.py开发机器人触发on_raw_reaction_remove出现AttributeError如何解决
报错原因
on_raw_reaction_remove 事件的 payload.member 字段默认返回 None,这是Discord API的设计规则:只有添加反应的on_raw_reaction_add事件会携带完整成员对象,移除反应的事件不会主动回传成员信息。
你当前代码已经通过guild.get_member(payload.user_id)实例化了有效的member对象,但后续移除角色时错误调用了空值payload.member,所以触发属性不存在的报错。
修复方案
把最后一行调用的payload.member替换为你之前已经获取到的member变量即可,建议额外增加非空判断,避免用户已退出服务器等极端场景触发异常。
修正后的代码片段
channel = 867854256647176252 message = 867855236861132860 if payload.channel_id == channel and payload.message_id == message: guild = bot.get_guild(payload.guild_id) member = guild.get_member(payload.user_id) # 新增非空判断,避免无效成员对象报错 if not member: return emoji = payload.emoji global channels channels = str(channels) channels = channels.split() if str(emoji.name) == '🙂' : role = discord.utils.get(guild.roles, name='Offtopic') for index in range(len(channels) - 1, -1, -1): if channels[index] == 'Offtopic': channels.pop(index) # 替换payload.member为已实例化的member变量 await member.remove_roles(role)
额外排查点
如果修改后仍出现member为空的情况,可以按以下顺序排查:
- 确认Discord开发者门户的Bot设置页,「Privileged Gateway Intents」分类下的
Server Members Intent开关已经开启,仅代码中设置Intents.all()不会自动生效,必须在后台手动开权限。 - 可以将
member = guild.get_member(payload.user_id)替换为member = await guild.fetch_member(payload.user_id),该异步方法会主动调用Discord API拉取成员信息,不受本地缓存缺失的影响。
内容的提问来源于stack exchange,提问作者meri
相关产品推荐
相关产品推荐

