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

Discord.py如何检测成员是否持有指定角色?现有代码始终返回无权限如何解决

问题诊断

你的代码核心错误是命令回调的参数接收不符合discord.py的规则:所有命令的第一个参数固定为上下文对象ctx,你当前将这个参数命名为author,直接拿上下文对象和角色成员列表里的成员对象做比对,不同类型的对象永远不会匹配,所以始终返回无权限提示。

修复后的实现代码
@client.command(aliases = ['4v4 ping'])
async def ping4v4(ctx):
    channel = client.get_channel(870969338679660591)
    target_role_id = 870969337958240260
    # 自动获取触发指令的成员,无需用户主动@自己
    trigger_member = ctx.author

    # 角色检测有两种可用写法,选一种即可
    # 写法1:直接遍历成员角色校验ID,性能更高,无空对象报错风险
    has_role = any(role.id == target_role_id for role in trigger_member.roles)
    # 写法2:和你原逻辑对齐,先获取角色对象再校验
    # guild = client.get_guild(870969337945669722)
    # target_role = guild.get_role(target_role_id)
    # has_role = target_role in trigger_member.roles

    if has_role:
        await channel.send(" 4v4 ping hehe ")
    else:
        await channel.send(" You don't have perms! ")
补充说明
  • 旧版discord.py需要加的pass_context=True参数在v1.0+版本中已经默认开启,无需额外声明
  • 如果你使用的是discord.py v2.0+版本,需要确保你已经在开发者后台开启了members权限intent,且代码中已经注册该intent,否则可能出现角色读取失败的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:00:05