Spotify API有一个端点"获取用户已保存的曲目" GET https://api.spotify.com/v1/me/tracks
但正如您在网址me
和documentation中看到的那样,这仅适用于当前用户。如何访问有关非当前用户的信息,或更改当前用户?
例如,userA登录后,我获得了userA的访问权限和刷新令牌。 userB登录,将userA替换为当前用户,我获得了userB的令牌。我现在如何提出有关userA的信息请求?
答案 0 :(得分:0)
您需要存储通过身份验证用户获得的令牌。 假设您正在使用用户会话:
您执行此操作的方式与已实施用户会话的方式相同。 因此,当用户登陆您的重定向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()
])