Spotify API如何为自有账号实现程序永久授权
Spotify桌面应用自动永久鉴权实现方案
核心逻辑分两部分:一是通过本地环回地址监听回调,省去手动粘贴回调链接的步骤;二是持久化存储refresh_token,自动过期刷新,实现一次授权永久有效。
前置配置
提前在你创建的Spotify应用设置里,把http://localhost:8888/callback添加到允许的重定向URI列表中,地址必须完全匹配,否则会报回调地址不合法错误。
实现要点
- 放弃公网回调地址,改用本地环回地址作为回调,程序内置临时HTTP服务监听端口,自动捕获授权码,无需用户手动复制粘贴跳转后的链接
- 不要把token缓存放在exe同级的安装目录,要存在系统分配的用户专属应用数据目录,避免Windows下Program Files目录无写入权限导致缓存失败
- 依赖Spotipy原生的token自动刷新逻辑,只要缓存中保存的refresh_token没有被用户主动撤销,access token过期后会自动换新,不需要重复走授权流程
- 开启自动唤起系统默认浏览器的配置,用户第一次授权只需要点一下同意即可,后续启动完全无感知
参考实现代码
import os import sys import spotipy from spotipy.oauth2 import SpotifyOAuth def get_spotify_token_cache_path(): # 跨平台生成用户级配置目录,避免权限问题 if os.name == "nt": # Windows系统 base_path = os.getenv("APPDATA") app_dir = os.path.join(base_path, "SpotifyPlaylistTool") elif sys.platform == "darwin": # macOS系统 base_path = os.path.expanduser("~/Library/Application Support") app_dir = os.path.join(base_path, "SpotifyPlaylistTool") else: # Linux系统 base_path = os.path.expanduser("~/.config") app_dir = os.path.join(base_path, "SpotifyPlaylistTool") # 目录不存在则自动创建 os.makedirs(app_dir, exist_ok=True) return os.path.join(app_dir, "auth_token.cache") # 按需替换成你自己应用的client_id和client_secret CLIENT_ID = "你的应用client_id" CLIENT_SECRET = "你的应用client_secret" AUTH_SCOPE = "playlist-modify-public playlist-read-private playlist-modify-private" REDIRECT_URI = "http://localhost:8888/callback" sp = spotipy.Spotify( auth_manager=SpotifyOAuth( client_id=CLIENT_ID, client_secret=CLIENT_SECRET, redirect_uri=REDIRECT_URI, scope=AUTH_SCOPE, open_browser=True, cache_path=get_spotify_token_cache_path() ) ) # 首次运行执行任意接口调用就会自动触发鉴权流程 # current_user = sp.current_user() # print(current_user["display_name"])
补充说明
如果你选的8888端口被本机其他程序占用,可以换成任意1024以上的未占用端口,只要同步修改Spotify开发者后台的重定向地址即可。
第一次启动程序会自动唤起系统默认浏览器跳转到Spotify授权页,用户点击同意后页面会自动跳转到本地回调地址,程序会自动完成后续token获取,不需要用户做任何复制粘贴操作。
只要用户不在Spotify账号的第三方应用授权列表里移除你的应用,本地缓存的refresh_token就一直有效,程序启动时会自动读取缓存、刷新过期的access token,全程无感知,打包成exe后也不会出现鉴权错误。
内容的提问来源于stack exchange,提问作者add-itya
相关产品推荐
相关产品推荐

