如何使用 spotify web api 获取用户的播放列表列表?
Posted
技术标签:
【中文标题】如何使用 spotify web api 获取用户的播放列表列表?【英文标题】:How can I get a list of playlists by user with the spotify web api? 【发布时间】:2017-03-26 12:03:37 【问题描述】:我正在做一个项目,我想获取登录用户在 spotify 上的所有播放列表的列表。目前我可以登录并查看用户信息(通过在 spotify 上进行演示)。现在我想获取已登录用户的播放列表,这就是我卡住的地方。
这是我的代码:
/**
* This is an example of a basic node.js script that performs
* the Authorization Code oAuth2 flow to authenticate against
* the Spotify Accounts.
*
* For more information, read
* https://developer.spotify.com/web-api/authorization-guide/#authorization_code_flow
*/
var express = require('express'); // Express web server framework
var request = require('request'); // "Request" library
var querystring = require('querystring');
var cookieParser = require('cookie-parser');
var client_id = '2e54c888b964418588d8c274d2b9dd5e'; // Your client id
var client_secret = 'c7b15e90a3cb4891b3dbcd79ed8bcfa0'; // Your secret
var redirect_uri = 'http://localhost:8888/callback'; // Your redirect uri
/**
* Generates a random string containing numbers and letters
* @param number length The length of the string
* @return string The generated string
*/
var generateRandomString = function(length)
var text = '';
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (var i = 0; i < length; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
;
var stateKey = 'spotify_auth_state';
var app = express();
app.use(express.static(__dirname + '/public'))
.use(cookieParser());
app.get('/login', function(req, res)
var state = generateRandomString(16);
res.cookie(stateKey, state);
// your application requests authorization
var scope = 'user-read-private user-read-email';
res.redirect('https://accounts.spotify.com/authorize?' +
querystring.stringify(
response_type: 'code',
client_id: client_id,
scope: scope,
redirect_uri: redirect_uri,
state: state
));
);
app.get('/playlists', function(req, res)
// your application requests authorization
var scope = 'playlist-read-private';
res.redirect('https://api.spotify.com/v1/me/playlists');
);
app.get('/callback', function(req, res)
// your application requests refresh and access tokens
// after checking the state parameter
var code = req.query.code || null;
var state = req.query.state || null;
var storedState = req.cookies ? req.cookies[stateKey] : null;
if (state === null || state !== storedState)
res.redirect('/#' +
querystring.stringify(
error: 'state_mismatch'
));
else
res.clearCookie(stateKey);
var authOptions =
url: 'https://accounts.spotify.com/api/token',
form:
code: code,
redirect_uri: redirect_uri,
grant_type: 'authorization_code'
,
headers:
'Authorization': 'Basic ' + (new Buffer(client_id + ':' + client_secret).toString('base64'))
,
json: true
;
request.post(authOptions, function(error, response, body)
if (!error && response.statusCode === 200)
var access_token = body.access_token,
refresh_token = body.refresh_token;
var options =
url: 'https://api.spotify.com/v1/me',
headers: 'Authorization': 'Bearer ' + access_token ,
json: true
;
// use the access token to access the Spotify Web API
request.get(options, function(error, response, body)
console.log(body);
);
// we can also pass the token to the browser to make requests from there
res.redirect('/#' +
querystring.stringify(
access_token: access_token,
refresh_token: refresh_token
));
else
res.redirect('/#' +
querystring.stringify(
error: 'invalid_token'
));
);
);
app.get('/refresh_token', function(req, res)
// requesting access token from refresh token
var refresh_token = req.query.refresh_token;
var authOptions =
url: 'https://accounts.spotify.com/api/token',
headers: 'Authorization': 'Basic ' + (new Buffer(client_id + ':' + client_secret).toString('base64')) ,
form:
grant_type: 'refresh_token',
refresh_token: refresh_token
,
json: true
;
request.post(authOptions, function(error, response, body)
if (!error && response.statusCode === 200)
var access_token = body.access_token;
res.send(
'access_token': access_token
);
);
);
console.log('Listening on 8888');
app.listen(8888);
带有:
的行app.get('/playlists', function(req, res)
// your application requests authorization
var scope = 'playlist-read-private';
res.redirect('https://api.spotify.com/v1/me/playlists');
);
是我自己写的,但我不知道如何使它工作。
【问题讨论】:
【参考方案1】:Spotify API playlists
端点 requires authentication token。
非常原始的例子,在这些行中你可以得到Auth Token
:
// use the access token to access the Spotify Web API
request.get(options, function(error, response, body)
console.log(body);
token = access_token;
);
然后,获取播放列表的代码:
var token = '';
app.get('/playlists', function(req, res)
var state = generateRandomString(16);
res.cookie(stateKey, state);
// your application requests authorization
var scope = 'playlist-read-private';
res.redirect('https://api.spotify.com/v1/me/playlists?' +
querystring.stringify(
access_token: token,
token_type: 'Bearer',
response_type: 'code',
client_id: client_id,
scope: scope,
redirect_uri: redirect_uri,
state: state
));
);
首先,您访问“http://localhost:8888/login”进行身份验证,然后访问“http://localhost:8888/playlists”获取播放列表。
【讨论】:
它看起来比我的代码好得多,但我仍然收到错误“无效的访问令牌”。是因为 var 令牌是空的吗? 我应该把第一个代码示例放在你的答案中。 one whit "// 使用访问令牌..." @GillisWerrebrouck,只需在token = access_token;
行之后添加行。
如何将此 json 发送到我的视图,我已经可以打印它,但这不是我想要的。我想在 html 页面中使用这些数据。我找到了一些关于 ejs 的信息,但不了解它是如何工作的以及我需要如何做。使用 ejs 是最好的方法还是有其他方法?
@GillisWerrebrouck,是时候用一些代码提出另一个问题了! :)以上是关于如何使用 spotify web api 获取用户的播放列表列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spotify Web API 获取当前播放/最近播放的歌曲
如何在新的 Spotify Web api 上获取用户的关注者和用户的关注用户?
请求从 Spotify Web API 获取用户信息导致 401 错误
获取 Spotify 用户当前播放的曲目名称 [Web API]