使用Python调用Spotify API获取超百首歌播放列表时offset参数无效问题
Spotify API Offset参数失效的解决思路
首先排查参数传递方式是否正确:
- Spotify的
/playlists/{playlist_id}/tracks端点要求offset作为查询参数传递,而非请求体参数。如果你的代码把offset放在data或json参数里传给requests.get,API会忽略它,默认返回前100条。正确做法是将参数放在params字典中。
示例正确请求代码:
import requests BASE_URL = "https://api.spotify.com/v1" playlist_id = "你的播放列表ID" access_token = "你的访问令牌" headers = {"Authorization": f"Bearer {access_token}"} def fetch_all_tracks(): all_tracks = [] offset = 0 limit = 100 # API单次返回上限 while True: # 构造查询参数 params = {"offset": offset, "limit": limit} response = requests.get( f"{BASE_URL}/playlists/{playlist_id}/tracks", headers=headers, params=params ) # 检查请求是否成功,抛出异常便于排查 response.raise_for_status() data = response.json() # 打印返回的offset,确认API是否正确接收参数 print(f"请求offset: {offset}, API返回offset: {data['offset']}") all_tracks.extend(data["items"]) # 当返回条目数小于limit时,说明已获取全部歌曲 if len(data["items"]) < limit: break offset += limit return all_tracks
接下来排查其他可能原因:
- URL拼接错误:不要手动将
offset拼进URL路径(比如.../tracks/offset=100),这种写法不符合API规范,会被忽略。 - 令牌权限问题:虽然能获取前100条,但如果令牌缺少
playlist-read-private或playlist-read-collaborative权限,部分私有播放列表可能返回异常数据。可以通过调用/me端点验证令牌权限。 - 播放列表ID错误:确认传入的
playlist_id是否对应目标播放列表,传错ID会导致获取错误播放列表的前100条,误以为offset无效。 - 本地缓存逻辑:检查代码中是否有缓存前100条数据的逻辑,导致后续请求结果被覆盖或重复读取缓存。
最后验证API响应:
- 打印
response.json()的完整返回值,查看offset字段是否与你传入的一致。如果API返回的offset是0,说明参数未正确传递;如果返回offset正确但条目还是前100条,可尝试更换播放列表测试,排除特定播放列表的异常情况。
内容的提问来源于stack exchange,提问作者exch_cmmnt_memb
相关产品推荐
相关产品推荐

