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

