2016-11-12 113 views
1

我正在開發一個項目,我希望獲得spotify上所有已登錄用戶的播放列表。目前我可以登錄並查看用戶信息(通過在spotify上進行演示)。現在我想獲取登錄的用戶的播放列表,這是我卡住的地方。如何獲得用戶使用spotify web api的播放列表列表?

這是我的代碼:

app.get('/playlists', function(req, res) { 
    // your application requests authorization 
    var scope = 'playlist-read-private'; 
    res.redirect('https://api.spotify.com/v1/me/playlists'); 
}); 

是我自己寫的那些,但我不知道我怎樣才能使它發揮作用:

/** 
* 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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 

    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); 

與線條。

回答

2

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'。

+0

它看起來比我的代碼更好,但仍然出現「訪問令牌無效」錯誤。是否因爲var令牌是並保持空着? –

+0

我應該在哪裏將第一個代碼示例放在答案中。一個惠特「//使用訪問令牌......」 –

+1

@GillisWerrebrouck,只需在'console.log(body);'行之後添加'token = access_token'行。 – aring

相關問題