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

使用Client Credentials与Spotipy刷新Spotify API访问令牌遇无效客户端错误

问题分析

你的代码每次调用run_spotify()都会新建一个SpotifyClientCredentials实例,这导致它无法复用之前缓存的有效令牌——因为令牌缓存是存储在实例内部的。每次重新创建实例后调用get_access_token(),相当于重复发起授权请求,一小时后出现invalid_client错误,大概率是重复请求触发了Spotify的接口限制,或是环境变量在运行过程中出现读取异常。

解决方法

1. 持久化认证实例与Spotify客户端

把SpotifyClientCredentials和spotipy.Spotify实例做成全局对象,确保程序生命周期内只初始化一次,这样auth_manager会自动处理令牌的过期检测与刷新,无需手动调用get_access_token():

import spotipy
import os
from spotipy.oauth2 import SpotifyClientCredentials

# 全局初始化认证与客户端对象
client_id = os.environ.get("CLIENT_ID")
client_secret = os.environ.get("CLIENT_SECRET")
credentials = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)
spotify = spotipy.Spotify(auth_manager=credentials)

def run_spotify():
    '''返回已初始化的Spotify客户端'''
    return spotify

后续每次调用run_spotify()都会复用同一个客户端实例,令牌缓存机制能正常生效。

2. 校验环境变量有效性

确认CLIENT_ID和CLIENT_SECRET环境变量在程序运行全程可正确读取:

  • 添加初始化校验,避免空值导致的认证失败:
    client_id = os.environ.get("CLIENT_ID")
    client_secret = os.environ.get("CLIENT_SECRET")
    if not client_id or not client_secret:
        raise ValueError("CLIENT_ID或CLIENT_SECRET环境变量未设置")
    
  • 核对Spotify开发者后台的客户端ID/密钥是否正确,确保已开启Client Credentials授权流。

3. 函数内单例模式初始化(可选)

如果必须在函数内处理,可通过单例模式确保认证实例只创建一次:

import spotipy
import os
from spotipy.oauth2 import SpotifyClientCredentials

_spotify_client = None

def run_spotify():
    global _spotify_client
    if _spotify_client is None:
        client_id = os.environ.get("CLIENT_ID")
        client_secret = os.environ.get("CLIENT_SECRET")
        if not client_id or not client_secret:
            raise ValueError("CLIENT_ID或CLIENT_SECRET环境变量未设置")
        credentials = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)
        _spotify_client = spotipy.Spotify(auth_manager=credentials)
    return _spotify_client

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:26:11