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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:33:02