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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:15:03