如何使用on_member_update实现用户获角色时自动授予第二角色
功能实现逻辑
- 首先提前记录两个角色的ID:触发同步的源角色ID、需要自动授予的目标角色ID,可从服务器角色设置页面复制获得
on_member_update事件会传入两个参数:before(成员更新前的状态对象)、after(成员更新后的状态对象)- 核心判断规则:对比
before和after的角色列表,确认成员是新获得源角色,而非移除角色、修改昵称等其他更新操作 - 符合触发条件后,调用成员对象的角色添加接口,授予目标角色即可
代码实现示例(基于discord.py v2.x版本)
import discord from discord.ext import commands # 替换为你自己服务器的对应角色ID SOURCE_ROLE_ID = 123456789012345678 # 触发同步的源角色 TARGET_ROLE_ID = 876543210987654321 # 要自动授予的目标角色 # 开启必要的特权意图 intents = discord.Intents.default() intents.members = True # 必须开启,否则on_member_update事件不会触发 bot = commands.Bot(command_prefix='!', intents=intents) @bot.event async def on_member_update(before: discord.Member, after: discord.Member): # 校验:用户刚获得源角色(更新前没有,更新后有) if before.get_role(SOURCE_ROLE_ID) is None and after.get_role(SOURCE_ROLE_ID) is not None: target_role = after.guild.get_role(TARGET_ROLE_ID) if not target_role: return # 授予目标角色,添加异常捕获避免事件崩溃 try: await after.add_roles(target_role) except discord.Forbidden: print(f"权限不足,无法给用户{after.id}授予目标角色") bot.run("你的机器人Token")
注意事项
- 机器人必须拥有「管理角色」权限,且机器人自身的角色层级要高于目标角色,否则角色添加会失败
- 需要在Discord开发者平台的机器人管理页面,手动开启「Server Members Intent」开关,和代码里的意图配置对应
- 如果需要实现多组角色的同步逻辑,只需要扩展角色ID配对的判断规则即可
内容的提问来源于stack exchange,提问作者Georgi Koynov
相关产品推荐
相关产品推荐

