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

基于Pycord与Quart的Discord机器人控制面板开发:如何获取用户拥有权限的服务器列表

解决方案:获取用户权限相关的Discord服务器列表

嘿,刚好做过类似的Pycord+Quart开发场景,给你分享两个问题的可行方案:

一、获取用户拥有机器人权限的服务器列表

这个场景的核心是结合机器人已加入服务器 + 用户授权返回的服务器列表 + 权限校验——毕竟机器人只能访问自己已经加入的服务器,具体步骤如下:

  1. 先搞定OAuth授权的Scope
    你的授权链接必须包含identify和guilds这两个scope,这样才能拿到用户的基本信息和服务器列表。

  2. 在Quart回调中获取用户的服务器列表
    用户完成授权后,用拿到的Access Token调用Discord API获取用户的所有服务器:

    from quart import request, session
    import aiohttp
    
    @app.route('/callback')
    async def callback():
        code = request.args.get('code')
        # 交换授权码获取Token
        async with aiohttp.ClientSession() as cs:
            token_data = await cs.post(
                'https://discord.com/api/oauth2/token',
                data={
                    'client_id': YOUR_CLIENT_ID,
                    'client_secret': YOUR_CLIENT_SECRET,
                    'grant_type': 'authorization_code',
                    'code': code,
                    'redirect_uri': YOUR_REDIRECT_URI,
                    'scope': 'identify guilds'
                }
            ).json()
            access_token = token_data['access_token']
        
        # 获取用户的服务器列表
        async with aiohttp.ClientSession(headers={'Authorization': f'Bearer {access_token}'}) as cs:
            user_guilds = await cs.get('https://discord.com/api/users/@me/guilds').json()
        
        session['user_guilds'] = user_guilds
        # 顺便获取用户ID存起来
        user_info = await cs.get('https://discord.com/api/users/@me').json()
        session['user_id'] = user_info['id']
        # ...后续页面跳转或逻辑处理
    
  3. 对比机器人服务器,校验用户权限
    用Pycord的bot实例拿到所有已加入服务器,和用户的服务器列表匹配后,检查用户在对应服务器的权限:

    from discord.utils import get
    
    # 假设bot已经成功启动并连接
    bot_guilds = bot.guilds
    user_id = int(session.get('user_id'))
    user_guilds = session.get('user_guilds', [])
    
    # 筛选机器人已加入且用户有权限的服务器
    authorized_guilds = []
    for user_guild in user_guilds:
        guild = get(bot_guilds, id=int(user_guild['id']))
        if guild:
            member = guild.get_member(user_id)
            # 这里判断管理员或管理服务器权限,可根据需求调整
            if member and (member.guild_permissions.administrator or member.guild_permissions.manage_guild):
                authorized_guilds.append({
                    'id': guild.id,
                    'name': guild.name,
                    'icon': guild.icon.url if guild.icon else None
                })
    

二、获取用户拥有高级权限的所有服务器(机器人未加入的)

机器人没法直接访问未加入的服务器,所以只能通过OAuth返回的服务器列表里的permissions字段判断,具体操作:

  1. 同样确保OAuth Scope包含guilds
    只有带guilds scope,返回的服务器数据才会包含用户的权限位数值。

  2. 解析权限位,筛选高级权限服务器
    Discord用位掩码表示权限,比如管理员权限对应数值8,用位运算就能快速判断:

    # 承接上面获取的user_guilds和bot_guilds
    # 定义你认为的"高级权限"对应的数值,可按需添加
    HIGH_PERMISSION_FLAGS = [
        8,    # 管理员权限
        32,   # 管理服务器权限
        64,   # 管理角色权限
        128   # 管理频道权限
    ]
    
    user_high_perm_guilds = []
    for guild in user_guilds:
        perm_value = int(guild['permissions'])
        # 检查是否拥有任意一种高级权限
        has_high_perm = any((perm_value & flag) == flag for flag in HIGH_PERMISSION_FLAGS)
        if has_high_perm:
            # 标记该服务器是否已有机器人加入,方便前端区分展示
            bot_joined = any(bg.id == int(guild['id']) for bg in bot_guilds)
            user_high_perm_guilds.append({
                'id': guild['id'],
                'name': guild['name'],
                'icon': f"https://cdn.discordapp.com/icons/{guild['id']}/{guild['icon']}.png" if guild['icon'] else None,
                'bot_joined': bot_joined
            })
    

小提醒

  • 权限位数值可以参考Discord官方的权限列表,根据你的产品需求调整筛选条件;
  • 处理服务器图标时要注意icon为None的情况,避免报错;
  • 记得给机器人和OAuth应用配置足够的权限,防止API调用被限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:49:14