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

discord.py中get_guild返回NoneType的原因及角色移除修复咨询

问题原因分析
  1. get_guild返回None的可能场景

    • 机器人未加入目标服务器,或传入的guild_id存在错误
    • 机器人本地缓存未加载该服务器数据(比如刚启动时缓存未完成同步)
  2. 核心报错原因
    你遇到的AttributeError本质是user为None,因为guild.get_member(payload.user_id)依赖机器人本地成员缓存:如果用户长期离线、机器人刚启动未缓存到该用户数据,get_member就会返回空值。而on_raw_reaction_remove事件本身不会提供完整的member对象,只能通过user_id自行获取。

修复方案

1. 开启服务器成员意图

Discord的权限系统要求必须开启服务器成员意图才能获取成员数据:

  • 登录Discord开发者平台,找到你的机器人,在「Privileged Gateway Intents」中开启「Server Members Intent」
  • 代码初始化机器人时传入intents参数:
    intents = discord.Intents.default()
    intents.members = True
    bot = commands.Bot(command_prefix='你的前缀', intents=intents)
    

2. 用fetch_member替代get_member

fetch_member直接从Discord API拉取用户数据,不依赖本地缓存,需用await调用:

user = await guild.fetch_member(payload.user_id)

3. 优化代码逻辑与错误处理

修正变量命名(避免混淆),增加空值判断防止报错:

@bot.event
async def on_raw_reaction_remove(payload):
    if payload.message_id != 1133426566626541568:
        return
    
    # 匹配表情对应的角色索引
    target_index = None
    for idx, item in enumerate(reactions):
        if item[0] == payload.emoji.name:
            target_index = idx
            break
    if target_index is None:
        return
    
    # 获取服务器对象
    guild = bot.get_guild(payload.guild_id)
    if not guild:
        print(f"无法找到ID为{payload.guild_id}的服务器")
        return
    
    # 获取用户对象
    try:
        user = await guild.fetch_member(payload.user_id)
    except discord.NotFound:
        print(f"无法找到ID为{payload.user_id}的用户")
        return
    
    # 获取目标角色
    target_role = discord.utils.get(guild.roles, name=reactions[target_index][1])
    if not target_role:
        print(f"无法找到名为{reactions[target_index][1]}的角色")
        return
    
    # 移除角色
    await user.remove_roles(target_role)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:15:08