Flask+Spotipy开发问题:他人授权后播放列表创建于开发者账户
问题分析与修复方案
核心问题
你遇到的问题根源是Spotify客户端对象(sp)没有关联到当前授权用户的凭证,而是始终使用你自己的开发者账户凭证初始化。不管其他用户怎么授权,所有API操作都走你的账户,自然播放列表会创建在你的账户下。
具体修复步骤
1. 为每个用户会话存储独立的授权凭证
在Flask的用户会话(session)中保存当前用户的Spotify access token,确保每个用户请求都用自己的token初始化sp对象,而不是复用全局的sp。
2. 动态初始化用户专属的Spotify客户端
在处理创建播放列表的路由里,从会话中取出当前用户的token,用它初始化sp,而不是使用固定的开发者凭证。
修改后的代码示例
from flask import Flask, session, request, redirect from spotipy import Spotify app = Flask(__name__) app.secret_key = "你的Flask密钥" # 假设授权回调路由已经正确获取并存储用户token @app.route('/callback') def callback(): # 这里是获取Spotify授权码、兑换token的逻辑 token_info = ... # 从Spotify API获取的用户token信息 session['spotify_token'] = token_info['access_token'] return redirect('/create-playlist') @app.route('/create-playlist', methods=['POST']) def create_playlist(): # 取出当前用户的token,未登录则跳转授权 access_token = session.get('spotify_token') if not access_token: return redirect('/login') # 用当前用户的token初始化Spotify客户端 sp = Spotify(auth=access_token) username = sp.me()['id'] # 你的业务逻辑(检查YT链接有效性等) spotifyPlaylistName = request.form.get('playlist_name') videoId = ... # 从YT链接解析出的视频ID列表 # 创建播放列表 sp.user_playlist_create(username, spotifyPlaylistName) playlistId = getPlaylistId(sp, username, playlistName=spotifyPlaylistName) trackIds = getTrackIds(sp, videoIds=videoId) sp.user_playlist_add_tracks(username, playlistId, trackIds) return "播放列表已成功创建到你的Spotify账户" def getPlaylistId(sp, username, playlistName): playlistId = '' playlists = sp.user_playlists(username) for playlist in playlists['items']: if playlist['name'] == playlistName: playlistId = playlist['id'] break # 找到后立即退出循环,提升效率 return playlistId def getTrackIds(sp, videoIds): trackIds = [] for title in videoIds: results = sp.search(q=f'{title}', type='track') if results['tracks']['total'] == 0: continue trackIds.append(results['tracks']['items'][0]['uri']) return trackIds
额外注意事项
- 确保你的OAuth授权流程正确引导用户登录自己的Spotify账户,获取的是用户的授权码,而非你自己的固定凭证。
- 若使用
SpotifyOAuth类,要确保每个请求的cache_path不共用,或者直接用会话存储token,避免不同用户的凭证互相覆盖。
内容的提问来源于stack exchange,提问作者RICKY SINGHA
相关产品推荐
相关产品推荐

