You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止他人获取Private Avatar角色成员头像?discord.py开发求助

解决方案:阻止查看特定角色成员的头像

我来帮你搞定这个需求!核心思路很简单——在处理头像请求时,先检查目标用户是否带有Private Avatar角色,要是有的话就拒绝返回头像,反之正常展示。下面是完整的实现代码,我会一步步解释关键部分:

import discord
from discord.ext import commands

class Avatar:
    """Returns members avatar."""
    def __init__(self, bot):
        self.bot = bot

    @commands.command(pass_context=True)
    @commands.cooldown(5, 60, commands.BucketType.user)
    async def avatar(self, context, member: discord.Member = None):
        """Returns a member's avatar. If no member is specified, returns your own."""
        # 处理未指定成员的情况:默认返回命令使用者的头像
        member = member or context.author
        
        # 查找目标成员是否拥有"Private Avatar"角色(名称大小写敏感)
        private_avatar_role = discord.utils.get(member.roles, name="Private Avatar")
        
        if private_avatar_role:
            # 角色存在,发送保护提示
            await context.send(f"⚠️ 抱歉,{member.display_name}的头像已设置为私密,无法查看!")
            return
        
        # 无保护角色,正常生成并发送头像
        # 使用display_avatar优先获取服务器自定义头像,没有则用全局头像
        avatar_link = member.display_avatar.url
        # 用Embed展示头像更美观
        avatar_embed = discord.Embed(title=f"{member.display_name}的头像")
        avatar_embed.set_image(url=avatar_link)
        await context.send(embed=avatar_embed)

    # 可选:添加错误处理,提升用户体验
    @avatar.error
    async def avatar_error_handler(self, ctx, error):
        if isinstance(error, commands.MemberNotFound):
            await ctx.send("❌ 找不到这个成员,请检查用户名或ID是否正确!")
        elif isinstance(error, commands.MissingRequiredArgument):
            await ctx.send("❌ 请指定要查看头像的成员,或者直接输入命令查看自己的头像!")
        else:
            await ctx.send(f"❌ 处理请求时出错:{str(error)}")

# 记得把这个Cog注册到你的Bot实例中
# bot.add_cog(Avatar(bot))

关键细节说明:

  • 默认头像逻辑member = member or context.author 让用户不指定成员时自动查看自己的头像,符合日常使用习惯。
  • 角色检查discord.utils.get(member.roles, name="Private Avatar") 精准匹配角色名称,注意这里是大小写敏感的,如果你服务器里的角色名称是小写或者有空格差异,要对应修改。
  • 头像链接优化member.display_avatar.url 比旧的avatar_url更实用,因为它会优先显示用户在当前服务器的自定义头像,没有的话才回退到全局头像。
  • 错误处理:额外添加的错误处理器能捕获无效成员、缺少参数等情况,给用户清晰的提示,避免机器人静默无响应。

可选优化方向:

  1. 管理员豁免:如果想让管理员能查看私密头像,可以在角色检查前加一段权限判断:
    # 管理员不受限制,直接跳过角色检查
    if context.author.guild_permissions.administrator:
        pass
    elif private_avatar_role:
        # 发送提示...
    
  2. 配置化角色名称:把角色名称改成配置变量,避免硬编码,方便后续修改:
    # 可以放在Bot的配置文件里
    PRIVATE_AVATAR_ROLE = "Private Avatar"
    # 然后代码里引用
    private_avatar_role = discord.utils.get(member.roles, name=self.bot.config.PRIVATE_AVATAR_ROLE)
    

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

火山引擎 最新活动