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

使用Spotipy调用Spotify API遇404错误及获取每日Top1000歌曲的问题

问题解决与方案

一、代码404错误的原因及修复

错误原因

  1. 方法弃用引发兼容性问题:你使用的sp.playlist_tracks()已被Spotipy标记为弃用,内部重定向到playlist_items()时可能出现隐性错误。
  2. 缺少区域参数:Spotify官方播放列表(如全球Top 50)需要指定market参数,未指定时部分区域会返回404或无数据。
  3. API访问限制:Spotify所有API请求都需要携带认证令牌,不存在「无需认证仅通过URL获取数据」的方式,Client Credentials是最基础的无用户授权认证模式,必须保留。

修复后的代码

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

# 替换为你的API凭证
client_id = 'your_client_id'
client_secret = 'your_client_secret'

# 初始化认证客户端
client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

# 官方全球每日Top 50播放链接
playlist_link = "https://open.spotify.com/playlist/37i9dQZEVXbNG2KDcFcKOF?si=1333723a6eff4b7f"
playlist_URI = playlist_link.split("/")[-1].split("?")[0]

# 使用官方推荐的playlist_items方法,添加market参数指定区域
track_items = sp.playlist_items(playlist_URI, market="US", additional_types=("track",))
track_uris = [item["track"]["uri"] for item in track_items["items"]]

print(track_uris)

二、获取每日Top 1000歌曲的方案

Spotify官方没有单一个包含Top 1000歌曲的播放列表,可通过以下方式实现:

  • 合并多区域官方Top列表:抓取不同地区的Top 200播放列表(如全球、美国、欧洲、日本等),合并曲目并去重。常用官方Top 200列表ID:
    • 全球Top 200:37i9dQZEVXbMDoHDwVN2tF
    • 美国Top 200:37i9dQZEVXbLRQDuF5jeBp
    • 英国Top 200:37i9dQZEVXbLnolsZ8PSNw
  • 分页获取完整内容:每个播放列表单次请求最多返回100条数据,需通过offset参数循环分页,获取全部200条内容。
  • 自动去重:用集合存储歌曲URI,自动过滤不同列表中的重复曲目。

示例代码片段(合并多区域Top 200):

# 多个官方Top 200播放列表ID
top_playlists = [
    "37i9dQZEVXbMDoHDwVN2tF",  # 全球Top 200
    "37i9dQZEVXbLRQDuF5jeBp",  # 美国Top 200
    "37i9dQZEVXbLnolsZ8PSNw",  # 英国Top 200
    "37i9dQZEVXbKuaTI1Z1Afx"   # 日本Top 200
]

all_track_uris = set()

for playlist_id in top_playlists:
    offset = 0
    while True:
        items = sp.playlist_items(playlist_id, market="US", limit=100, offset=offset, additional_types=("track",))
        if not items["items"]:
            break
        # 集合自动去重
        all_track_uris.update([item["track"]["uri"] for item in items["items"]])
        offset += 100

# 转换为列表,最终数量接近1000(根据重复情况浮动)
top_1000_uris = list(all_track_uris)
print(f"获取到{len(top_1000_uris)}首不同的热门歌曲URI")

内容的提问来源于stack exchange,提问作者Prasad Dalvi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:57:33