You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在discord.py rewrite版本中从审计日志获取用户所有昵称列表

如何在discord.py Rewrite中提取指定用户的所有历史昵称(从审计日志)

想要获取某个用户的所有过往昵称?在discord.py Rewrite版本中,我们可以通过服务器的审计日志来抓取这些变更记录——因为每次用户昵称修改都会触发member_update类型的审计日志条目。下面是具体的实现方法:

前置条件

  • 你的机器人需要拥有View Audit Log(查看审计日志)的服务器权限。
  • 确保已经启用了必要的网关意图membersaudit_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("你的机器人令牌")

关键细节解释

  1. 意图设置
    从discord.py v1.5开始,必须显式启用membersaudit_logs意图才能获取成员数据和审计日志。如果没有正确设置,代码会抛出权限相关的错误。

  2. 审计日志筛选
    使用audit_logs(action=discord.AuditLogAction.member_update)只筛选昵称变更(以及其他成员信息变更)的条目,limit=None会拉取Discord保留的所有历史记录(最多90天)。

  3. 去重处理
    用集合unique_nicknames来存储昵称,这样可以自动过滤重复的昵称(比如用户多次改回同一个名字的情况)。

  4. 边界情况处理

    • 如果用户从未修改过昵称,结果列表只会包含其原始用户名。
    • 处理了“无昵称→设置昵称”或“昵称→无昵称”的情况,只在昵称存在时才加入集合。

注意事项

  • Discord的审计日志仅保留最近90天的记录,所以90天之前的昵称无法通过这种方式获取。
  • 确保机器人的角色权限足够高,否则可能无法访问审计日志。

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

火山引擎 最新活动