You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何无法免费使用Spotify Web API?Python调用遇403问题

问题原因及解决办法

原因

Spotify在2024年更新了Web API的访问政策:

  • 你代码里用的Client Credentials Flow(客户端凭证流),现在要求开发者账号必须绑定Spotify Premium订阅,才能访问搜索、播放列表内容这类核心API端点。
  • 你看到的旧视频教程都是政策调整前的内容,当时免费开发者账号可以用该方式访问这些端点,现在已经不适用了。

解决办法

针对面向普通用户(含免费用户)的应用,推荐改用Authorization Code Flow(授权码流)——让用户用自己的Spotify账号(免费或Premium均可)授权你的应用,以此获取和用户账号绑定的访问令牌。这种方式下:

  • 免费用户授权后,应用可访问公开播放列表、基础搜索等API端点(有请求速率限制,但能满足普通使用需求);
  • Premium用户授权后,可解锁更多高级功能(比如访问用户私有播放列表)。

代码修改思路(授权码流示例)

  1. 先在Spotify开发者控制台配置应用的重定向URI(比如http://localhost:8080/callback);
  2. 引导用户访问Spotify授权页面获取授权码:
    import urllib.parse
    
    client_id = "你的客户端ID"
    redirect_uri = "http://localhost:8080/callback"
    scope = "playlist-read-public"  # 按需调整权限范围,比如要搜索可加"user-read-private"
    
    auth_url = "https://accounts.spotify.com/authorize?" + urllib.parse.urlencode({
        "response_type": "code",
        "client_id": client_id,
        "scope": scope,
        "redirect_uri": redirect_uri,
    })
    print("请访问以下链接完成授权:", auth_url)
    
  3. 用户授权后,从回调地址提取授权码,再交换成访问令牌:
    from requests import post
    import json
    
    def get_token_with_auth_code(auth_code):
        url = "https://accounts.spotify.com/api/token"
        headers = {"Content-Type": "application/x-www-form-urlencoded"}
        data = {
            "grant_type": "authorization_code",
            "code": auth_code,
            "redirect_uri": redirect_uri,
            "client_id": client_id,
            "client_secret": "你的客户端密钥"
        }
        result = post(url, headers=headers, data=data)
        return json.loads(result.content)
    
  4. 使用用户绑定的令牌调用API(沿用你原有的get_playlist函数即可):
    auth_code = input("请输入授权后得到的code:")
    token_data = get_token_with_auth_code(auth_code)
    access_token = token_data["access_token"]
    get_playlist(access_token, "021tegZzZnT8YEpLr0lC3V")
    

补充说明

  • 免费用户授权的令牌有请求速率限制,具体规则可参考Spotify官方文档;
  • 部分高级API端点(比如获取用户最近播放记录)确实需要Premium用户授权,但公开播放列表、基础搜索等基础功能,免费用户授权后即可正常使用。

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

火山引擎 最新活动