我正在尝试为Spotify api实现一个简单的python客户机。根据Spotify授权指南的说法,应用程序可以通过两种方式获得授权:
客户端凭证
我第一次尝试使用来自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的文档之后,有些事情仍然不清楚:
spotify = spotipy.Spotify(auth=token)
会工作并获得当前的usr数据吗?发布于 2020-01-28 20:56:45
此外,通过下面的Spotipy文档示例,用户必须在终端提供他的用户名:
那是因为Spotipy在磁盘上缓存令牌。当用户没有指定缓存路径时,用户名就会被附加到文件扩展名中,如这里所示。因此,指定的用户名永远不会传输到任何Spotify API端点。
( 1)是否可以仅通过传递令牌获得此用户ID?
是的,如果您使用授权代码流或隐式格兰特流生成的访问令牌,那么使用/v1/me
而不是/v1/users/{user_id}
就可以做到这一点。
2)应用程序用户必须通过浏览器中的表单提供Spotify用户名,并且在提示身份验证时授权应用程序吗?
不,正如我在回答的第一段所看到的。
( 3)是否有可能对上面的包装进行调整,并实现一个客户端来考虑隐式流所需的参数?spotify = spotipy.Spotify(auth=token)是否能够工作并获取当前的usr数据?
Spotipy现在似乎只使用授权代码流。因为你说你是
尝试为Spotify api实现一个简单的python客户机。
您应该在应用程序中实现隐式格兰特流。这提供了所有三个Spotify授权流的示例。
https://stackoverflow.com/questions/59940448
复制相似问题