Spotify Web授权Python代码报错‘code must be supplied’求助
解决Spotify Web授权"code must be supplied"错误
问题根源分析
你的代码存在两个关键问题导致授权失败:
- 拼写错误:
SPOTIFTY_CLIENT_ID里多了一个字母T,应该是SPOTIFY_CLIENT_ID。这个错误会导致Spotify无法识别你的客户端身份,直接阻断授权流程。 - 缺少授权触发逻辑:仅初始化
SpotifyOAuth和Spotify实例还不够,当没有缓存令牌时,你需要主动触发授权流程,引导用户完成登录授权并获取回调中的授权码(code)。
修复步骤及代码示例
1. 修正客户端ID拼写
把SPOTIFTY_CLIENT_ID改为SPOTIFY_CLIENT_ID,确保和你在Spotify开发者后台创建的应用信息完全一致。
2. 添加完整授权流程处理
在调用sp.current_user()之前,先检查缓存的令牌是否存在。如果不存在,生成授权URL引导用户完成授权,再解析回调URL中的code来交换并缓存令牌。
修改后的完整代码:
import spotipy from spotipy.oauth2 import SpotifyOAuth import webbrowser from urllib.parse import urlparse, parse_qs # 你的配置参数 REDIRECT_URL = "http://localhost:8080/callback" # 必须和开发者后台设置的重定向URI完全一致 SPOTIFY_CLIENT_ID = "你的客户端ID" SPOTIFY_CLIENT_SECRET = "你的客户端密钥" STATE = "random_state_string" SCOPE = "user-read-private user-read-email" # 根据需求调整权限范围 USERNAME = "你的Spotify用户名" auth_manager = SpotifyOAuth( redirect_uri=REDIRECT_URL, client_id=SPOTIFY_CLIENT_ID, client_secret=SPOTIFY_CLIENT_SECRET, state=STATE, scope=SCOPE, show_dialog=True, cache_path="token.txt", username=USERNAME ) # 检查缓存的令牌是否有效 token_info = auth_manager.get_cached_token() if not token_info: # 生成授权URL auth_url = auth_manager.get_authorize_url() print(f"请访问以下URL完成授权:\n{auth_url}") # 自动打开浏览器(可选,也可以手动复制URL访问) webbrowser.open(auth_url) # 让用户输入授权后的回调URL print("授权完成后,复制浏览器地址栏的完整URL并粘贴到这里:") callback_url = input().strip() # 解析回调URL中的授权码code parsed_url = urlparse(callback_url) code = parse_qs(parsed_url.query).get("code", [None])[0] if not code: print("授权失败:未获取到有效授权码") exit(1) # 用code交换令牌并写入缓存文件 token_info = auth_manager.get_access_token(code) # 初始化Spotify客户端 sp = spotipy.Spotify(auth_manager=auth_manager) try: user_id = sp.current_user()["id"] print(f"Authenticated user ID: {user_id}") except spotipy.SpotifyException as e: print(f"Authentication failed: {e}") except Exception as e: print(f"An error occurred: {e}")
3. 额外注意事项
- 确保
REDIRECT_URL和Spotify开发者后台应用设置中的重定向URI完全一致,包括协议(http/https)、域名和端口。 - 首次运行时,完成浏览器授权后必须把地址栏的完整URL复制回程序,这样才能生成
token.txt缓存文件。 - 后续运行时,只要
token.txt存在且令牌未过期,程序会自动读取缓存,无需重复授权。
内容的提问来源于stack exchange,提问作者Chisom
相关产品推荐
相关产品推荐

