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

调用Spotify Web API获取音频特征时遭遇403 Forbidden错误的求助

调用Spotify Web API获取音频特征时遭遇403 Forbidden错误的求助

问题描述

我尝试通过Spotify Web API获取歌曲的音频特征,但始终收到403 Forbidden错误,目前已经确认以下几点:

  • 已通过OAuth成功完成用户登录
  • 能通过sp.auth_manager.get_access_token()获取到格式有效的访问令牌
  • 令牌包含user-library-read和playlist-read-private两个权限范围

我的实现代码

import requests

# 获取缓存令牌,无缓存则触发OAuth流程
token_info = sp.auth_manager.get_cached_token()

if token_info:
    access_token = token_info['access_token']
else:
    token_info = sp.auth_manager.get_access_token()
    access_token = token_info['access_token']

print(f" access_token = {access_token}")

url = "https://api.spotify.com/v1/audio-features"
headers = {
    "Authorization": f"Bearer {access_token}"
}
params = {
    "ids": "7qiZfU4dY1lWllzX7mPBI3"  # 替换为有效的歌曲ID
}
response = requests.get(url, headers=headers, params=params)

if response.status_code == 200:
    print(response.json())
else:
    print(f"Error {response.status_code}: {response.text}")

收到的错误信息

access_token = *****
Error 403: {
  "error" : {
    "status" : 403
  }
}

已尝试的排查动作

  • 反复验证令牌的权限范围确实包含user-library-read和playlist-read-private
  • 确认歌曲ID有效且该歌曲为公开可访问状态
  • 检查令牌未过期(使用缓存的有效令牌)
  • 测试其他API调用(如搜索歌曲)可正常返回结果

想请教各位,这个403错误的可能原因是什么?该如何解决?


专家解答

嘿,我之前踩过类似的坑,给你几个实用的排查方向:

1. 先排查令牌本身的有效性

Spotify的访问令牌是JWT格式的,你可以自己解码它(用常规的JWT解码工具就行),查看里面的scope字段是不是真的包含你配置的权限,以及exp字段确认是否过期。有时候缓存的令牌可能存在权限不全的情况,哪怕你后台配置的权限是对的。

你也可以强制刷新令牌试试,替换获取令牌的代码:

# 强制跳过缓存,获取新的令牌
token_info = sp.auth_manager.get_access_token(as_dict=True, check_cache=False)
access_token = token_info['access_token']

2. 权限范围的误区

其实获取音频特征的/v1/audio-features接口属于Spotify的公共数据接口,不需要用户相关的权限。你当前用的是用户授权流(Authorization Code Flow)的令牌,虽然理论上也能访问公共接口,但有时候会因为令牌的受众(aud)限制导致403。

你可以试试用**客户端凭据流(Client Credentials Flow)**获取令牌,这个是专门用于访问公共数据的:

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

# 用你的客户端ID和密钥初始化
sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(
    client_id='你的客户端ID',
    client_secret='你的客户端密钥'
))

# 直接用Spotipy封装的方法获取音频特征
features = sp.audio_features("7qiZfU4dY1lWllzX7mPBI3")
print(features)

如果这个能成功,就说明之前的用户授权令牌确实存在访问限制。

3. 排查自定义请求的问题

你现在是用requests手动构造请求,不如先试试Spotipy库封装好的方法,绕开手动构造请求的可能问题:

# 用你已经初始化好的sp对象
features = sp.audio_features("7qiZfU4dY1lWllzX7mPBI3")
print(features)

如果这个能返回正常结果,那就是你自己写的requests请求哪里有问题——比如请求头的格式、参数的编码,甚至是access_token有没有多余的空格(虽然你代码里看起来是对的,但可以再检查一遍)。

4. 检查应用的访问限制

如果是新创建的Spotify开发者应用,有时候会有临时的访问限制,你可以去Spotify开发者控制台看看你的应用状态是否正常,有没有被限制访问某些接口。另外,也可以试试换一个歌曲ID测试,排除单个ID的特殊情况。


备注:内容来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:38:03