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

如何在Python中获取需用户交互的Notion API OAuth流程的重定向URL

如何在Python中获取需用户交互的Notion API OAuth流程的重定向URL

我明白你现在的痛点——手动复制重定向URL太麻烦,想让整个OAuth流程自动化对吧?之前用requests.head()的方法行不通很正常,因为Notion的OAuth必须要用户实际登录授权,纯HTTP请求根本模拟不了这个需要人工交互的过程。下面给你两种靠谱的实现思路,你可以根据自己的需求选择:

方法一:搭建本地临时回调服务器(推荐,符合OAuth规范)

Notion的OAuth流程要求你配置一个回调URL,当用户完成登录和授权后,Notion会自动把包含授权码code的请求跳转到这个地址。我们可以在本地快速搭建一个轻量的Web服务,专门监听这个回调请求,从而自动捕获到重定向后的URL和里面的code参数。

步骤示例(用Flask实现)

  1. 先安装Flask依赖:
pip install flask requests
  1. 编写代码:
from flask import Flask, request
import requests
import webbrowser

app = Flask(__name__)

# 替换成你的Notion集成信息
CLIENT_ID = "你的Notion客户端ID"
CLIENT_SECRET = "你的Notion客户端密钥"
REDIRECT_URI = "http://localhost:5000/callback"  # 要和你Notion集成里配置的回调URL一致

@app.route('/callback')
def callback():
    # 从回调请求中获取授权码
    auth_code = request.args.get('code')
    print(f"捕获到授权码:{auth_code}")
    
    # 这里可以直接用授权码换取access token
    token_response = requests.post(
        "https://api.notion.com/v1/oauth/token",
        json={
            "grant_type": "authorization_code",
            "code": auth_code,
            "redirect_uri": REDIRECT_URI,
            "client_id": CLIENT_ID,
            "client_secret": CLIENT_SECRET
        }
    )
    access_token = token_response.json().get('access_token')
    print(f"获取到的访问令牌:{access_token}")
    
    # 返回提示页面,告诉用户流程完成
    return "授权完成!你可以关闭这个页面了,回到终端查看结果。"

if __name__ == '__main__':
    # 生成Notion的授权URL并自动打开浏览器
    auth_url = f"https://api.notion.com/v1/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code"
    webbrowser.open(auth_url)
    
    # 启动本地服务器,监听回调
    app.run(host='localhost', port=5000, debug=False)
  1. 关键配置:
  • 登录Notion开发者后台,找到你的集成,把Redirect URIs设置为http://localhost:5000/callback(和代码里的REDIRECT_URI保持一致)。
  • 运行代码后,浏览器会自动打开Notion的授权页面,你完成登录和授权后,本地服务器就会自动捕获到code并换取令牌。

方法二:用Selenium模拟浏览器交互(适合不想搭服务器的场景)

如果不想搭建本地Web服务,你可以用自动化浏览器工具Selenium来模拟用户操作:打开授权页面、等待用户完成登录授权、然后直接捕获跳转后的URL,从中提取code。

步骤示例

  1. 先安装依赖:
pip install selenium

还要下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),并把驱动路径配置到环境变量里,或者在代码里指定路径。

  1. 编写代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import urllib.parse

# 替换成你的Notion集成信息
CLIENT_ID = "你的Notion客户端ID"
REDIRECT_URI = "http://localhost:5000/callback"  # 同样要和Notion集成里的配置一致

# 初始化浏览器驱动(这里以Chrome为例)
driver = webdriver.Chrome()

# 打开Notion的授权页面
auth_url = f"https://api.notion.com/v1/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code"
driver.get(auth_url)

try:
    # 等待用户完成登录和授权,直到页面跳转到回调URL(这里用回调URL的域名作为判断条件)
    WebDriverWait(driver, 300).until(
        EC.url_contains(REDIRECT_URI)
    )
    
    # 获取当前跳转后的URL
    redirected_url = driver.current_url
    print(f"捕获到重定向URL:{redirected_url}")
    
    # 解析URL中的code参数
    parsed_url = urllib.parse.urlparse(redirected_url)
    auth_code = urllib.parse.parse_qs(parsed_url.query).get('code')[0]
    print(f"提取到授权码:{auth_code}")
    
finally:
    # 关闭浏览器
    driver.quit()

注意事项

  • 运行代码后,会弹出一个浏览器窗口,你需要在这个窗口里完成Notion的登录和授权操作,代码会自动等待你完成,然后捕获URL。
  • 这种方法更适合本地测试,生产环境还是推荐用第一种回调服务器的方式。

额外提示

  • 授权码code只能使用一次,拿到后要立即调用Notion的令牌接口换取access_token。
  • 如果你用Notion SDK的话,拿到access_token后就可以直接初始化客户端进行后续操作了。

备注:内容来源于stack exchange,提问作者Shrishvesh Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:49:50