Discord.py是否可读取成员自定义状态实现违禁词自动隔离
Discord.py 实现自定义状态检测违规隔离方案
discord.py 内置了全套对应方法和事件,完全可以覆盖你需要的新入群检测、存量成员检测、角色调整全流程,不需要额外依赖第三方库。
对应功能的核心接口说明
- 新成员入群监听:使用
on_member_join(member)事件,成员成功加入服务器时会自动触发,触发时可直接读取成员状态执行检测。 - 存量成员状态变更监听:使用
on_member_update(before, after)事件,成员修改昵称、头像、活动状态(含自定义状态)时都会触发该事件,只需对比before.activities和after.activities的差异,确认是自定义状态变更后再执行检测即可,避免无效运算。 - 存量成员全量巡检:机器人上线触发
on_ready()事件时,遍历对应服务器的guild.members成员列表,逐个执行状态检测即可覆盖机器人离线期间、或上线前就已在服务器内未修改状态的成员。 - 自定义状态读取:成员的所有活动状态存储在
member.activities属性中,筛出类型为discord.CustomActivity的对象,其name属性就是用户设置的自定义状态文本。注意需要在Discord开发者后台为机器人开启Presence Intent(状态读取权限)、Server Members Intent(服务器成员读取权限),同时初始化Bot实例时要对应开启intents配置,否则无法读取成员列表和状态信息。 - 角色调整操作:
- 移除成员所有角色:调用
member.remove_roles()方法,传入成员当前持有的非@everyone默认角色即可(@everyone为用户自带默认角色,无法移除,需要提前过滤避免接口报错)。 - 分配隔离角色:先通过
guild.get_role(隔离角色ID)获取提前创建好的隔离角色对象,再调用member.add_roles()方法传入该角色即可完成分配。
- 移除成员所有角色:调用
- 自定义违禁词配置:该逻辑和discord.py本身无关,只需在检测逻辑中加入数据库查询步骤,每次检测前拉取你存在数据库中的最新违禁词列表做匹配即可,可自行选择精确匹配、模糊匹配等匹配规则。
最小实现代码示例
import discord from discord.ext import commands # 初始化权限配置 intents = discord.Intents.default() intents.members = True intents.presences = True bot = commands.Bot(command_prefix="!", intents=intents) # 替换为你服务器实际的隔离角色ID ISOLATION_ROLE_ID = 1234567890 # 替换为你实际的数据库查询违禁词逻辑 def fetch_blocked_words(): return ["测试违禁词1", "测试违禁词2"] async def status_check(member: discord.Member): # 跳过机器人账号 if member.bot: return # 提取自定义状态文本 status_text = "" for act in member.activities: if isinstance(act, discord.CustomActivity): status_text = act.name or "" break # 违禁词匹配 blocked_words = fetch_blocked_words() if any(word in status_text for word in blocked_words): # 移除所有非默认角色 remove_targets = [r for r in member.roles if r != member.guild.default_role] await member.remove_roles(*remove_targets, reason="自定义状态命中违禁词,执行隔离") # 分配隔离角色 isolate_role = member.guild.get_role(ISOLATION_ROLE_ID) if isolate_role: await member.add_roles(isolate_role, reason="自定义状态命中违禁词,分配隔离角色") # 新成员入群触发检测 @bot.event async def on_member_join(member): await status_check(member) # 成员信息更新触发检测 @bot.event async def on_member_update(before, after): # 仅当活动状态变化时执行检测,减少冗余运算 if before.activities != after.activities: await status_check(after) # 机器人上线后执行全量存量巡检 @bot.event async def on_ready(): print(f"Bot上线:{bot.user}") for guild in bot.guilds: for member in guild.members: await status_check(member) # 替换为你自己的机器人Token bot.run("YOUR_BOT_TOKEN")
注意事项
- 机器人自身的角色在服务器角色列表中,必须排在所有需要被移除的用户角色、以及隔离角色的上方,同时需要给机器人开启「管理角色」权限,否则角色操作接口会返回403无权限错误。
- 如果服务器成员规模较大,全量巡检时建议增加适当延时,避免短时间发起大量请求触发Discord的接口速率限制。
内容的提问来源于stack exchange,提问作者Not Iota
相关产品推荐
相关产品推荐

