You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python刷新Spotify访问令牌时的400错误与KeyError问题

修复Spotify令牌刷新代码的问题

问题根源

你的代码有三个关键问题导致请求失败:

  1. 参数混淆:函数参数命名为access_token,但实际传入的应该是刷新令牌(refresh_token),请求里的refresh_token字段需要的是刷新令牌而非访问令牌。
  2. 缺少授权头:Spotify的令牌刷新接口要求携带Basic Auth授权头,由你的客户端ID和客户端密钥编码生成。
  3. 无错误处理:直接从响应中取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:16:14