通过 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?