【发布时间】:2020-05-13 09:04:53
【问题描述】:
我正在尝试为 Spotify api 实现一个简单的 python 客户端。根据Spotify's Authorization Guide,可以通过两种方式对app进行授权:
- 应用授权:Spotify 授权您的应用访问 Spotify 平台(API、SDK 和小部件)。
- 用户授权:Spotify 以及用户授予您的应用访问和/或修改用户自己的数据的权限。有关用户身份验证的信息,请参阅使用 OAuth 2.0 进行用户身份验证。对 Spotify Web API 的调用需要您的应用程序用户的授权。为了获得该授权,您的应用程序会生成对 Spotify Accounts Service /authorize 端点的调用,并传递寻求访问权限的范围列表。
客户凭证
我第一次尝试使用来自Spotipy 的oauth2 模块的应用授权,因为它不需要传递令牌,而只需要属于应用开发者的客户端ID 和客户端密码。
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
这可行并且会获取用户内容,用户是应用开发者。
隐式流
现在我想转到隐式流,应用程序会询问任何使用访问权限和范围的用户,为此需要一个令牌。
一旦我使用 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()
但为了首先获取(和更改)用户数据,我需要使用此令牌来获取 用户 ID。
此外,通过以下示例表单 Spotipy 文档,用户必须在终端提供他的 用户名:
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 的文档后,有些东西还不清楚:
是否可以仅通过传递令牌来获取此 USER ID?
-
应用用户是否必须通过浏览器中的表单提供其 Spotify 用户名,此外在提示身份验证时授权应用?
是否可以调整上面的包装器并实现一个考虑隐式流所需参数的客户端?只需
spotify = spotipy.Spotify(auth=token)工作并获取当前的 usr 数据吗?
【问题讨论】:
标签: python oauth-2.0 spotify spotipy