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

使用Spotipy库切换用户时登出失效问题求助

解决Spotify多用户切换时旧token残留问题

你的核心问题出在缓存清理时机错误、全局对象未重置这两点,以下是具体修复方案:

1. 调整缓存清理顺序

当前代码是先创建SpotifyOAuth和sp对象,再删除缓存文件——这时候旧的token已经被加载到内存里了,删文件根本没用。必须先删缓存,再初始化认证管理器和客户端:

修改后的初始化代码:

import spotipy
import os
from spotipy.oauth2 import SpotifyOAuth

username = 'user'
scope = 'playlist-read-collaborative playlist-read-private playlist-modify-public playlist-modify-private'

# 先清理旧缓存
cache_path = f".cache-{username}"
if os.path.exists(cache_path):
    os.remove(cache_path)

# 再初始化认证管理器和客户端(注意修正原代码client_id的单引号缺失问题)
auth_manager = SpotifyOAuth(client_id='CLIENT_ID',
                            client_secret='CLIENT_SECRET', 
                            username=username,
                            redirect_uri='http://google.com/', 
                            scope=scope)
sp = spotipy.Spotify(auth_manager=auth_manager)

2. 显式清除内存中的token

即使删了缓存文件,auth_manager可能已经在内存中保留了token,需要主动清除:

# 切换用户时先执行这两行,彻底清理认证状态
auth_manager.cache_handler.delete_cache()
auth_manager.clear_cached_token()

3. 避免全局变量导致的状态残留

你的user_info是全局变量,切换用户后不会自动更新。建议把用户相关的对象封装成函数,每次切换用户时重新生成:

def init_spotify_client(username):
    # 清理该用户的缓存文件
    cache_path = f".cache-{username}"
    if os.path.exists(cache_path):
        os.remove(cache_path)
    
    auth_manager = SpotifyOAuth(client_id='CLIENT_ID',
                                client_secret='CLIENT_SECRET', 
                                username=username,
                                redirect_uri='http://google.com/', 
                                scope=scope)
    # 强制清除内存缓存
    auth_manager.cache_handler.delete_cache()
    
    sp = spotipy.Spotify(auth_manager=auth_manager)
    # 获取当前用户信息(局部变量,不会残留旧数据)
    user_info = sp.current_user() if auth_manager.get_access_token() else None
    return sp, user_info

# 切换用户时调用该函数,生成全新的客户端和用户信息
sp, user_info = init_spotify_client('new_user')

4. 修复search_create_add函数的全局变量依赖

原函数直接依赖全局user_info,切换用户后会使用旧数据,改成传入参数的形式:

def search_create_add(sp, user_id, query: list):
    uris = []
    needed_id = None
    for i in query:
        ur = sp.search(i)['tracks']['items'][0]['uri']
        uris.append(ur)
    print(uris)
    # 使用传入的user_id创建播放列表
    sp.user_playlist_create(user_id, name='New_try')
    for playlist in sp.current_user_playlists()['items']:
        if playlist['name'] == 'New_try':
            needed_id = playlist['id']
            break  # 找到后直接跳出循环,提升效率
    if needed_id:
        sp.playlist_add_items(playlist_id=needed_id, items=uris)

额外注意点

  • 原代码中client_id = CLIENT_ID'存在语法错误,缺失开头的单引号,需修正为client_id='CLIENT_ID'
  • 每次切换用户时,必须重新初始化sp和auth_manager,绝对不能复用旧对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:47:04