使用discord.utils.get()获取Discord成员返回None的问题求助
问题解决方法
1. 核心错误:查询成员时用错参数
你代码里用name参数传入18位ID是完全错误的:
name对应的是用户的用户名(比如"Mike",不带#后缀)- 用ID查询必须用
id参数,且ID要传整数类型,不是字符串
2. 逻辑错误:无法通过user2 in after.roles判断操作人
on_member_update事件的before/after仅代表被修改角色的成员,无法直接获取是谁修改了角色。要判断操作人,必须查询服务器的审计日志。
3. 优化:避免缓存缺失问题
即使开启了members intent,机器人的本地缓存可能没加载到目标用户,用fetch_member从Discord API直接拉取成员,比依赖缓存的discord.utils.get更可靠。
修改后的完整代码
import discord from discord.ext import commands from discord import AuditLogAction # 替换成你的目标机器人ID和你的用户ID(整数类型) TARGET_BOT_ID = 123456789012345678 YOUR_USER_ID = 987654321098765432 intents = discord.Intents.default() intents.members = True intents.guilds = True bot = commands.Bot(command_prefix='!', intents=intents) @bot.event async def on_ready(): print(f'Logged in as {bot.user.name}') @bot.event async def on_member_update(before, after): # 只处理目标机器人的角色变化 if after.id != TARGET_BOT_ID: return # 角色没变化就跳过 if before.roles == after.roles: return # 查询最近的角色修改审计日志 async for entry in after.guild.audit_logs(action=AuditLogAction.member_role_update, limit=1): # 检查操作人是否是你 if entry.user.id == YOUR_USER_ID: # 恢复角色到修改前的状态 if len(after.roles) > len(before.roles): # 新增了角色,移除新增的部分 added_roles = [r for r in after.roles if r not in before.roles] await after.remove_roles(*added_roles, reason="禁止为该机器人分配角色") else: # 移除了角色,加回移除的部分 removed_roles = [r for r in before.roles if r not in after.roles] await after.add_roles(*removed_roles, reason="禁止移除该机器人的角色") break
额外注意事项
- 确保机器人拥有查看审计日志的权限,否则无法获取操作人信息
- 把代码里的
TARGET_BOT_ID和YOUR_USER_ID替换成实际的18位整数ID - 如果机器人在大型服务器,审计日志查询可以适当调整
limit参数,但一般取最近1条足够
内容的提问来源于stack exchange,提问作者Iirus
相关产品推荐
相关产品推荐

