Discord机器人:私信中验证用户服务器角色权限的问题
问题解决:Discord机器人DM命令权限验证的AttributeError
错误原因
msg.author返回的是User对象,这是全局层面的用户实体,和具体服务器(Guild)没有绑定关系,所以不存在guild_permissions属性。要验证用户在指定服务器的权限,必须先获取该用户在目标服务器对应的Member对象。
修正步骤
- 获取用户在目标服务器的Member实例:通过
guild.get_member(msg.author.id)获取,若返回None,说明用户不是该服务器成员(对应验证要求1)。 - 验证服务器是否存在:先判断
guild是否为None,避免无效服务器ID导致的后续错误。 - 权限验证:使用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
相关产品推荐
相关产品推荐

