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

使用discord.py开发Discord机器人时如何获取授予角色的操作人

可行性说明

该需求完全可实现,基于discord.py原生提供的成员事件监听、服务器审计日志查询接口即可完成,无需接入第三方服务。

实现方案

实时监听方案(适合需要即时响应的场景)

通过监听on_member_update事件捕获用户角色变更,结合审计日志匹配操作人,是最常用的实现路径:

  • 初始化客户端时必须开启members、guilds意图,同时确保机器人在目标服务器拥有查看审计日志权限
  • 事件触发后,对比成员更新前后的角色集合,取差集判断是否存在新增角色,无新增直接终止逻辑
  • 拉取最近1-3条类型为member_role_update的审计日志,校验日志目标用户和当前变更用户一致,即可从日志条目中拿到执行加角色操作的账号信息

参考实现代码:

import discord

intents = discord.Intents.default()
intents.members = True
intents.guilds = True
client = discord.Client(intents=intents)

@client.event
async def on_member_update(before: discord.Member, after: discord.Member):
    added_roles = set(after.roles) - set(before.roles)
    if not added_roles:
        return
    # 拉取最近的角色更新审计记录做匹配
    async for log in after.guild.audit_logs(limit=3, action=discord.AuditLogAction.member_role_update):
        if log.target.id == after.id:
            operator = log.user
            new_role = next(iter(added_roles))
            # 后续自定义业务逻辑写在这里,比如操作留痕、消息通知等
            print(f"操作人{operator} 给用户{after} 添加了角色{new_role.name}")
            break

历史查询方案(适合回溯角色授予记录的场景)

如果不需要实时触发逻辑,只需要查询历史上给用户授予角色的操作人,可以直接分页拉取服务器审计日志,过滤member_role_update类型的条目即可:

  • 直接遍历guild.audit_logs()返回的异步迭代器,按目标用户、时间范围过滤条目
  • 注意Discord审计日志仅保留最近45天的记录,超出时间范围的内容无法查询
  • 拉取时尽量带上limit、用户、时间过滤参数,减少不必要的接口调用,避免触发Discord的接口频率限制

踩坑提示:高活跃服务器下审计日志生成速度快,实时监听时不要把拉取日志的limit设得过大,1-3条足够匹配刚触发的加角色操作;可以额外加日志创建时间和事件触发时间差小于2秒的校验,避免匹配到更早的无关操作。如果是用户通过服务器自动角色规则、第三方集成自动获得的角色,审计日志里的操作人会显示为对应集成账号或Discord系统账号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:01:20