Spotify API创建播放列表时出现403权限不足错误求助
Spotify API 403 权限不足问题排查
每次运行以下代码都会返回403 Insufficient client scope错误,但5分钟前还能正常工作,唯一改动是修改了变量名。已尝试重新运行、更换代码、切换IDE、创建新Spotify项目,均无效。
出错代码
username = '9qk7akrruah30sd2qix0x4lmp' client_id = 'c97fbdbd18674cf3851def089d654a65' client_secret = '{My Client Secret}' redirect_uri = 'http://localhost:80' # Set up Spotify API client with client ID, secret, and redirect URI sp = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope="user-library-read" # Add the required scopes here )) # Get the access token access_token_info = sp.auth_manager.get_access_token(as_dict=False) # Print the access token print(access_token_info) def create_playlist_with_recommendations(type, id, playlist_name='Recommendeded Playlist'): sp = spotipy.Spotify(auth=access_token_info, auth_manager=SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope='playlist-modify-public')) # Get similar tracks if type == "track": similar_tracks = sp.recommendations(seed_tracks=[id], limit=10)['tracks'] elif type == "artist": similar_tracks = sp.recommendations(seed_artists=[id], limit=10)['tracks'] # Extract track URIs from similar tracks track_uris = [track['uri'] for track in similar_tracks] # Create a new playlist playlist = sp.user_playlist_create(user=username, name=playlist_name, public=False) # Add tracks to the playlist sp.playlist_add_items(playlist_id=playlist['id'], items=track_uris) return playlist playlist = create_playlist_with_recommendations("track", "6UBjSnyP1O5W5ndJoO9vUk") # Night Moves - Bob Seger playlist = create_playlist_with_recommendations("artist", "3qBdT7NKSOBogHhGiUVLiV") # Radio Company - country rock
错误信息
HTTP Error for POST to https://api.spotify.com/v1/users/9qk7akrruah30sd2qix0x4lmp/playlists with Params: {} returned 403 due to Insufficient client scope { "name": "SpotifyException", "message": "http status: 403, code:-1 - https://api.spotify.com/v1/users/9qk7akrruah30sd2qix0x4lmp/playlists: Insufficient client scope, reason: None", "stack": "--------------------------------------------------------------------------- HTTPError Traceback (most recent call last) File ~\\anaconda3\\Lib\\site-packages\\spotipy\\client.py:271, in Spotify._internal_call(self, method, url, payload, params) 266 response = self._session.request( 267 method, url, headers=headers, proxies=self.proxies, 268 timeout=self.requests_timeout, **args 269 ) --> 271 response.raise_for_status() 272 results = response.json() File ~\\anaconda3\\Lib\\site-packages\\requests\\models.py:1021, in Response.raise_for_status(self) 1020 if http_error_msg: -> 1021 raise HTTPError(http_error_msg, response=self) HTTPError: 403 Client Error: Forbidden for url: https://api.spotify.com/v1/users/9qk7akrruah30sd2qix0x4lmp/playlists During handling of the above exception, another exception occurred: SpotifyException Traceback (most recent call last) Cell In[10], line 26 23 return playlist 25 #playlist = create_playlist_with_recommendations("track", "6UBjSnyP1O5W5ndJoO9vUk") # Night Moves - Bob Seger --> 26 playlist = create_playlist_with_recommendations("artist", "3qBdT7NKSOBogHhGiUVLiV") # Radio Company - country rock Cell In[10], line 18, in create_playlist_with_recommendations(type, id, playlist_name) 15 track_uris = [track['uri'] for track in similar_tracks] 17 # Create a new playlist --> 18 playlist = sp.user_playlist_create(user=username, name=playlist_name, public=False) 20 # Add tracks to the playlist 21 sp.playlist_add_items(playlist_id=playlist['id'], items=track_uris) File ~\\anaconda3\\Lib\\site-packages\\spotipy\\client.py:818, in Spotify.user_playlist_create(self, user, name, public, collaborative, description) 802 """ Creates a playlist for a user 803 804 Parameters: (...) 809 - description - the description of the playlist 810 """ 811 data = { 812 "name": name, 813 "public": public, 814 "collaborative": collaborative, 815 "description": description 816 } --> 818 return self._post("users/%s/playlists" % (user,), payload=data) File ~\\anaconda3\\Lib\\site-packages\\spotipy\\client.py:328, in Spotify._post(self, url, args, payload, **kwargs) 326 if args: 327 kwargs.update(args) --> 328 return self._internal_call("POST", url, payload, kwargs) File ~\\anaconda3\\Lib\\site-packages\\spotipy\\client.py:293, in Spotify._internal_call(self, method, url, payload, params) 286 reason = None 288 logger.error( 289 'HTTP Error for %s to %s with Params: %s returned %s due to %s', 290 method, url, args.get("params"), response.status_code, msg 291 ) --> 293 raise SpotifyException( 294 response.status_code, 295 -1, 296 "%s:\n %s" % (response.url, msg), 297 reason=reason, 298 headers=response.headers, 299 ) 300 except requests.exceptions.RetryError as retry_error: 301 request = retry_error.request SpotifyException: http status: 403, code:-1 - https://api.spotify.com/v1/users/9qk7akrruah30sd2qix0x4lmp/playlists: Insufficient client scope, reason: None" }
可正常运行的代码
def get_favourites(item_type, time_range='short_term', limit=10): # Set up Spotify API client with access token sp = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope='user-top-read')) # Validate item_type if item_type not in ['tracks', 'artists']: raise ValueError("Invalid item_type. Must be 'tracks' or 'artists'.") # Get the user's top items if item_type == 'tracks': top_items = sp.current_user_top_tracks( time_range=time_range, limit=limit) # Extract relevant information from the tracks items_info = [] for item in top_items['items']: item_info = { 'name': item['name'], 'artist': item['artists'][0]['name'], 'album': item['album']['name'], 'popularity': item['popularity'], 'id': item['id'] } items_info.append(item_info) elif item_type == 'artists': top_items = sp.current_user_top_artists( time_range=time_range, limit=limit) # Extract relevant information from the artists items_info = [] for item in top_items['items']: item_info = { 'name': item['name'], 'id': item['id'], 'genres': item['genres'], 'popularity': item['popularity'] } items_info.append(item_info) return items_info # Example usage top_tracks = get_favourites(item_type='tracks') for track in top_tracks: print(f"Track ID: {track['id']}\nTrack: {track['name']} - Artist: {track['artist']} - Album: {track['album']} - Popularity: {track['popularity']}\n") top_artists = get_favourites(item_type='artists') for artist in top_artists: print( f"Artist ID: {artist['id']}\nArtist: {artist['name']} - Genres: {', '.join(artist['genres'])} - Popularity: {artist['popularity']}\n")
问题原因及解决方案
核心原因
全局初始化的sp对象仅申请了user-library-read权限,获取的access_token仅包含该权限;函数内创建新sp对象时,同时传入旧access_token和新的auth_manager,Spotipy会优先使用已有access_token,导致新设置的playlist-modify-public权限未生效。
修复步骤
- 合并权限范围:全局初始化客户端时,一次性包含所有需要的权限,避免重复创建客户端。
- 复用全局客户端:函数内直接使用全局的
sp对象,无需重新初始化。 - 清除缓存:删除本地
.cache开头的Spotify权限缓存文件,确保新权限生效。
修改后的代码:
username = '9qk7akrruah30sd2qix0x4lmp' client_id = 'c97fbdbd18674cf3851def089d654a65' client_secret = '{My Client Secret}' redirect_uri = 'http://localhost:80' # 合并所需权限:读取个人库、创建公开播放列表 sp = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope="user-library-read playlist-modify-public" )) def create_playlist_with_recommendations(type, id, playlist_name='Recommended Playlist'): # 直接使用全局客户端 if type == "track": similar_tracks = sp.recommendations(seed_tracks=[id], limit=10)['tracks'] elif type == "artist": similar_tracks = sp.recommendations(seed_artists=[id], limit=10)['tracks'] track_uris = [track['uri'] for track in similar_tracks] playlist = sp.user_playlist_create(user=username, name=playlist_name, public=False) sp.playlist_add_items(playlist_id=playlist['id'], items=track_uris) return playlist # 调用函数 playlist = create_playlist_with_recommendations("track", "6UBjSnyP1O5W5ndJoO9vUk") playlist = create_playlist_with_recommendations("artist", "3qBdT7NKSOBogHhGiUVLiV")
内容的提问来源于stack exchange,提问作者Adityaa Gupta
相关产品推荐
相关产品推荐

