Spotify定时搜索曲目时偶发HTTPError 401问题求助
可能的原因及对应修复方法
1. Token获取与刷新逻辑缺失
你的authorize()函数仅返回SpotifyOAuth对象,但未确保客户端能自动处理token过期刷新。Spotify Access Token有效期为1小时,若脚本单次运行时间较长,或初始化客户端时未绑定自动刷新逻辑,会导致部分请求因token失效触发401。
修复代码,让客户端自动处理token刷新:
def get_spotify_client(): scope = 'playlist-modify-public' username = os.environ.get('SPOTIFY_USERNAME') client_id = os.environ.get('SPOTIPY_CLIENT_ID') client_secret = os.environ.get('SPOTIPY_CLIENT_SECRET') redirect_uri = os.environ.get('SPOTIPY_REDIRECT_URI') # 初始化OAuth管理器,开启token缓存与自动刷新 auth_manager = SpotifyOAuth( client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scope, username=username, cache_path=f".cache-{username}", show_dialog=False ) # 绑定auth_manager的客户端会自动处理token过期刷新 return spotipy.Spotify(auth_manager=auth_manager)
业务代码中调用方式:
spotifyObject = get_spotify_client() for song in list_of_songs: time.sleep(0.5) result = spotifyObject.search(q=song, limit=5, offset=0, type='track', market='US') # 后续逻辑保持不变
2. 添加401异常重试机制
若自动刷新仍失效,可在业务代码中添加异常捕获,遇到401时强制重新获取token并重试:
def get_access_token(): auth_manager = SpotifyOAuth( client_id=os.environ.get('SPOTIPY_CLIENT_ID'), client_secret=os.environ.get('SPOTIPY_CLIENT_SECRET'), redirect_uri=os.environ.get('SPOTIPY_REDIRECT_URI'), scope='playlist-modify-public', username=os.environ.get('SPOTIFY_USERNAME') ) token_info = auth_manager.get_access_token() return token_info['access_token'] # 初始化客户端 spotifyObject = spotipy.Spotify(auth=get_access_token()) for song in list_of_songs: time.sleep(0.5) try: result = spotifyObject.search(q=song, limit=5, offset=0, type='track', market='US') except spotipy.exceptions.SpotifyException as e: if e.http_status == 401: # 重新获取token并重试请求 spotifyObject = spotipy.Spotify(auth=get_access_token()) result = spotifyObject.search(q=song, limit=5, offset=0, type='track', market='US') else: raise # 后续逻辑保持不变
3. 清理损坏的token缓存
Spotipy会生成.cache-<username>文件保存token信息,若文件损坏或存在过期token,会导致获取的token无效。直接删除该缓存文件,让脚本重新授权生成新token即可。
额外检查项
- 确认环境变量
SPOTIFY_USERNAME、SPOTIPY_CLIENT_ID等配置完全正确,无拼写错误或值缺失 - 搜索接口无需额外scope,但需确保
playlist-modify-public权限已正确配置在开发者后台
内容的提问来源于stack exchange,提问作者anandprabhu95
相关产品推荐
相关产品推荐

