You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:01:24