如何使用 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]

Spotify Web API - 客户端凭据 - 访问用户播放列表

Spotify node web api - 多个用户的麻烦