在OpenMediaVault上运行含OAuth2.0的Python Spotify脚本遇阻求助
无浏览器环境下Spotify OAuth授权解决方案
你的问题核心是:需要用户授权的OAuth流程(Authorization Code Flow)依赖浏览器交互,但NAS没有图形界面;而Client Credentials Flow是无用户上下文的,无法访问用户私有数据。解决思路是在有浏览器的机器上预获取刷新令牌,之后NAS端用这个刷新令牌自动续期访问令牌,全程无需浏览器。
1. 在本地电脑预生成刷新令牌缓存
修改脚本,让它在本地生成包含刷新令牌的缓存文件,第一次运行时完成浏览器认证即可:
import spotipy from spotipy.oauth2 import SpotifyOAuth CLIENT_ID = "你的client_id" CLIENT_SECRET = "你的client_secret" REDIRECT_URI = "http://localhost:8888/callback" USER_ID = "你的user_id" SCOPE = "user-read-private user-read-email" # 初始化OAuth客户端,指定缓存文件路径 sp_oauth = SpotifyOAuth( client_id=CLIENT_ID, client_secret=CLIENT_SECRET, redirect_uri=REDIRECT_URI, scope=SCOPE, username=USER_ID, cache_path=".cache-spotify" ) # 触发认证(第一次会弹浏览器,之后直接读缓存) token_info = sp_oauth.get_access_token() print(f"缓存文件已生成:{sp_oauth.cache_path}")
运行这个脚本,在本地完成Spotify账号授权,会在当前目录生成.cache-spotify文件,里面存着刷新令牌。
2. 部署到NAS并修改脚本
把.cache-spotify文件复制到NAS上脚本所在的目录,然后替换NAS上的脚本为以下内容:
import spotipy from spotipy.oauth2 import SpotifyOAuth CLIENT_ID = "你的client_id" CLIENT_SECRET = "你的client_secret" REDIRECT_URI = "http://localhost:8888/callback" USER_ID = "你的user_id" SCOPE = "user-read-private user-read-email" # 加载本地生成的缓存文件 sp_oauth = SpotifyOAuth( client_id=CLIENT_ID, client_secret=CLIENT_SECRET, redirect_uri=REDIRECT_URI, scope=SCOPE, username=USER_ID, cache_path=".cache-spotify" ) # 自动检查令牌是否过期,过期则用刷新令牌续期 token_info = sp_oauth.get_access_token() if sp_oauth.is_token_expired(token_info): token_info = sp_oauth.refresh_access_token(token_info["refresh_token"]) # 初始化Spotify客户端并测试 sp = spotipy.Spotify(auth=token_info["access_token"]) user_data = sp.current_user() print(f"用户ID:{user_data['id']},邮箱:{user_data['email']}")
这个脚本运行时会自动读取缓存里的刷新令牌,无需任何交互,就能获取有效的访问令牌来读取用户信息。
注意事项
- 缓存文件里的刷新令牌长期有效,除非你在Spotify账号的“已授权应用”里撤销了这个应用的权限。
- 确保NAS上的Python环境安装了spotipy:
pip install spotipy - 如果后续需要修改授权范围(SCOPE),需要删除缓存文件,回到本地电脑重新运行第一步的脚本生成新缓存。
内容的提问来源于stack exchange,提问作者PapierFlieger
相关产品推荐
相关产品推荐

