如何修复Python刷新Spotify访问令牌时的400错误与KeyError问题
修复Spotify令牌刷新代码的问题
问题根源
你的代码有三个关键问题导致请求失败:
- 参数混淆:函数参数命名为
access_token,但实际传入的应该是刷新令牌(refresh_token),请求里的refresh_token字段需要的是刷新令牌而非访问令牌。 - 缺少授权头:Spotify的令牌刷新接口要求携带Basic Auth授权头,由你的客户端ID和客户端密钥编码生成。
- 无错误处理:直接从响应中取
refresh_token,但400错误响应返回的是错误信息而非令牌,因此触发KeyError。
修复后的代码
import base64 from requests import post import json def refresh_token(refresh_token, client_id, client_secret): # 生成Basic Auth授权头 auth_str = f"{client_id}:{client_secret}" auth_bytes = auth_str.encode("utf-8") auth_base64 = base64.b64encode(auth_bytes).decode("utf-8") data = { "grant_type": "refresh_token", "refresh_token": refresh_token } url = "https://accounts.spotify.com/api/token" headers = { "Content-Type": "application/x-www-form-urlencoded", "Authorization": f"Basic {auth_base64}" } result = post(url, headers=headers, data=data) # 检查响应状态 if result.status_code != 200: error_data = json.loads(result.content) raise Exception(f"刷新失败: {error_data.get('error_description', error_data.get('error'))}") json_result = json.loads(result.content) # 注意:Spotify刷新令牌后不一定返回新的refresh_token,取决于授权时的设置 refreshed_access_token = json_result['access_token'] new_refresh_token = json_result.get('refresh_token', refresh_token) # 无返回则沿用旧令牌 return refreshed_access_token, new_refresh_token
关键修改说明
- 参数修正:将函数参数改为
refresh_token,同时新增client_id和client_secret参数,这两个值可从你的Spotify开发者控制台获取。 - 添加授权头:通过base64编码客户端ID和密钥,生成符合接口要求的Basic Auth头,这是请求必填项。
- 错误处理:先判断响应状态码,非200时抛出包含错误信息的异常,避免KeyError;同时处理
refresh_token可能不返回的情况——若应用授权时勾选了offline_access,刷新会返回新令牌,否则沿用旧令牌,用get方法兼容两种场景。 - 返回值调整:刷新令牌核心是获取新的
access_token,同时返回可能更新的refresh_token,更贴合实际使用需求。
使用示例
# 替换为你的实际参数 CLIENT_ID = "你的客户端ID" CLIENT_SECRET = "你的客户端密钥" OLD_REFRESH_TOKEN = "你的旧刷新令牌" try: new_access_token, new_refresh_token = refresh_token(OLD_REFRESH_TOKEN, CLIENT_ID, CLIENT_SECRET) print(f"新访问令牌: {new_access_token}") print(f"新刷新令牌: {new_refresh_token}") except Exception as e: print(e)
内容的提问来源于stack exchange,提问作者thanuja
相关产品推荐
相关产品推荐

