首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spotify -使用隐式流获取和更改用户数据

Spotify -使用隐式流获取和更改用户数据
EN

Stack Overflow用户
提问于 2020-01-27 23:40:53
回答 1查看 1.1K关注 0票数 0

我正在尝试为Spotify api实现一个简单的python客户机。根据Spotify授权指南的说法,应用程序可以通过两种方式获得授权:

  • 应用授权: Spotify授权您的应用程序访问Spotify平台( App、SDK和小部件)。
  • 用户授权: Spotify以及用户授予应用程序访问和/或修改用户自身数据的权限。有关用户身份验证的信息,请参阅使用OAuth 2.0进行的用户身份验证。对Spotify Web API的调用需要应用程序用户的授权。要获得该授权,应用程序将生成对Spotify帐户服务/authorize端点的调用,并传递请求访问权限的作用域列表。

客户端凭证

我第一次尝试使用来自oauth2史波蒂模块进行应用授权,因为它不需要传递令牌,而只需要客户端id和客户端机密,它们属于应用程序开发人员。

client.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
from app.resources.spotify.client import get_api_client

sp = get_api_client()

为了发出请求并获得用户播放列表,请按如下方式传递:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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文档示例,用户必须在终端提供他的用户名

代码语言:javascript
运行
复制
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的文档之后,有些事情仍然不清楚:

  1. 是否可以仅通过传递令牌获得此用户ID?
  2. 应用程序用户必须通过浏览器中的表单提供他的Spotify 用户名,并且在提示身份验证时授权应用程序吗?
  3. 是否有可能对上面的包装进行调整,并实现一个客户端来考虑隐式流所需的参数?简单地说,spotify = spotipy.Spotify(auth=token)会工作并获得当前的usr数据吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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授权流的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59940448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档