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-readplaylist-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-readplaylist-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

火山引擎 最新活动