使用Spotify Web API开发歌曲推荐项目时遭遇403错误求助
Spotify歌曲推荐项目403 Forbidden错误排查
我正在开发一个Spotify歌曲推荐项目,调用audio_features接口时持续出现403错误,无法正常获取歌曲音频特征。以下是项目代码及报错信息:
项目代码
from dotenv import load_dotenv import os import spotipy from spotipy.oauth2 import SpotifyOAuth import pandas as pd load_dotenv() SPOTIPY_CLIENT_ID = os.getenv("SPOTIPY_CLIENT_ID") SPOTIPY_CLIENT_SECRET = os.getenv("SPOTIPY_CLIENT_SECRET") SPOTIPY_REDIRECT_URI = os.getenv("SPOTIPY_REDIRECT_URI") scope = "user-library-read playlist-read-private" sp = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id=SPOTIPY_CLIENT_ID, client_secret=SPOTIPY_CLIENT_SECRET, redirect_uri=SPOTIPY_REDIRECT_URI, scope=scope )) playlists = sp.current_user_playlists() playlist_df = pd.DataFrame([ { "name": pl["name"], "id": pl["id"], "track_count": pl["tracks"]["total"] } for pl in playlists["items"] ]) chosen_playlist = input("\n选择你想找相似歌曲的播放列表:\n") playlist_id = None while not playlist_id: for playlist in playlists['items']: if playlist['name'].lower() == chosen_playlist.lower(): playlist_id = playlist['id'] break if not playlist_id: print(f"\n未找到播放列表 '{chosen_playlist}'。") chosen_playlist = input("\n请重新选择你想找相似歌曲的播放列表:\n") offset = 0 limit = 100 all_tracks = [] track_count = sp.playlist_tracks(playlist_id)['total'] c = 0 while offset < track_count: results = sp.playlist_tracks(playlist_id, offset=offset, limit=limit) tracks = results['items'] print(f"\n播放列表 '{chosen_playlist}' 共有 {track_count} 首歌曲:") for item in tracks: c += 1 all_tracks.append(item) track = item['track'] print(f"{c}. {track['name']} - {track['artists'][0]['name']}") offset += limit track_ids = [ item['track']['id'] for item in all_tracks if item['track'] and item['track']['id'] ] audio_features = sp.audio_features(track_ids) filtered_features = [f for f in audio_features if f is not None] df = pd.DataFrame(filtered_features) print("\n歌曲音频特征:") print(df)
报错信息
"C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Scripts\python.exe" "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot\main.py" 选择你想找相似歌曲的播放列表: s2 播放列表 's2' 共有 2 首歌曲: 1. Rockabye (feat. Sean Paul & Anne-Marie) - Clean Bandit 2. No Lie - Sean Paul HTTP Error for GET to https://api.spotify.com/v1/audio-features/?ids=2hrUO4drrO63i7FYbCLBl2,48QmG1dfvMuYLxMPt7KSRA with Params: {} returned 403 due to None Traceback (most recent call last): File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Lib\site-packages\spotipy\client.py", line 274, in _internal_call response.raise_for_status() File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Lib\site-packages\requests\models.py", line 1026, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.spotify.com/v1/audio-features/?ids=2hrUO4drrO63i7FYbCLBl2,48QmG1dfvMuYLxMPt7KSRA During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot\main.py", line 68, in audio_features = sp.audio_features(track_ids) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Lib\site-packages\spotipy\client.py", line 1802, in audio_features results = self._get("audio-features/?ids=" + ",".join(tlist)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Lib\site-packages\spotipy\client.py", line 324, in _get return self._internal_call("GET", url, payload, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\kinga\PycharmProjects\Spotify Song Recommendation Chatbot.venv\Lib\site-packages\spotipy\client.py", line 294, in _internal_call raise SpotifyException( spotipy.exceptions.SpotifyException: http status: 403, code: -1 - https://api.spotify.com/v1/audio-features/?ids=2hrUO4drrO63i7FYbCLBl2,48QmG1dfvMuYLxMPt7KSRA: None, reason: None Process finished with exit code 1
可能的解决方法
检查权限范围:虽然获取音频特征无需特定用户权限,但建议补充权限范围并重新授权。更新scope为:
scope = "user-library-read playlist-read-private user-read-playback-state"之后删除本地生成的
.cache缓存文件,重新运行代码完成授权。核对Redirect URI:确保代码中
SPOTIPY_REDIRECT_URI的值与Spotify开发者后台应用设置的完全一致,包括协议(http/https)、端口及结尾斜杠。重置授权缓存:删除本地的
.cache文件,强制重新获取有效授权token。检查网络环境:确认网络可直接访问Spotify API,若处于受限网络环境,需调整网络设置。
切换授权流程:由于音频特征属于公开数据,可改用Client Credentials Flow,无需用户授权和redirect URI:
from spotipy.oauth2 import SpotifyClientCredentials sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials( client_id=SPOTIPY_CLIENT_ID, client_secret=SPOTIPY_CLIENT_SECRET ))
内容的提问来源于stack exchange,提问作者Arjun Ravendran
相关产品推荐
相关产品推荐

