首页 > 解决方案 > Discord API 告诉我:“401:未经授权”,当我使用 Google 脚本进行 GET 时:“UrlFetchApp.fetch()”

问题描述

我正在建立一个 api 连接。我想从我的应用程序的不和谐 api 获取信息。

所以我实现了 OAuth2 没有任何问题,我有我的访问令牌。然后我尝试查询一些端点(/users/@me,/users/@me/guilds,...),但每次我得到同样的错误。

我在标头中发送我的授权令牌,但它仍然返回错误 401。

我使用生成的 url 调用脚本: https://discordapp.com/api/oauth2/authorize?client_id=XYZ&redirect_uri=https%3A%2F%2Fscript.google.com%2Fmacros%2Fs%2FAKfycbyyt9-FiVv0zXOr8p8pMfojwEs2AXvBftVN1xdWeU3UQ1xgURD%2Fexec&&response_type=codescope =识别

这是我的“身份验证码”:

function doGet(e){
  if(typeof e.parameter.code !== 'undefined') {
    var code = e.parameter.code;
    getAccessToken(code);
  }
  return ContentService.createTextOutput('someThink..');
}

function getAccessToken(code){
  var API_TOKEN_URL = 'https://discordapp.com/api/oauth2/token'
  var CLIENT_ID = 'XYZ'
  var CLIENT_SECRET = 'XYZ'
  var REDIRECT_URI = 'https://script.google.com/macros/s/AKfycbyyt9-FiVv0zXOr8p8pMfojwEs2AXvBftVN1xdWeU3UQ1xgURD/exec'
  data = {
    'client_id': CLIENT_ID,
    'client_secret': CLIENT_SECRET,
    'grant_type': 'authorization_code',
    'code': code,
    'redirect_uri': REDIRECT_URI,
    'scope': 'identify'
  }
  header = {
    'method' : 'post',
    'Content-Type': 'application/x-www-form-urlencoded',
    'payload' : data
  }
  var result = UrlFetchApp.fetch(API_TOKEN_URL, header);
  if (result.getResponseCode() == 200) {
    var params = JSON.parse(result.getContentText());
    Logger.log(params.access_token); // all is fine
    getUser(params.access_token, params.token_type)
  }  
}

这段代码是我的 API 请求:

function getUser(accessToken, token_type){
  var API_USERS_URL = 'https://discordapp.com/api/users/@me'; 
  header2 = {
    'method' : 'GET',
    'Authorization': token_type + ' ' + accessToken,
    // I tested all of them
    // 'followRedirects' : true,
    // 'muteHttpExceptions': true,
    // 'Content-Type': 'application/json',
    // 'Content-Type': 'application/x-www-form-urlencoded',
  }
  var resultUsers = UrlFetchApp.fetch(API_USERS_URL, header2); // ERROR HERE !
  if (resultUsers.getResponseCode() == 200) {
    var paramsUser = JSON.parse(result.getContentText());
    Logger.log(paramsUser);
  }  
}

我接受具有相同范围的不和谐连接:识别。

我很努力,但我没有成功。每次同样的错误:

{"code": 0, "message": "401: Unauthorized"}

标签: google-apps-scriptoauth-2.0discordhttp-status-code-401

解决方案


您将标头作为params/options参数发送到UrlFetchApp.fetch(). 将标头作为标头参数发送到options

var resultUsers = UrlFetchApp.fetch(API_USERS_URL,{headers: header2});

推荐阅读