You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python获取Spotify OAuth 2.0授权后的回调URL及Code参数?

关于Spotify OAuth 2.0授权中直接获取回调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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:57:36