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

discord.py中如何判断成员角色等级高于等于消息发送者,解决ban指令失效问题

问题排查与修复

核心故障原因

你代码中member参数的类型声明错误:你使用了discord.User类型,该类型是Discord全局用户对象,不包含任何服务器内的角色属性,只有服务器成员对象discord.Member才具备top_role属性,这直接导致角色校验逻辑完全失效,后续封禁流程也无法正常触发。

隐藏问题补充

除此之外你的代码还缺失两个必要校验、一个异常处理:

  • 未校验机器人自身是否有封禁成员的权限
  • 未校验目标成员的角色等级是否高于机器人,Discord规定机器人无法封禁角色比自己高的用户
  • 给被封禁用户发私信的逻辑没有异常捕获,若用户关闭了陌生人私信,会触发异常导致代码中断

修复后代码

import discord
import datetime
from discord.ext import commands

async def ban (ctx, member:discord.Member=None, *, reason=None):
    channel = ctx.channel
    # 校验入参合法性
    if member == None or member == ctx.message.author:
        embed = discord.Embed(title="封禁", description=f"从服务器中封禁指定成员", colour=discord.Colour.purple())
        await ctx.send(embed=embed)
        return
    # 校验命令调用者的权限
    if not ctx.author.guild_permissions.ban_members:
        embed4=discord.Embed(color=discord.Colour.purple(), 
        timestamp=datetime.datetime.utcnow(), title="权限不足!", description="你没有使用封禁命令的权限")
        await ctx.send(embed=embed4)
        return
    # 生成默认封禁理由
    if reason == None:
        reason = "违反服务器规则"
    # 校验调用者与目标成员的角色等级
    if member.top_role >= ctx.author.top_role:
        embed3=discord.Embed(color=discord.Colour.purple(), 
        title="角色等级不足", description="你无法封禁角色等级高于或等于你的用户")
        await channel.send(embed=embed3)
        return
    # 校验机器人自身的封禁权限
    if not ctx.guild.me.guild_permissions.ban_members:
        embed5=discord.Embed(color=discord.Colour.purple(), 
        timestamp=datetime.datetime.utcnow(), title="机器人权限不足!", description="我没有封禁成员的权限,请调整我的角色权限配置")
        await ctx.send(embed=embed5)
        return
    # 校验机器人与目标成员的角色等级
    if member.top_role >= ctx.guild.me.top_role:
        embed6=discord.Embed(color=discord.Colour.purple(), 
        title="角色等级不足", description="该用户角色等级高于我,我无法执行封禁操作")
        await channel.send(embed=embed6)
        return
    # 执行封禁操作
    await ctx.guild.ban(member, reason=reason)
    embed = discord.Embed(title="封禁成功", description=f" {member.mention} 已被 {ctx.author.mention} 封禁", 
    colour=discord.Colour.purple())
    await ctx.send(embed=embed)
    # 私信通知被封禁用户,增加异常捕获避免报错
    try:
        message = f"你已被移出 {ctx.guild.name} 服务器,封禁理由:{reason}"
        await member.send(message)
    except:
        pass

关键修改点说明

  • 将member参数的类型从discord.User调整为discord.Member,正确获取用户在服务器内的角色信息
  • 新增机器人侧的权限、角色等级校验逻辑,避免因机器人权限不足导致执行失败
  • 对私信逻辑增加异常捕获,避免因用户关闭陌生人私信触发代码报错
  • 所有Embed提示内容调整为中文,符合使用需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:02