如何使用discord.py根据用户状态关键词或用户名标签自动分配身份组
需求实现可行性说明
你的两个自动化身份组分配需求完全可以通过discord.py实现,具体实现逻辑、所需权限和代码示例如下:
前置准备
你需要先完成两项配置避免运行报错:
- 进入Discord开发者后台对应机器人的「Bot」设置页,开启Privileged Gateway Intents下的
Presence Intent和Server Members Intent,否则机器人无法获取成员状态、成员信息更新事件 - 给机器人授予服务器的管理身份组权限,同时在服务器身份组列表中,把机器人的专属身份组拖到你要分配的「支持者」「特殊身份组」的上方,否则会出现权限不足无法分配身份组的问题
功能1:检测成员状态含「ideal army op」自动分配支持者身份组
通过on_presence_update事件监听成员状态变更,检测状态文本后触发身份组分配,参考代码片段:
# 替换为你自己的支持者身份组ID SUPPORTER_ROLE_ID = 123456789012345678 @bot.event async def on_presence_update(before, after): # 只监听本服务器内的成员状态变更 guild = after.guild if not guild: return supporter_role = guild.get_role(SUPPORTER_ROLE_ID) if not supporter_role: return # 提取成员自定义状态文本 status_text = "" if after.activities: for activity in after.activities: if activity.type == discord.ActivityType.custom: status_text = activity.name or "" break # 状态包含指定内容且还没拿到身份组时,自动分配 if "ideal army op" in status_text.lower() and supporter_role not in after.roles: await after.add_roles(supporter_role) # 可选:如果成员后续移除了对应状态,可以自动收回身份组 elif "ideal army op" not in status_text.lower() and supporter_role in after.roles: await after.remove_roles(supporter_role)
功能2:检测用户名/昵称含「IA」自动授予指定特殊身份组
需要同时监听成员加入服务器、成员信息更新两个事件,覆盖新用户入群、老用户改名字的场景,参考代码片段:
# 替换为你自己的特殊身份组ID SPECIAL_ROLE_ID = 876543210987654321 # 新成员入群时检测 @bot.event async def on_member_join(member): special_role = member.guild.get_role(SPECIAL_ROLE_ID) if not special_role: return # 如果你要检测服务器昵称就换成 member.nick ,检测全局用户名用 member.name check_text = member.name if check_text and "IA" in check_text and special_role not in member.roles: await member.add_roles(special_role) # 老用户修改昵称/用户名时检测 @bot.event async def on_member_update(before, after): special_role = after.guild.get_role(SPECIAL_ROLE_ID) if not special_role: return before_check = before.name after_check = after.name # 如果要检测昵称就替换为下面两行 # before_check = before.nick or before.name # after_check = after.nick or after.name if "IA" in after_check and special_role not in after.roles: await after.add_roles(special_role) elif "IA" not in after_check and special_role in after.roles: await after.remove_roles(special_role)
额外注意事项
- 上述代码中所有身份组ID占位值,需要你开启服务器开发者模式后,右键对应身份组复制ID替换
- 如果不需要自动收回身份组,可以删掉代码中对应
elif分支的逻辑
内容的提问来源于stack exchange,提问作者hero
相关产品推荐
相关产品推荐

