如何在discord.py 1.0.1中检测用户在线/离线并移除角色
Discord.py 1.0.1 检测用户离线并移除角色实现方案
核心思路
利用discord.py的on_member_update事件监听成员状态变化,当检测到用户从非离线状态切换至离线状态时,移除指定角色。
实现步骤与代码示例
- 确保机器人拥有管理角色权限,且目标角色的层级低于机器人角色(否则无法执行移除操作)。
- 编写事件处理函数:
import discord from discord.ext import commands bot = commands.Bot(command_prefix='!') # 替换为你需要移除的角色ID(推荐用ID,避免名称冲突) TARGET_ROLE_ID = 123456789012345678 @bot.event async def on_member_update(before, after): # 过滤仅当用户从非离线状态切换到离线的情况 if before.status != discord.Status.offline and after.status == discord.Status.offline: # 获取目标角色 target_role = discord.utils.get(after.guild.roles, id=TARGET_ROLE_ID) # 确认角色存在且用户拥有该角色 if target_role and target_role in after.roles: await after.remove_roles(target_role) # 可选:打印日志 print(f"已为用户 {after.display_name} 移除角色 {target_role.name}") # 替换为你的机器人令牌 bot.run('YOUR_BOT_TOKEN')
补充说明
- 如果偏好使用角色名称而非ID,可将获取角色的代码改为:
注意:角色名称可能重复,使用ID更可靠。target_role = discord.utils.get(after.guild.roles, name="你的角色名称") discord.Status.offline会包含用户真正离线和隐身(Invisible)两种状态,若需区分可进一步判断,但通常场景下无需区分。on_member_update事件会在成员的任意属性(昵称、角色、状态等)变化时触发,因此必须通过before.status和after.status的对比来精准过滤状态切换事件。
内容的提问来源于stack exchange,提问作者Bharath Bhat
相关产品推荐
相关产品推荐

