2016-06-29 12 views
0

Spotify APIのエンドポイントは「ユーザーの保存したトラックを取得する」GET https://api.spotify.com/v1/me/tracksですが、URLにはmedocumentationには現在のユーザーのみが表示されています。現在のユーザー以外のユーザーに関する情報にアクセスする方法、または現在のユーザーを変更する方法はありますか?特定のユーザーに保存されたトラックを取得する方法、または現在のユーザーを変更する方法はありますか?

たとえば、userAがログインすると、userAのアクセス権と更新トークンが取得されます。 userBがログインし、userAを現在のユーザーに置き換えると、私はuserBのトークンを取得します。 userAに関する情報を要求するにはどうすればいいですか?

答えて

0

ユーザーを認証して得たトークンを保存する必要があります。 は、ユーザーのセッションを使用していると言う:

  1. ユーザーAログの
  2. あなたがアクセスを取得し、ユーザA
  3. あなたはユーザーAのセッションにこれらのトークンを保存するためにトークンを更新します。
  4. ユーザBログに。
  5. あなたはアクセスを取得し、ユーザB
  6. あなたはユーザーBのセッションにこれらのトークンを保存するためにトークンを更新します。

これは、すでにユーザーセッションを実装したのと同じ方法で行います。 したがって、ユーザーがあなたのリダイレクトURIに到達すると、受け取ったトークンをセッションに保存します。 Spotify APIを使用する必要がある場合は、ユーザーセッションで保存されたトークンを使用します。


しかし、これを1人のエンドユーザーに実行したい場合は、Webサーバーを使用すると少し難しくなります。 しかし、CLIアプリケーションを使用すると、やや簡単になります。

ユーザーAとBをアプリケーションにログオンし、両方のトークンを手動で個別に保存することで、実行したい操作を実行します。 これは、2回コールして結果を2つの変数に保存する認証機能を作成するのと同じくらい簡単です。 その後、保存したトークンを使用してAPIを呼び出すことができます。 ユーザーAの保存したトラックを取得する場合は、ユーザーAのトークンを使用します。

Requestsを使用して、ユーザのトラックとユーザ情報を異なるスコープで取得する、Python 3の低レベルの実装例です。コメントがコードの部分である場合authorization code flow

import time 
import urllib.parse as parse 
import webbrowser 

import requests 
from requests.auth import HTTPBasicAuth 

OAUTH_AUTHORIZE_URL = 'https://accounts.spotify.com/authorize' 
OAUTH_TOKEN_URL = 'https://accounts.spotify.com/api/token' 

# Change to your application settings 
class Settings: 
    client_id = '' 
    client_secret = '' 
    redirect_uri = '' 


def authenticate(scope=None): 
    '''Implement OAuth 2 Spotify authentication''' 
    # Application: Request authorization to access data 
    payload = {'client_id': Settings.client_id, 
       'response_type': 'code', 
       'redirect_uri': Settings.redirect_uri, 
       'show_dialog': 'true'} # allow second account to login 
    if scope: 
     payload['scope'] = scope 
    auth_url = '{}?{}'.format(OAUTH_AUTHORIZE_URL, parse.urlencode(payload)) 
    # Spotify: Displays scopes & prompts user to login (if required) 
    # User: Logs in, authorizes access 
    webbrowser.open(auth_url) 

    response = input('Enter the URL you were redirected to: ') 
    code = parse.parse_qs(parse.urlparse(response).query)['code'][0] 

    payload = {'redirect_uri': Settings.redirect_uri, 
       'code': code, 
       'grant_type': 'authorization_code'} 
    if scope: 
     payload['scope'] = scope 

    # Application: Request access and refresh tokens 
    # Spotify: Returns access and refresh tokens 
    auth = HTTPBasicAuth(Settings.client_id, Settings.client_secret) 
    response = requests.post(OAUTH_TOKEN_URL, data=payload, auth=auth) 
    if response.status_code != 200: 
     response.raise_for_status() 
    token_info = response.json() 
    token_info['expires_at'] = int(time.time()) + token_info['expires_in'] 
    token_info['scope'] = scope 
    return token_info 


if __name__ == '__main__': 
    user_a = authenticate(scope='user-library-read') 
    user_b = authenticate(scope='user-read-email user-read-private user-read-birthdate') 
    print('user_a', user_a) 
    print('user_b', user_b) 

    for url in ['https://api.spotify.com/v1/me/tracks', 
       'https://api.spotify.com/v1/me']: 
     for user in [user_a, user_b]: 
      token = 'Bearer ' + user['access_token'] 
      # Application: Uses access token in requests to Web API 
      # Spotify: Returns request data 
      r = requests.get(url, headers={'authorization': token}) 
      if r.status_code != 200: 
       print(r.text) 
      else: 
       print([ 
        '{}: {}'.format(key, str(value)[:20]) 
        for key, value in r.json().items() 
       ]) 
関連する問題