如何通过Discord API获取指定服务器信息及解决401授权异常
解决Discord API获取特定服务器信息的401权限问题
我来帮你一步步排查和解决这个问题,先从代码里的致命错误说起:
一、先修复获取Access Token的代码漏洞
你当前获取Token的代码有两个关键错误,这大概率是导致401的根源:
- 参数分隔符错误:你用了HTML转义的
&拼接参数,Discord的Token端点只能识别普通的&,这会导致参数解析失败,拿到的Token可能无效。 - 请求头缺失:POST请求Token时必须指定
Content-Type: application/x-www-form-urlencoded,否则Discord无法正确解析参数。
修正后的代码(用form字段自动处理参数,避免手动拼接出错):
const key = req.query.code; const options = { uri: 'https://discord.com/api/oauth2/token', // 官方推荐使用discord.com域名,替代旧的discordapp.com method: 'POST', headers: { 'Authorization': `Basic ${creds}`, 'Content-Type': 'application/x-www-form-urlencoded' // 必须添加这个请求头 }, form: { grant_type: 'authorization_code', code: key, redirect_uri: redirect } }; request(options, (err, response, body) => { if (err) return console.log(err); console.log(body); // 这里会返回包含token_type=Bearer的正确响应 });
二、搞清楚Token类型的正确用法
你试过token_type = bot和Bearer,这里必须明确:
- 你通过OAuth2授权码流程拿到的是用户AccessToken,不是机器人账号专用的Token,所以请求头必须用
Bearer,绝对不能用bot——bot类型只给机器人Token使用,和用户授权的Token是完全独立的体系,用错了必然返回401。
正确的请求头格式:
headers: { authorization: `Bearer ${access_token}` }
三、获取特定服务器信息的权限要求
你当前的权限范围里有guilds,这个权限仅能获取自己已加入的服务器列表,要获取单个服务器的详细信息,需要满足两个条件:
- 你确实是目标服务器的成员(这个你应该满足,毕竟能在列表里看到它)
- 如果需要获取服务器敏感信息(比如成员列表、频道详情),需要在OAuth授权时额外申请
guilds.members.read、channels.read等权限;如果只是获取基础信息(名称、图标、ID等),只要你是服务器成员,用有效的Bearer Token就能访问。
另外,建议使用Discord API的最新稳定版本(比如v10),端点格式改成:
https://discord.com/api/v10/guilds/${guilds.id}
四、更新服务器信息的正确姿势
如果要修改服务器信息(比如名称、图标),要求会更高:
- 你必须在目标服务器中拥有
MANAGE_GUILD(管理服务器)权限 - OAuth授权时要申请
guilds.modify权限范围 - 请求方法使用
PATCH,请求体中带上要更新的字段(比如{ "name": "新服务器名称" }),同样用Bearer Token作为授权头
五、最后验证Token有效性
如果改完以上内容还是有问题,先调用GET https://discord.com/api/v10/users/@me接口,用你的Bearer Token请求:
- 如果能返回你的用户信息,说明Token有效,问题可能出在服务器隐私设置(比如服务器限制了API访问)
- 如果不能返回信息,说明Token本身无效,再回头检查获取Token的流程
内容的提问来源于stack exchange,提问作者Blayke




