如何为特定用户保存曲目或更改当前用户?

时间:2016-06-29 14:43:23

标签: spotify

Spotify API有一个端点"获取用户已保存的曲目" GET https://api.spotify.com/v1/me/tracks但正如您在网址medocumentation中看到的那样,这仅适用于当前用户。如何访问有关非当前用户的信息,或更改当前用户?

例如,userA登录后,我获得了userA的访问权限和刷新令牌。 userB登录,将userA替换为当前用户,我获得了userB的令牌。我现在如何提出有关userA的信息请求?

1 个答案:

答案 0 :(得分:0)

您需要存储通过身份验证用户获得的令牌。 假设您正在使用用户会话:

  1. 用户A登录。
  2. 您可以获得用户A的访问权限和刷新令牌。
  3. 您将这些令牌保存到用户A的会话中。
  4. 用户B登录。
  5. 您可以获得用户B的访问权限和刷新令牌。
  6. 您将这些令牌保存到用户B的会话中。
  7. 您执行此操作的方式与已实施用户会话的方式相同。 因此,当用户登陆您的重定向URI时,您将收到的令牌保存到其会话中。 然后,当您需要使用Spotify API时,您可以使用保存在用户会话中的令牌。

    如果您想为一个最终用户执行此操作,那么使用Web服务器会让事情变得更难。 但是使用CLI应用程序可以更轻松一些。

    您要做的是将用户A和B记录到您的应用程序中,手动单独保存两个令牌。 这就像制作两次调用的身份验证功能一样简单,并将结果保存到两个变量中。 之后,您可以使用保存的令牌调用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()
                    ])