Discord机器人开发问题:无法检测目标用户自定义状态变更并通知主人
Discord机器人检测自定义状态变更并通知主人的解决方案
一、修复核心权限问题:开启必要的Intents
Discord默认的Intents不包含状态和成员检测权限,这是导致你代码无效的关键原因:
- 登录Discord开发者门户,进入你的机器人应用「Bot」页面,在「Privileged Gateway Intents」下开启
Presence Intent和Server Members Intent。 - 修改代码中的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
相关产品推荐
相关产品推荐

