Spotify - получать и изменять пользовательские данные с помощью Implicit Flow - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь реализовать простой python клиент для API Spotify. Согласно Руководству по авторизации Spotify *1002* приложение может быть авторизовано двумя способами:

  • Авторизация приложения: Spotify авторизует ваше приложение для доступа к платформе Spotify (API, SDKs). и виджеты).
  • Авторизация пользователя: Spotify, как и пользователь, предоставляет вашему приложению разрешение на доступ и / или изменение собственных данных пользователя. Для получения информации об Аутентификации пользователя посмотрите Аутентификацию пользователя с OAuth 2.0. Для вызова Spotify Web API требуется авторизация пользователя вашего приложения. Чтобы получить эту авторизацию, ваше приложение генерирует вызов к конечной точке службы учетных записей / авторизации Spotify, передавая список областей, для которых запрашивается разрешение.

ПОЛНОМОЧИЯ КЛИЕНТА

В моей первой попытке использовалась авторизация приложения с использованием модуля oauth2 из Spotipy , поскольку для него не требуется передавать маркер, а только идентификатор клиента и секрет клиента, которые принадлежат разработчику приложения.

client.py

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

class SpotifyWrapper(spotipy.Spotify):
    def category_playlists(self, category, limit=50, offset=0):
        return self._get('browse/categories/%s/playlists' % category,
                         limit=limit,
                         offset=offset)

def get_api_client():
    # create a client authentication request
    client_cred = SpotifyClientCredentials(
        client_id=DevelopmentConfig.SPOTIFY_CLIENT_ID,
        client_secret=DevelopmentConfig.SPOTIFY_CLIENT_SECRET
    )

    # create a spotify client with a bearer token,
    # dynamically re-created if necessary
    return SpotifyWrapper(auth=client_cred.get_access_token())

Тогда я бы импортировал и объявил это здесь:

spotify_utilities.py

from app.resources.spotify.client import get_api_client

sp = get_api_client()

И чтобы отправлять запросы и получать плейлисты пользователей, передайте его так:

def get_user_playlist(username, sp):
    ids=[]
    playlists = sp.user_playlists(username)
    for playlist in playlists['items']:
        ids.append(playlist['id'])
        print("Name: {}, Number of songs: {}, Playlist ID: {} ".
              format(playlist['name'].encode('utf8'),
                     playlist['tracks']['total'],
                     playlist['id']))
    return ids

Это работает и будет получать пользовательский контент, , где пользователь является разработчиком приложения. .


IMPLICIT FLOW

Теперь я хочу перейти к Implicit Flow, посредством чего приложение запрашивает ЛЮБОГО пользователя, который использует для доступа и областей, и для этого потребуется токен.

Как только я получу токен, используя Javascript, я знаю, что могу использовать его для получения пользовательских данных, попадающих в API с помощью простых запросов:

GET_USER_PROFILE_ENDPOINT = 'https://api.spotify.com/v1/users/{user_id}'
GET_USER_PLAYLISTS_ENDPOINT = 'https://api.spotify.com/v1/users/{user_id}/playlists'

def get_user_profile(token, user_id):
    url = GET_USER_PROFILE_ENDPOINT.format(id=user_id)
    resp = requests.get(url, headers={"Authorization": "Bearer {}".format(token)})
    print (len(resp.json()))
    return resp.json()

def get_user_playlists(token, user_id):
    url = GET_USER_PLAYLISTS_ENDPOINT..format(id=user_id)
    resp = requests.get(url, headers={"Authorization": "Bearer {}".format(token)})
    print (len(resp.json()))
    return resp.json()

, но по порядку чтобы сначала получить (и изменить) пользовательские данные, мне нужно использовать этот токен для получения идентификатора пользователя .


Кроме того, в следующем примере формы Spotipy docs пользователь должен предоставить свое имя пользователя на терминале:

if __name__ == '__main__':
    if len(sys.argv) > 1:
        username = sys.argv[1]
    else:
        print("Whoops, need your username!")
        print("usage: python user_playlists.py [username]")
        sys.exit()

    token = util.prompt_for_user_token(username)

    if token:
        sp = spotipy.Spotify(auth=token)
        playlists = sp.user_playlists(username)

После прочтения документов из Spotify и Spotify, некоторые вещи, которые до сих пор не ясны:

  1. Можно ли получить этот идентификатор пользователя только путем передачи токена?

  2. Должен ли пользователь приложения обязательно указывать свой Spotify username через форму в браузере, помимо авторизации приложения при запросе аутентификации?

  3. Возможно ли настроить оболочку выше и реализовать клиент, который рассматривает параметры, необходимые для неявного потока? Будет просто spotify = spotipy.Spotify(auth=token) работать и получать текущие данные usr?

1 Ответ

0 голосов
/ 28 января 2020

Кроме того, в следующем примере из документов Spotipy пользователь должен указать свое имя пользователя на терминале:

Это потому, что Spotipy кэширует токены на диске. Когда пользователь не указывает путь к кешу, имя пользователя просто добавляется к расширению файла, как показано здесь . Таким образом, указанное имя пользователя никогда не передается какой-либо конечной точке API Spotify.

1) Можно ли получить этот идентификатор пользователя только при передаче токена?

Да, использование /v1/me вместо /v1/users/{user_id} сделает то же самое, если вы используете токен доступа, сгенерированный потоком кода авторизации или потоком неявного предоставления.

2) Необходимо, чтобы пользователь приложения обязательно указал свое имя пользователя Spotify через форму в браузере, кроме авторизации приложения при запросе аутентификации?

Нет, как видно из первого абзаца моего ответа.

3) Это так? Можно ли настроить оболочку выше и реализовать клиента, который рассматривает параметры, необходимые для неявного потока? Будет ли работать просто spotify = spotipy.Spotify (auth = token) и получать текущие данные usr?

Похоже, что Spotipy сейчас использует только поток кода авторизации. Из-за того, что вы сказали, что вы

пытаетесь реализовать простой python клиент для API Spotify.

, вы просто должны реализовать поток Implicit Grant в своем приложении. В этом есть примеры для всех трех потоков авторизации Spotify.

...