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

Discord机器人开发问题:无法检测目标用户自定义状态变更并通知主人

Discord机器人检测自定义状态变更并通知主人的解决方案

一、修复核心权限问题:开启必要的Intents

Discord默认的Intents不包含状态和成员检测权限,这是导致你代码无效的关键原因:

  1. 登录Discord开发者门户,进入你的机器人应用「Bot」页面,在「Privileged Gateway Intents」下开启Presence Intent和Server Members Intent。
  2. 修改代码中的Intents初始化:
import discord

intents = discord.Intents.default()
intents.presences = True  # 开启状态/活动检测权限
intents.members = True    # 开启成员信息更新权限
client = discord.Client(intents=intents)

二、明确三个事件的区别与适用场景

  • on_user_update:仅触发用户基础信息(用户名、头像等)变更,不包含状态/活动类变更,不适合你的需求。
  • on_member_update:触发服务器内成员的角色、昵称、状态/活动变更,但要求机器人和目标用户在同一服务器。
  • on_presence_update:触发所有可见用户的在线状态(在线/离线/空闲)或活动(自定义状态、游戏)变更,是检测自定义状态的最优选择。

三、正确检测自定义状态变更的代码实现

用户的自定义状态属于CustomActivity类型,需要专门提取并对比前后内容:

@client.event
async def on_presence_update(before, after):
    # 替换为目标用户的ID(必须是整数类型)
    TARGET_USER_ID = 123456789012345678
    # 替换为机器人主人的ID(必须是整数类型)
    OWNER_ID = 987654321098765432

    if after.id != TARGET_USER_ID:
        return

    # 提取用户的自定义状态文本
    def get_custom_status(member):
        for activity in member.activities:
            if isinstance(activity, discord.CustomActivity):
                return activity.state
        return None

    before_status = get_custom_status(before)
    after_status = get_custom_status(after)

    # 仅当自定义状态确实发生变化时发送通知
    if before_status != after_status:
        owner = client.get_user(OWNER_ID)
        if owner:
            if before_status is None:
                await owner.send(f"{after.name} 设置了自定义状态:{after_status}")
            elif after_status is None:
                await owner.send(f"{after.name} 移除了自定义状态:{before_status}")
            else:
                await owner.send(f"{after.name} 更新了自定义状态:\n旧状态:{before_status}\n新状态:{after_status}")

四、私信发送的注意事项

  • 确保用户ID是整数类型,而非字符串;
  • 机器人和主人需要至少在一个共同服务器(否则无法发送私信);
  • 确认主人未屏蔽机器人的私信功能。

内容的提问来源于stack exchange,提问作者Tahmid Chowdhury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:20:26