使用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
相关产品推荐
相关产品推荐

