如何在discord.py rewrite版本中从审计日志获取用户所有昵称列表
如何在discord.py Rewrite中提取指定用户的所有历史昵称(从审计日志)
想要获取某个用户的所有过往昵称?在discord.py Rewrite版本中,我们可以通过服务器的审计日志来抓取这些变更记录——因为每次用户昵称修改都会触发member_update类型的审计日志条目。下面是具体的实现方法:
前置条件
- 你的机器人需要拥有
View Audit Log(查看审计日志)的服务器权限。 - 确保已经启用了必要的网关意图:
members和audit_logs,否则机器人无法获取成员信息和审计日志数据。
完整代码示例
下面是一个可直接使用的命令,输入目标用户后就能返回其所有历史昵称(自动去重):
from discord.ext import commands import discord # 初始化机器人,启用所有必要意图 intents = discord.Intents.default() intents.members = True intents.audit_logs = True bot = commands.Bot(command_prefix="!", intents=intents) @bot.command(name="get_nicknames") async def fetch_nicknames(ctx, target_member: discord.Member): # 用集合存储昵称,自动避免重复 unique_nicknames = {target_member.name} # 先加入用户的原始用户名 # 遍历服务器中所有成员更新类型的审计日志条目 async for entry in ctx.guild.audit_logs( action=discord.AuditLogAction.member_update, limit=None # 获取所有可用的审计日志(Discord保留最近90天) ): # 确认条目对应的是目标用户 if entry.target.id == target_member.id: # 加入变更前的昵称(如果存在) if entry.before.nick: unique_nicknames.add(entry.before.nick) # 加入变更后的昵称(如果存在) if entry.after.nick: unique_nicknames.add(entry.after.nick) # 把集合转为有序列表,方便展示 nickname_list = list(unique_nicknames) # 发送结果 response = f"📋 用户 {target_member.mention} 的所有历史昵称:\n" response += "\n- ".join(nickname_list) await ctx.send(response) # 启动机器人 bot.run("你的机器人令牌")
关键细节解释
意图设置:
从discord.py v1.5开始,必须显式启用members和audit_logs意图才能获取成员数据和审计日志。如果没有正确设置,代码会抛出权限相关的错误。审计日志筛选:
使用audit_logs(action=discord.AuditLogAction.member_update)只筛选昵称变更(以及其他成员信息变更)的条目,limit=None会拉取Discord保留的所有历史记录(最多90天)。去重处理:
用集合unique_nicknames来存储昵称,这样可以自动过滤重复的昵称(比如用户多次改回同一个名字的情况)。边界情况处理:
- 如果用户从未修改过昵称,结果列表只会包含其原始用户名。
- 处理了“无昵称→设置昵称”或“昵称→无昵称”的情况,只在昵称存在时才加入集合。
注意事项
- Discord的审计日志仅保留最近90天的记录,所以90天之前的昵称无法通过这种方式获取。
- 确保机器人的角色权限足够高,否则可能无法访问审计日志。
内容的提问来源于stack exchange,提问作者Abhishek Indapure




