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

如何通过Discord API获取指定服务器信息及解决401授权异常

解决Discord API获取特定服务器信息的401权限问题

我来帮你一步步排查和解决这个问题,先从代码里的致命错误说起:

一、先修复获取Access Token的代码漏洞

你当前获取Token的代码有两个关键错误,这大概率是导致401的根源:

  1. 参数分隔符错误:你用了HTML转义的&拼接参数,Discord的Token端点只能识别普通的&,这会导致参数解析失败,拿到的Token可能无效。
  2. 请求头缺失: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 = botBearer,这里必须明确:

  • 你通过OAuth2授权码流程拿到的是用户AccessToken,不是机器人账号专用的Token,所以请求头必须用Bearer,绝对不能用bot——bot类型只给机器人Token使用,和用户授权的Token是完全独立的体系,用错了必然返回401。

正确的请求头格式:

headers: { authorization: `Bearer ${access_token}` }

三、获取特定服务器信息的权限要求

你当前的权限范围里有guilds,这个权限仅能获取自己已加入的服务器列表,要获取单个服务器的详细信息,需要满足两个条件:

  • 你确实是目标服务器的成员(这个你应该满足,毕竟能在列表里看到它)
  • 如果需要获取服务器敏感信息(比如成员列表、频道详情),需要在OAuth授权时额外申请guilds.members.readchannels.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

火山引擎 最新活动