Spotipy中如何正确配置scope参数获取数据访问权限
问题核心
你的代码存在两个本质错误,导致scope配置不生效:
- 你选用的
SpotifyClientCredentials属于客户端凭证认证模式,仅能访问公开的Spotify资源(比如公开播放列表、公开曲目元数据),完全不支持用户权限scope配置,也无法访问任何和用户私人数据相关的接口。你调用的current_user_top_artists接口需要读取用户收听记录这类私有数据,必须走用户OAuth授权流程。 - 代码语法存在错误:你先实例化了
client_credentials_manager对象,后续又把这个对象当函数传入scope参数调用,写法本身不符合Spotipy的调用规范。
修正方案
把认证类替换为支持用户授权的SpotifyOAuth,scope参数直接在初始化认证管理器时传入即可,同时需要配置回调地址完成授权流程。另外你原来把用户top数据的接口写在了播放列表遍历循环里,会重复发起无效请求,需要移到循环外部。
修正后的可运行代码如下:
import spotipy from spotipy.oauth2 import SpotifyOAuth # 配置需要的权限范围 scope = 'user-top-read' # 初始化Spotify客户端,走用户OAuth授权 sp = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id='6b78bf9e892b4e8184c8e906885108bc', client_secret='3c2c0c7374374ab98062f342860369a5', redirect_uri='http://localhost:8888/callback', scope=scope )) # 拉取用户中周期内收听量Top10的艺人,不要放在循环里重复调用 user_top_artists = sp.current_user_top_artists(limit=10, offset=0, time_range='medium_term') print("收听量Top10艺人:") for rank, artist in enumerate(user_top_artists['items'], start=1): print(f"{rank}. {artist['name']}") # 如果要拉取Top10歌曲,直接调用对应接口即可 # user_top_tracks = sp.current_user_top_tracks(limit=10, offset=0, time_range='medium_term') # 处理公开播放列表内容 playlist_link = "https://open.spotify.com/playlist/75bo0xrhJrSf0Gf0iqEPuS" playlist_URI = playlist_link.split("/")[-1].split("?")[0] playlist_items = sp.playlist_tracks(playlist_URI)["items"] for track in playlist_items: track_uri = track["track"]["uri"] track_name = track["track"]["name"] print(f"播放列表曲目:{track_name}")
注意事项
- 第一次运行代码会自动唤起浏览器跳转到Spotify授权页面,登录需要查询的账号并同意授权即可,授权token会自动缓存在本地,后续运行不需要重复登录。
- 需要提前进入Spotify开发者后台,在对应应用的设置页把你代码里填的
http://localhost:8888/callback添加到「Redirect URIs」列表中保存,否则会报重定向地址不匹配的错误。 - 接口的
time_range参数支持三个值:long_term(1年以上数据)、medium_term(近6个月数据,默认值)、short_term(近4周数据),可以根据需求自行调整。
内容的提问来源于stack exchange,提问作者PythonSp
相关产品推荐
相关产品推荐

