如何通过Python获取Spotify OAuth 2.0授权后的回调URL及Code参数?
我正在跟着Spotify文档通过Web API做OAuth 2.0认证,写了下面这段Python代码发起授权请求:
import requests endpoint_auth = 'https://accounts.spotify.com/authorize' redirect_uri = 'http://localhost:8888/spotify/index.html' client_id = '1234567890' scope = "playlist-modify-private" params_auth = { "response_type": "code", "client_id": client_id, "scope": scope, "redirect_uri": redirect_uri, } response_auth = requests.get(url=endpoint_auth, params=params_auth) print(response_auth.status_code) print(response_auth.text)
运行这段代码后,第一个打印输出的状态码是200(请求正常),第二个打印的是登录页面的HTML内容。把这段HTML存成文件打开会报错,但直接在浏览器里拼接授权URL(比如https://accounts.spotify.com/authorize?response_type=code&client_id=1234567890&redirect_uri=http://localhost:8888/spotify/index.html&scope=playlist-modify-private)访问时,页面会跳转到回调URL(http://localhost:8888/spotify/index.html?code=23u2344u123u4u1),并且URL里会携带用来获取访问令牌的Code参数。
我的问题是:能不能在Python发起授权请求后,直接读取到携带Code参数的回调URL,就像打印response_auth.text那样获取到这个URL?
答案:不行,但有这些实用替代方案
直接用requests库做不到这一点,核心原因是:requests发起的是纯后端HTTP请求,没有浏览器的交互能力。Spotify的OAuth 2.0授权流程必须依赖用户在浏览器里完成登录、确认授权这两个关键操作——这两步需要真人参与(或者工具模拟真人操作),requests只能帮你拿到登录页面的静态HTML,没法替你完成登录和授权动作,自然拿不到跳转后的回调URL。
给你几个可行的解决办法:
方案一:用浏览器自动化工具模拟操作
比如selenium或者playwright这类工具,它们能完全模拟真实浏览器的行为。你可以用它们打开授权URL,自动完成登录(测试环境可预设账号)、点击授权按钮,然后抓取跳转后的回调URL提取Code。举个简单的Selenium示例:from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() # 拼接授权URL auth_url = f"https://accounts.spotify.com/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&scope={scope}" driver.get(auth_url) # 请根据Spotify登录页的实际元素ID/选择器修改以下代码 # driver.find_element(By.ID, "login-username").send_keys("你的Spotify账号") # driver.find_element(By.ID, "login-password").send_keys("你的Spotify密码") # driver.find_element(By.ID, "login-button").click() # time.sleep(2) # 等待登录完成 # driver.find_element(By.ID, "authorize-button").click() # 等待跳转后获取当前URL并提取Code time.sleep(3) callback_url = driver.current_url code = callback_url.split("code=")[1].split("&")[0] print(f"获取到的Code:{code}") driver.quit()方案二:搭建本地临时服务接收回调
用Python的flask或fastapi搭一个极简的本地Web服务,把它设为你的redirect_uri。当用户在浏览器完成授权后,Spotify会把Code参数传到这个服务的接口里,你就能直接拿到Code了。举个Flask的例子:from flask import Flask, request app = Flask(__name__) @app.route('/spotify/index.html') def spotify_callback(): code = request.args.get('code') print(f"成功获取到Code:{code}") # 这里可以直接用Code请求Spotify的访问令牌 return "授权成功,Code已获取,可关闭此页面" if __name__ == '__main__': app.run(port=8888)运行这个服务后,在浏览器打开授权URL完成授权,本地服务就会打印出Code参数。
方案三:手动复制Code(适合测试场景)
如果只是临时测试,直接在浏览器打开授权URL,完成授权后从地址栏复制带Code的回调URL,手动提取Code用到你的代码里就行——这是最省事的办法,不用额外写工具代码。
内容的提问来源于stack exchange,提问作者Wall3-8e

