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

discord.py通过DM添加角色触发AttributeError: 'NoneType'无add_roles属性报错

报错原因

报错指向add_roles方法不存在,说明调用该方法的member变量为None,没有获取到有效的服务器成员实例,常见触发原因如下:

  • Discord.py v1.5及以上版本默认禁用成员相关的权限意图,未手动开启Server Members Intent时,get_member()仅能获取到机器人启动后缓存的少量成员,未缓存的用户会返回None
  • get_member()依赖本地缓存,若用户不在机器人本地缓存中,即使开启了意图也可能返回None
  • 极端情况为调用命令的用户不在你指定ID的服务器中,自然无法获取到对应成员实例

解决方法

  1. 开启机器人特权网关意图
    进入Discord开发者平台的机器人应用页,找到「Bot」分类下的「Privileged Gateway Intents」板块,打开Server Members Intent开关。
  2. 代码初始化时声明启用成员意图
    修改你的bot初始化代码,示例如下:
import discord
from discord.ext import commands

# 声明开启成员相关意图
intents = discord.Intents.default()
intents.members = True

# 初始化bot时传入intents参数
bot = commands.Bot(command_prefix="你设置的命令前缀", intents=intents)
  1. 替换成员获取方法,不依赖本地缓存
    将原来的同步get_member方法替换为异步的fetch_member方法,后者会主动调用Discord API拉取成员信息,不受本地缓存限制,修改后的verify命令代码如下:
@bot.command()
async def verify(ctx, arg1, arg2):
    server = bot.get_guild({替换为你的实际服务器ID})
    role = discord.utils.get(server.roles, name="verified")
    # 替换为fetch_member,注意加await
    member = await server.fetch_member(ctx.author.id)
    # 增加空值判断,避免极端情况报错
    if not member or not role:
        await ctx.author.send('验证失败,无法获取你的账号信息或验证角色不存在')
        return
    if int(arg2) in verificationcodes:
        await member.add_roles(role)
        await ctx.author.send('Success! The verified role has been added to your account!')
    else:
        await ctx.author.send("Verification code is INVALID!")
  1. 额外优化:原来的错误情况仅在控制台打印,建议也给用户返回私信提示,避免用户不知道验证失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:48:01