我正在构建一个小程序,当前由一个.js文件组成,该文件输出特定Spotify列表的所有曲目。目前,我还没有建立一个自动刷新访问令牌的系统,这会在一小时后破坏程序。我不确定如何实现此功能,所以我在这里寻求帮助。
我有访问令牌和刷新令牌。这是我的代码,目前可以使用一个小时。
var request = require("request");
var user = USERNAME;
var token = "Bearer BQBpRXd...Yfofi8A";
var playlists_url = "https://api.spotify.com/v1/users/"+user+"/playlists";
request({url:playlists_url, headers:{"Authorization":token}}, function(err, res){
if (res){
var playlists = JSON.parse(res.body);
playlists.items.forEach(function(playlist, i){
if (playlists.items[i].id === "4N2...2PDX") {
var playlist_url = playlists.items[i].href
request({url:playlist_url, headers:{"Authorization":token}}, function(err, res){
if (res){
var playlist = JSON.parse(res.body);
playlist.tracks.items.slice().reverse().forEach(function(track){
console.log(track.track.name);
});
}
});
}
});
}
});
我希望有人可以帮助我,也许为我提供一些更好的代码,对我的旅途有帮助。
答案 0 :(得分:1)
执行此操作的一种方法是,一旦请求中收到未经授权/过期的令牌响应,就执行令牌刷新。参见Spotify API docs。
例如,您可以执行以下操作:
注意: 此代码未经测试,可能需要对您进行一些调整。
var request = require("request");
var user = USERNAME;
const refresh_token = "REFRESH_TOKEN_FROM_INITIAL_AUTH";
let access_token = "AUTH_TOKEN_FROM_INITIAL_AUTH";
let token = "BASE64_ENCODED_USER:ACCESS_TOKEN?";
getPlaylists();
function refreshAuthToken(callback) {
const refreshBody = querystring.stringify({
grant_type: 'refresh_token',
refresh_token: refresh_token,
});
const req = request(
{
// Assuming you have this setup as: https://accounts.spotify.com/api/token
url: refresh_token_url,
method: 'POST',
headers:{
// Authorization: Basic <base64 encoded client_id:client_secret>
'Authorization': token
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(refreshBody)
}
},
(err, res) => {
if (res) {
const resData = JSON.parse(res.body);
// Set new access tokens
access_token = resData.access_token;
// setup your Authorization token, e.g.
token = btoa(access_token);
callback();
} else if (err) {
// Handle error...
}
}
);
req.write(refreshBody);
}
function getPlaylists() {
request(
{
url: playlists_url,
headers:{
"Authorization": token
}
},
function(err, res) {
if (res) {
var playlists = JSON.parse(res.body);
playlists.items.forEach(function(playlist, i) {
if (playlists.items[i].id === "4N2...2PDX") {
var playlist_url = playlists.items[i].href;
request(
{
url:playlist_url,
headers:{"Authorization":token}
},
function(err, res) {
if (res) {
var playlist = JSON.parse(res.body);
playlist.tracks.items.slice().reverse().forEach(function(track){
console.log(track.track.name);
});
}
}
);
}
});
} else if (err) {
// Check what type of error
if (res.statusCode === 401) {
// Refresh the token, if possible
refreshAuthentication(getPlaylists);
}
}
}
);
}