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

Discord机器人:私信中验证用户服务器角色权限的问题

问题解决:Discord机器人DM命令权限验证的AttributeError

错误原因

msg.author返回的是User对象,这是全局层面的用户实体,和具体服务器(Guild)没有绑定关系,所以不存在guild_permissions属性。要验证用户在指定服务器的权限,必须先获取该用户在目标服务器对应的Member对象。

修正步骤

  1. 获取用户在目标服务器的Member实例:通过guild.get_member(msg.author.id)获取,若返回None,说明用户不是该服务器成员(对应验证要求1)。
  2. 验证服务器是否存在:先判断guild是否为None,避免无效服务器ID导致的后续错误。
  3. 权限验证:使用Member对象的guild_permissions.administrator判断管理员权限;若要验证自定义角色,可检查用户角色列表中是否包含目标角色(通过ID或名称匹配)。

修正后的代码片段

def dm_server(self, msg):       
    # 拆分命令,处理格式错误
    cmd_parts = msg.content.split(" ", 1)
    if len(cmd_parts) < 2:
        await msg.channel.send("命令格式错误,请使用 `-server <服务器ID>`")
        return
    
    try:
        guildid = int(cmd_parts[1])
    except ValueError:
        await msg.channel.send("服务器ID必须是数字")
        return

    guild = self.bot.get_guild(guildid)
    if not guild:
        await msg.channel.send("找不到指定的服务器")
        return

    # 获取用户在目标服务器的Member对象
    member = guild.get_member(msg.author.id)
    if not member:
        await msg.channel.send("你不是该服务器的成员")
        return

    # 验证管理员权限
    if member.guild_permissions.administrator:
        await msg.channel.send("你拥有该服务器的管理员权限")
    else:
        # 验证自定义角色(示例:检查是否有ID为123456789的角色)
        custom_role_id = 123456789
        has_custom_role = any(role.id == custom_role_id for role in member.roles)
        if has_custom_role:
            await msg.channel.send("你拥有指定的自定义角色")
        else:
            await msg.channel.send("你没有管理员权限或指定的自定义角色")

关键说明

  • guild.get_member()需要机器人在目标服务器中有权限获取成员列表,确保机器人的服务器权限配置正确。
  • 自定义角色验证可根据需求调整:比如通过角色名称匹配role.name == "自定义角色名",但ID匹配更可靠(名称可能重复)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:28:01