使用Spotify Web API添加曲目到播放列表时遭遇403 Forbidden错误求助
Spotify Web API 添加曲目到播放列表返回403 Forbidden 问题排查与解决
核心问题描述
使用Spotify Web API向播放列表添加曲目时持续返回403 Forbidden错误,已确认Token包含playlist-modify-private、playlist-modify-public等必要权限,且Token未过期、请求格式符合文档要求。
关键信息
应用配置
- Spotify Client ID:我的客户端ID
- Spotify Client Secret:客户端密钥
- Redirect URI:http://127.0.0.1:8000/callback
Access Token详情
{ "access_token": "my access token", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "my refresh token", "scope": "playlist-modify-private playlist-modify-public playlist-read-private playlist-read-collaborative", "expires_at": 1725396428 }
错误日志
INFO 2024-09-03 20:16:02,097 cron Distributing 1 playlists to job scheduled at 2024-09-03 20:47:02.097874 for Order ID 28. INFO 2024-09-03 20:16:02,100 cron Adding track 0TT2Tzi8mEETCqYZ1ffiHh to playlist 4CeTjVTCZOFzTBdO8yaLvG ERROR 2024-09-03 20:16:02,557 cron Spotify API error: https://api.spotify.com/v1/playlists/4CeTjVTCZOFzTBdO8yaLvG/tracks: Check settings on developer.spotify.com/dashboard, the user may not be registered. ERROR 2024-09-03 20:16:02,558 cron Check if the user 31rizduwj674dch67g22bjqy7sue is correctly registered and has permissions to modify the playlist.
已尝试的排查步骤
- 验证Token权限范围,确认包含必要权限
- 检查Token有效性,尝试刷新Token
- 确认播放列表归属,确保用户拥有或被授权修改
- 重新完成应用授权流程
- 验证API端点与请求格式符合文档要求
- 确认用户具备播放列表修改权限
针对性解决建议
1. 检查Spotify开发者控制台配置
- 应用状态验证:确保控制台中的应用不是「草稿」状态,草稿应用仅对开发者自身账户开放,其他用户授权后无法正常调用API,需发布应用(无需审核,仅需填写基本信息)。
- 重定向URI完全匹配:确认控制台中配置的Redirect URI和代码中使用的完全一致,包括协议(http/https)、域名、端口、路径,哪怕多一个末尾斜杠都会导致权限验证失败。
- 应用类型配置:确认应用类型设置为「Web API」,虽然Spotipy兼容多类型,但错误的类型配置可能导致权限范围受限。
2. 排查播放列表与用户账户的权限关联
- 播放列表协作权限:如果是协作播放列表,确认用户被授予「可编辑」权限(而非仅查看权限);私有播放列表即使是协作成员,也需要Token的
playlist-modify-private权限生效。 - 用户账户限制:检查用户是否为受限账户(如家庭计划子账户、试用账户),部分受限账户无法修改非自身创建的播放列表。
- 归属关系验证:调用
GET /me接口获取Token对应的用户ID,再调用GET /playlists/{playlist_id}接口,确认owner.id与用户ID一致,或collaborative为true且用户在协作成员列表中。
3. 额外排查步骤
- 清理冗余请求参数:你的curl请求同时在URL参数和请求体中传递了
uris,这会导致API解析冲突,需去掉其中一个(推荐用请求体传递参数),简化请求如下:curl --request POST \ --url 'https://api.spotify.com/v1/playlists/4CeTjVTCZOFzTBdO8yaLvG/tracks' \ --header 'Authorization: Bearer 你的access_token' \ --header 'Content-Type: application/json' \ --data '{ "uris": [ "spotify:track:0TT2Tzi8mEETCqYZ1ffiHh" ] }' - 验证Token用户归属:调用
GET /me接口,确认返回的用户ID与错误日志中的31rizduwj674dch67g22bjqy7sue完全一致,避免使用了错误用户的Token。 - 检查速率限制:查看API响应头中的
X-RateLimit-Remaining字段,确认是否触发速率限制(虽然通常返回429,但部分场景可能返回403)。 - 简化请求测试:去掉请求体中的
position字段,仅保留uris,排除参数格式导致的错误。 - Spotipy配置校验:确认授权时Spotipy的
scope参数与Token返回的权限完全一致,避免代码中授权请求的权限不足。
内容的提问来源于stack exchange,提问作者Linear Data Structure
相关产品推荐
相关产品推荐

