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

Discord.py实现用户发送指定消息后移除对应Role的代码问题求解

角色移除功能失效原因
  • 传入参数类型错误:remove_roles()方法要求传入discord.Role对象,直接传入整数类型的角色ID时,接口不会执行对应操作。
  • 匹配逻辑错误:代码里判断的字符串是&ign ,这是HTML转义后的&写法,实际用户发送的消息里&是普通字符,该判断可能无法正确命中指令。
  • 权限配置缺失:没有开启Server Members Intent特权意图,不管是代码侧还是Discord开发者后台没开的话,机器人无法调用成员角色操作接口;同时如果机器人没有「管理角色」权限,或者自身角色在服务器内的排序低于要移除的目标角色,Discord会直接拒绝角色操作请求。
  • 消息删除逻辑风险:当前else分支会删除所有不符合指令格式的消息,很容易误删服务器内正常聊天内容;用purge(limit=1)删除消息也不够精准,高并发场景下可能误删其他用户的消息。
  • 文件操作不规范:直接用open()打开文件没有做异常处理,也没有用上下文管理器,容易出现文件句柄泄漏、写入失败的问题。
修复后可直接运行的代码
import discord
from discord.ext import commands

# 配置机器人意图,必须开启对应权限才能操作角色、读取消息内容
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
bot = commands.Bot(command_prefix="&", intents=intents)

@bot.event
async def on_message(message):
    # 跳过所有机器人发送的消息,避免循环触发
    if message.author.bot:
        return

    # 严格匹配开头的&ign指令,避免消息中间带关键词就误触发
    if message.content.startswith("&ign "):
        ign = message.content[5:].strip()
        # 校验IGN非空
        if not ign:
            tip_msg = await message.channel.send("格式错误,请使用 &ign 你的游戏ID 发送注册信息")
            await message.delete()
            await tip_msg.delete(delay=3)
            return

        # 写入注册记录,用上下文管理器自动处理文件开关,避免资源泄漏
        with open("registeredIGNs.txt", "a", encoding="utf-8") as f:
            f.write(f"{message.author.id}|{message.author.name}|{ign}\n")
        print(f"已记录用户 {message.author.name} 的IGN:{ign}")

        # 删除用户发送的注册指令消息
        await message.delete()

        # 角色操作逻辑
        target_role_id = 991038550118121602
        target_role = message.guild.get_role(target_role_id)
        # 前置校验,避免接口报错
        if not target_role:
            print(f"当前服务器未找到ID为{target_role_id}的角色")
            return
        if not message.guild.me.guild_permissions.manage_roles:
            print("机器人缺少「管理角色」权限,无法执行移除操作")
            return
        if message.guild.me.top_role.position <= target_role.position:
            print("机器人角色排序低于目标角色,无权操作该角色")
            return
        
        # 执行角色移除
        await message.author.remove_roles(target_role, reason="用户完成IGN注册,自动移除未验证角色")
        success_tip = await message.channel.send(f"{message.author.mention} 注册成功,已开放服务器访问权限")
        await success_tip.delete(delay=5)

    # 如果你不需要删除其他普通消息,删掉下面的else逻辑即可,避免误删正常聊天
    # else:
    #     await message.delete()

# 替换为你自己的机器人Token
bot.run("你的机器人Token")
上线前必做配置检查
  • 打开Discord开发者后台,进入对应机器人的Bot设置页,在Privileged Gateway Intents板块,打开Message Content Intent和Server Members Intent两个开关,保存配置。
  • 进入你的Discord服务器角色设置页,把机器人对应的角色拖动到角色列表的最上方,确保它的位置高于你要移除的目标角色。
  • 给机器人的角色勾选「管理角色」权限,保存服务器设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:01:06