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

如何在discord.py中排除角色?紧急命令DM遇403错误求助

解决Discord机器人紧急命令的403禁止错误

嗨,这个问题我之前帮朋友排查过!你碰到的403错误根源很明确:Discord不允许机器人向其他机器人发送私信,而你的命令遍历了服务器所有成员,自然会尝试给带有"BOTS"角色的机器人发消息,直接触发了权限限制。

我们只需要在遍历成员的循环里加个过滤条件,排除所有带有"BOTS"角色的成员就行,给你修改好的代码:

@bot.command(pass_context=True)
async def emergency(ctx, *, message: str):
    # 先获取服务器里的"BOTS"角色对象
    bots_role = discord.utils.get(ctx.guild.roles, name="BOTS")
    # 检查命令执行者是否有管理员权限
    if admin in [role.id for role in ctx.message.author.roles]:
        # 遍历服务器所有成员
        for server_member in ctx.guild.members:
            # 过滤掉带BOTS角色的成员,同时额外排除机器人账号(双重保险)
            if bots_role not in server_member.roles and not server_member.bot:
                await bot.send_message(server_member, message)
    else:
        await bot.say("DENIED, You do not have permission to use this command")

几个关键改动的说明:

  • 用discord.utils.get精准获取"BOTS"角色,避免手动写ID的麻烦(如果后续角色名称不变的话)
  • 循环里加了两个判断:
    • bots_role not in server_member.roles:直接排除目标角色的成员
    • not server_member.bot:额外过滤所有标记为机器人的账号(双重保险,防止有些机器人没加BOTS角色漏网)
  • 顺便提一句:新版discord.py里ctx.message.server已经被弃用了,换成ctx.guild兼容性更好,我已经帮你改过来了

如果担心角色名称被修改导致失效,你也可以直接用角色ID来判断,这样更稳定:

# 把这里换成你服务器BOTS角色的实际ID
BOTS_ROLE_ID = 123456789012345678

# 循环里的判断改成下面这样
if BOTS_ROLE_ID not in [role.id for role in server_member.roles] and not server_member.bot:

这样修改后,你的紧急命令就只会给非机器人的成员发私信,再也不会触发403错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:23:29