通过 Google Apps 脚本获得 Spotify API 授权
Spotify API authorisation via Google Apps Script
我正在使用以下代码通过 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,但是我正在努力完成这项工作。据我了解,我可能需要在开始时添加一个额外的步骤来启动授权过程,但我已经尝试了所有建议的方法,但仍然收到服务器错误。
从文档来看,好像"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 准备了这个示例脚本。
参考:
编辑:
作为下一期,您希望从返回值中检索访问令牌。如果我的理解是正确的,这个修改怎么样?请修改我的脚本如下。
发件人:
Logger.log(res.getContentText())
收件人:
var obj = JSON.parse(res.getContentText());
Logger.log(obj.access_token)
- 当值从 API 返回时,它 returns 作为字符串。所以需要使用
JSON.parse()
. 将其解析为一个对象
我正在使用以下代码通过 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,但是我正在努力完成这项工作。据我了解,我可能需要在开始时添加一个额外的步骤来启动授权过程,但我已经尝试了所有建议的方法,但仍然收到服务器错误。
从文档来看,好像"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 准备了这个示例脚本。
参考:
编辑:
作为下一期,您希望从返回值中检索访问令牌。如果我的理解是正确的,这个修改怎么样?请修改我的脚本如下。
发件人:
Logger.log(res.getContentText())
收件人:
var obj = JSON.parse(res.getContentText());
Logger.log(obj.access_token)
- 当值从 API 返回时,它 returns 作为字符串。所以需要使用
JSON.parse()
. 将其解析为一个对象