discord.py检测用户状态含指定关键词并自动授予角色的实现方法
实现方案(discord.py v2.x 环境)
第一步:开启必要的网关意图
你需要在两处完成意图开启配置,否则无法监听到用户状态变动:
- 访问Discord开发者后台的Bot管理页,下滑到Privileged Gateway Intents板块,开启
Presence Intent和Server Members Intent两个开关 - 在代码初始化bot时显式声明开启对应意图,示例代码如下:
import discord from discord.ext import commands intents = discord.Intents.default() intents.presences = True # 开启状态监听权限 intents.members = True # 开启成员信息监听权限 bot = commands.Bot(command_prefix="!", intents=intents)
第二步:编写状态更新事件监听函数
通过on_member_update事件监听用户信息变动,校验状态中是否包含目标关键词,匹配后自动授予角色,示例代码如下:
# 配置项:替换为你自己的实际参数 TARGET_GUILD_ID = 123456789012345678 # 目标服务器ID TARGET_KEYWORD = "discord.gg/SACRP" # 要检测的关键词 TARGET_ROLE_ID = 876543210987654321 # 要授予的角色ID @bot.event async def on_member_update(before: discord.Member, after: discord.Member): # 过滤非目标服务器的成员变动 if after.guild.id != TARGET_GUILD_ID: return # 状态无变动时直接跳过,减少冗余运算 if before.activities == after.activities: return # 提取用户自定义状态内容 status_content = "" for activity in after.activities: if activity.type == discord.ActivityType.custom: status_content = activity.name or "" break target_role = after.guild.get_role(TARGET_ROLE_ID) if not target_role: return has_keyword = TARGET_KEYWORD in status_content user_has_role = target_role in after.roles # 匹配关键词且无角色时授予角色 if has_keyword and not user_has_role: await after.add_roles(target_role) # 移除关键词后自动收回角色(不需要该逻辑可以删除本段) elif not has_keyword and user_has_role: await after.remove_roles(target_role)
注意事项
- 机器人自身的角色排序必须高于要授予的目标角色排序,否则会触发无权限报错
- 机器人需要被授予
管理角色的服务器权限 - 如果需要批量检测服务器存量用户的状态,可以在
on_ready事件中遍历成员完成校验,示例片段:
@bot.event async def on_ready(): guild = bot.get_guild(TARGET_GUILD_ID) target_role = guild.get_role(TARGET_ROLE_ID) for member in guild.members: status_content = "" for activity in member.activities: if activity.type == discord.ActivityType.custom: status_content = activity.name or "" break if TARGET_KEYWORD in status_content and target_role not in member.roles: await member.add_roles(target_role) print(f"已登录为 {bot.user},存量用户检测完成")
内容的提问来源于stack exchange,提问作者Rj Manhas
相关产品推荐
相关产品推荐

