基于Pycord与Quart的Discord机器人控制面板开发:如何获取用户拥有权限的服务器列表
解决方案:获取用户权限相关的Discord服务器列表
嘿,刚好做过类似的Pycord+Quart开发场景,给你分享两个问题的可行方案:
一、获取用户拥有机器人权限的服务器列表
这个场景的核心是结合机器人已加入服务器 + 用户授权返回的服务器列表 + 权限校验——毕竟机器人只能访问自己已经加入的服务器,具体步骤如下:
先搞定OAuth授权的Scope
你的授权链接必须包含identify和guilds这两个scope,这样才能拿到用户的基本信息和服务器列表。在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'] # ...后续页面跳转或逻辑处理对比机器人服务器,校验用户权限
用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字段判断,具体操作:
同样确保OAuth Scope包含guilds
只有带guildsscope,返回的服务器数据才会包含用户的权限位数值。解析权限位,筛选高级权限服务器
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
相关产品推荐
相关产品推荐

