Python调用Spotify Web API获取授权码异常,返回<Response 200>
Spotify授权码获取问题排查与修复
核心问题
你对Spotify授权码流程的理解有误:授权码不是直接通过后台GET请求就能拿到的,这个流程需要用户在浏览器中完成登录授权操作,授权成功后Spotify会将授权码通过重定向URL的query参数返回。
你当前代码里的auth_code是requests.get()返回的Response对象(打印显示<Response 200>说明请求成功拿到了授权页面的HTML内容),而非实际的授权码字符串,直接把这个对象传给token接口自然会失败。
修复步骤
生成并引导用户打开授权URL
先构造完整的授权URL,打印出来后让用户在浏览器中访问,完成登录和授权操作。授权成功后,Spotify会跳转到你指定的redirect_uri,此时URL的code参数就是你需要的授权码。提取授权码并请求Access Token
把从重定向URL中提取到的code字符串,替换到payload的code字段中,再发起token请求。
修正后的代码示例
import requests import base64 AUTH_URL = 'https://accounts.spotify.com/authorize' TOKEN_URL = 'https://accounts.spotify.com/api/token' BASE_URL = 'https://api.spotify.com/v1/' CLIENT_ID = '你的客户端ID' CLIENT_SECRET = '你的客户端密钥' REDIRECT_URI = '你在Spotify开发者后台配置的重定向URI' # 必须和后台配置完全一致 # 第一步:生成授权URL,引导用户在浏览器打开 auth_params = { 'client_id': CLIENT_ID, 'response_type': 'code', 'redirect_uri': REDIRECT_URI, 'scope': 'playlist-modify-private', } # 构造完整可访问的授权URL auth_url = requests.Request('GET', AUTH_URL, params=auth_params).prepare().url print(f"请在浏览器中打开以下URL完成授权:\n{auth_url}") # 用户授权后,手动输入重定向URL中的code参数 auth_code = input("请输入授权后URL中的code参数:").strip() # 第二步:请求Access Token auth_header = base64.urlsafe_b64encode((f"{CLIENT_ID}:{CLIENT_SECRET}").encode()) headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': f'Basic {auth_header.decode("ascii")}' } payload = { 'grant_type': 'authorization_code', 'code': auth_code, 'redirect_uri': REDIRECT_URI, 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, } access_token_request = requests.post(url=TOKEN_URL, data=payload, headers=headers) access_token_response_data = access_token_request.json() # 校验响应结果 if 'access_token' in access_token_response_data: access_token = access_token_response_data['access_token'] print(f"获取到Access Token:{access_token}") else: print(f"请求失败:{access_token_response_data}")
额外注意事项
redirect_uri必须和你在Spotify开发者后台创建应用时填写的完全一致,包括协议(http/https)、域名、路径,否则会触发授权失败。- 如果是后端服务场景,可以通过接收重定向请求自动提取
code;脚本场景下手动提取是最直接的实现方式。
内容的提问来源于stack exchange,提问作者Julianr
相关产品推荐
相关产品推荐

