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

如何使用Discord.py监听用户状态变化并发送消息?

解决Discord.py监测成员状态变化的问题

在discord.py v2.x版本中,on_presence_update事件已被弃用,替代方案是使用on_member_update事件,结合正确配置的intents来实现成员状态变化监测。以下是具体实现步骤和代码:

1. 配置必要的Intents

要监测成员状态变化,必须开启members和presences这两个特权intents:

  • 在Discord开发者门户的应用页面,找到"Privileged Gateway Intents",开启"Server Members Intent"和"Presence Intent"。
  • 在代码中初始化客户端时启用这两个intents:
import discord

# 初始化intents
intents = discord.Intents.default()
intents.members = True
intents.presences = True

client = discord.Client(intents=intents)

2. 使用on_member_update事件监测状态变化

on_member_update会在成员的属性(包括状态)发生变化时触发,我们可以通过对比before和after的状态值,只在状态变化时执行发送消息的操作:

@client.event
async def on_member_update(before: discord.Member, after: discord.Member):
    # 指定要监测的目标成员ID
    target_member_id = my_Member_id
    
    # 跳过非目标成员的更新
    if after.id != target_member_id:
        return
    
    # 仅当状态发生变化时执行操作
    if before.status != after.status:
        # 格式化状态文本(转为大写更易读)
        status_text = str(after.status).upper()
        message_content = f"{after.display_name} 的状态已更新为 {status_text}"
        
        # 查找服务器中的#general频道
        general_channel = discord.utils.get(after.guild.channels, name="general")
        if general_channel:
            await general_channel.send(message_content)
        
        # 控制台输出日志
        print(message_content)

关键注意事项

  • 务必确保Discord开发者门户中已开启对应的特权intents,否则事件无法正常触发。
  • on_member_update会响应成员的多种属性变化(如昵称、角色),因此必须通过before.status != after.status过滤出状态变化的场景。
  • 如果服务器中没有名为general的频道,代码会跳过发送消息,可根据需求添加频道不存在时的错误处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:27:42