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的服务器中,自然无法获取到对应成员实例
解决方法
- 开启机器人特权网关意图
进入Discord开发者平台的机器人应用页,找到「Bot」分类下的「Privileged Gateway Intents」板块,打开Server Members Intent开关。 - 代码初始化时声明启用成员意图
修改你的bot初始化代码,示例如下:
import discord from discord.ext import commands # 声明开启成员相关意图 intents = discord.Intents.default() intents.members = True # 初始化bot时传入intents参数 bot = commands.Bot(command_prefix="你设置的命令前缀", intents=intents)
- 替换成员获取方法,不依赖本地缓存
将原来的同步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!")
- 额外优化:原来的错误情况仅在控制台打印,建议也给用户返回私信提示,避免用户不知道验证失败。
内容的提问来源于stack exchange,提问作者s9dw
相关产品推荐
相关产品推荐

