Arhn - архитектура программирования

Как я могу получить список плейлистов по пользователю с помощью веб-API Spotify?

Я работаю над проектом и хотел бы получить список всех плейлистов вошедшего в систему пользователя на 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 требует токена аутентификации.

Очень примитивный пример, в этих строках можно получить 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' для списков воспроизведения.

12.11.2016
  • Это выглядит намного лучше, чем мой код, но все же я получаю сообщение об ошибке Неверный токен доступа. Это потому, что токен var есть и остается пустым? 12.11.2016
  • Где я должен поместить первый пример кода в вашем ответе. Один из них // использует токен доступа для ... 12.11.2016
  • @GillisWerrebrouck, просто добавьте строку token = access_token; сразу после строки console.log(body);. 12.11.2016
  • Как мне отправить этот json на мой взгляд, я уже могу его распечатать, но это не то, что я хочу. Я хотел бы использовать эти данные на странице HTML. Я нашел некоторую информацию о ejs, но не понимаю, как это работает и как мне это нужно делать. Это лучший способ сделать это с помощью ejs или есть другой способ? 17.11.2016
  • @GillisWerrebrouck, тогда время для другого вопроса с кодом! :) 17.11.2016
  • Вот: stackoverflow.com/questions/40659653/ 17.11.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..