如何使用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
相关产品推荐
相关产品推荐

