为何无法免费使用Spotify Web API?Python调用遇403问题
问题原因及解决办法
原因
Spotify在2024年更新了Web API的访问政策:
- 你代码里用的Client Credentials Flow(客户端凭证流),现在要求开发者账号必须绑定Spotify Premium订阅,才能访问搜索、播放列表内容这类核心API端点。
- 你看到的旧视频教程都是政策调整前的内容,当时免费开发者账号可以用该方式访问这些端点,现在已经不适用了。
解决办法
针对面向普通用户(含免费用户)的应用,推荐改用Authorization Code Flow(授权码流)——让用户用自己的Spotify账号(免费或Premium均可)授权你的应用,以此获取和用户账号绑定的访问令牌。这种方式下:
- 免费用户授权后,应用可访问公开播放列表、基础搜索等API端点(有请求速率限制,但能满足普通使用需求);
- Premium用户授权后,可解锁更多高级功能(比如访问用户私有播放列表)。
代码修改思路(授权码流示例)
- 先在Spotify开发者控制台配置应用的重定向URI(比如
http://localhost:8080/callback); - 引导用户访问Spotify授权页面获取授权码:
import urllib.parse client_id = "你的客户端ID" redirect_uri = "http://localhost:8080/callback" scope = "playlist-read-public" # 按需调整权限范围,比如要搜索可加"user-read-private" auth_url = "https://accounts.spotify.com/authorize?" + urllib.parse.urlencode({ "response_type": "code", "client_id": client_id, "scope": scope, "redirect_uri": redirect_uri, }) print("请访问以下链接完成授权:", auth_url) - 用户授权后,从回调地址提取授权码,再交换成访问令牌:
from requests import post import json def get_token_with_auth_code(auth_code): url = "https://accounts.spotify.com/api/token" headers = {"Content-Type": "application/x-www-form-urlencoded"} data = { "grant_type": "authorization_code", "code": auth_code, "redirect_uri": redirect_uri, "client_id": client_id, "client_secret": "你的客户端密钥" } result = post(url, headers=headers, data=data) return json.loads(result.content) - 使用用户绑定的令牌调用API(沿用你原有的
get_playlist函数即可):auth_code = input("请输入授权后得到的code:") token_data = get_token_with_auth_code(auth_code) access_token = token_data["access_token"] get_playlist(access_token, "021tegZzZnT8YEpLr0lC3V")
补充说明
- 免费用户授权的令牌有请求速率限制,具体规则可参考Spotify官方文档;
- 部分高级API端点(比如获取用户最近播放记录)确实需要Premium用户授权,但公开播放列表、基础搜索等基础功能,免费用户授权后即可正常使用。
内容的提问来源于stack exchange,提问作者skinnyleonard




