通过 Google Apps 脚本进行 Spotify API 授权

Posted

技术标签:

【中文标题】通过 Google Apps 脚本进行 Spotify API 授权【英文标题】:Spotify API authorisation via Google Apps Script 【发布时间】:2019-07-18 07:31:07 【问题描述】:

我正在使用以下代码通过 Google Apps 脚本向 Spotify API 发出请求:

function search() 

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var artist = sheet.getRange(1,1).getValue();
  artist = encodeURIComponent(artist.trim());
  var result = searchSpotify(artist);
  Logger.log(result);


function searchSpotify(artist) 
  //searches spotify and returns artist ID
  var response = UrlFetchApp.fetch("https://api.spotify.com/v1/search?q=" + artist + "&type=artist&limit=1", 
   method: "GET",
    headers:
      "contentType": "application/json",
      'Authorization': "Bearer BQBnpSUdaEweirImw23yh2DH8OGhTwh5a_VnY_fgb2BPML0KvFvYd04CaEdUhQN9N4ZUXMIVfJ1MjFe1_j0Gl0UoHDhcoC_dklluZyOkq8Bo6i2_wfxSbGzP3k5EUjUKuULAnmTwCdkdZQnl-SNU0Co"
            ,
  );
  json = response.getContentText();
  var data = JSON.parse(json);
  var uri = data.artists.items[0].uri.slice(15);
  var getArtists = getRelatedArtists(uri);
  Logger.log(getArtists);
  return getArtists;


function getRelatedArtists(uri) 
  //searches related artists with the returned ID
  var response = UrlFetchApp.fetch("https://api.spotify.com/v1/artists/" + uri + "/related-artists", 
   method: "GET",
    headers:
      "contentType": "application/json",
      'Authorization': "Bearer BQBnpSUdaEweirImw23yh2DH8OGhTwh5a_VnY_fgb2BPML0KvFvYd04CaEdUhQN9N4ZUXMIVfJ1MjFe1_j0Gl0UoHDhcoC_dklluZyOkq8Bo6i2_wfxSbGzP3k5EUjUKuULAnmTwCdkdZQnl-SNU0Co"
            ,
  );
  json = response.getContentText();
  var data = JSON.parse(json);
  var listArtists = [];
  for(var i = 0, len = data.artists.length; i < len; i++)
    listArtists.push(data.artists[i].name);
                 
  return listArtists;

使用 Spotify 网站上的临时授权令牌可以正常工作,但此令牌每小时刷新一次,因此显然没用。

我正在尝试使用我在 Spotify 上设置的我自己的授权令牌和 ID,但是我正在努力完成这项工作。据我了解,我可能需要在开始时添加一个额外的步骤来启动授权过程,但我已经尝试了所有建议的方法,但仍然收到服务器错误。

【问题讨论】:

我认为提供API的规范文档会帮助用户思考你的问题。 对不起,完整的文档很长,所以我在这里链接了它。它描述了几个授权流程选项:developer.spotify.com/documentation/general/guides/… 我还应该补充一点,我正在尝试使用底部的客户端凭据流。 感谢您的回复。您已经拥有了 client_id 和 client_secret。并且您想使用“客户端凭据流”检索访问令牌。您想了解“客户端凭据流”的 Google Apps 脚本。我的理解正确吗? 没错。每当我尝试连接时,都会收到一条错误消息,指出 grant_type 参数无效。 【参考方案1】:

从文档看来,“Client Credentials Flow”使用的是基本授权。

为了使用它,首先,您需要检索“client_id”和“client_secret”。

示例脚本:

var clientId = "### client id ###"; // Please set here.
var clientSecret = "### client secret ###"; // Please set here.

var url = "https://accounts.spotify.com/api/token";
var params = 
  method: "post",
  headers: "Authorization" : "Basic " + Utilities.base64Encode(clientId + ":" + clientSecret),
  payload: grant_type: "client_credentials",
;
var res = UrlFetchApp.fetch(url, params);
Logger.log(res.getContentText())
在 curl 示例中,grant_type 需要以表单形式发送。

结果:

文档说响应如下。


   "access_token": "NgCXRKc...MzYjw",
   "token_type": "bearer",
   "expires_in": 3600,

注意:

这是一个简单的示例脚本。因此,请根据您的情况进行修改。 我通过文档中的示例 curl 准备了此示例脚本。

参考:

Client Credentials Flow

编辑:

作为您的下一个问题,您希望从返回的值中检索访问令牌。如果我的理解是正确的,那么这个修改呢?请修改我的脚本如下。

发件人:

Logger.log(res.getContentText())

收件人:

var obj = JSON.parse(res.getContentText());
Logger.log(obj.access_token)
从 API 返回值时,它以字符串形式返回。因此需要使用JSON.parse()将其解析为对象。

【讨论】:

啊!我没有正确使用 Utilities.base64Encode。只有一件事,可能非常简单,但它返回以下对象...“access_token”:“我现在已经隐藏了这个”,“token_type”:“Bearer”,“expires_in”:3600,“scope” :“”。我正在努力将访问令牌的内容添加到变量中,并想知道是否是因为对象键在引号中。变量返回未定义。 @herman 感谢您的回复。从您的回复中,发现脚本运行良好。但我为我不完整的答案道歉。我添加了一个修改点。你能确认一下吗? @herman 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。 是的,您的解决方案在这里完美运行。再次感谢您。 @herman 欢迎。谢谢你让我知道。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果找不到按钮,请随时告诉我。 ***.com/help/accepted-answer

以上是关于通过 Google Apps 脚本进行 Spotify API 授权的主要内容,如果未能解决你的问题,请参考以下文章

仅通过 Google Apps 脚本值修改 Google 电子表格

使用 Apps 脚本对 Google 表格中的边框进行条件格式设置

是否可以通过 Apps 脚本删除 Google 其他联系人?

如何通过 Google 表格中的二维数组通过 Apps 脚本插入 Big Query?

如何在 Google Apps 脚本中使用服务帐户对 Google 表格进行身份验证

Google Apps 脚本中的 PayPal REST API 错误 400