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

如何在discord.py 1.0.1中检测用户在线/离线并移除角色

Discord.py 1.0.1 检测用户离线并移除角色实现方案

核心思路

利用discord.py的on_member_update事件监听成员状态变化,当检测到用户从非离线状态切换至离线状态时,移除指定角色。

实现步骤与代码示例

  1. 确保机器人拥有管理角色权限,且目标角色的层级低于机器人角色(否则无法执行移除操作)。
  2. 编写事件处理函数:
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,可将获取角色的代码改为:
    target_role = discord.utils.get(after.guild.roles, name="你的角色名称")
    
    注意:角色名称可能重复,使用ID更可靠。
  • discord.Status.offline会包含用户真正离线和隐身(Invisible)两种状态,若需区分可进一步判断,但通常场景下无需区分。
  • on_member_update事件会在成员的任意属性(昵称、角色、状态等)变化时触发,因此必须通过before.status和after.status的对比来精准过滤状态切换事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:05:38