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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:39:03