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

Discord机器人无法通过消息反应添加对应角色问题求助

Discord机器人添加角色失败的问题排查与修复

核心问题及修复方案:

  • 消息判断逻辑错误:你代码里用if message == MESSAGE_ID是将Message对象与数字ID直接比较,永远不会触发后续逻辑,必须改为比较消息的ID属性:

    if message.id == MESSAGE_ID:
    
  • 未排除机器人自身反应:如果机器人自己对消息添加了反应,也会触发该事件,导致无效执行,建议在开头添加判断跳过:

    if payload.user_id == client.user.id:
        return
    
  • 角色获取方式优化:直接使用guild.get_role()比discord.utils.get()更高效直观:

    role = guild.get_role(1056801648355324034)  # 对应👍的角色
    
  • 权限与异常处理:

    • 确保机器人拥有管理角色权限,且机器人的角色在服务器角色列表中的位置高于要添加的角色(否则无法为用户添加该角色)
    • 给异步操作添加异常捕获,方便排查执行中的错误:
      try:
          await reacting_user.add_roles(role)
      except Exception as e:
          print(f"添加角色失败: {e}")
      

修复后的完整代码:

@client.event 
async def on_raw_reaction_add(payload):
    # 跳过机器人自身的反应
    if payload.user_id == client.user.id:
        return

    # 获取服务器和用户
    guild = client.get_guild(payload.guild_id)
    if not guild:
        return
    reacting_user = guild.get_member(payload.user_id)
    if not reacting_user:
        return

    # 获取消息对象
    channel = guild.get_channel(payload.channel_id)
    if not channel:
        return
    try:
        message = await channel.fetch_message(payload.message_id)
    except Exception as e:
        print(f"获取消息失败: {e}")
        return

    # 判断是否是目标消息
    if message.id == MESSAGE_ID:
        # 处理👍反应
        if str(payload.emoji) == '👍':
            role = guild.get_role(1056801648355324034)
            if role:
                try:
                    await reacting_user.add_roles(role)
                except Exception as e:
                    print(f"添加👍角色失败: {e}")
        # 处理👎反应
        elif str(payload.emoji) == '👎':
            role = guild.get_role(1056801755670777946)
            if role:
                try:
                    await reacting_user.add_roles(role)
                except Exception as e:
                    print(f"添加👎角色失败: {e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:55:14