如何在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实现)
- 先安装Flask依赖:
pip install flask requests
- 编写代码:
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)
- 关键配置:
- 登录Notion开发者后台,找到你的集成,把Redirect URIs设置为
http://localhost:5000/callback(和代码里的REDIRECT_URI保持一致)。 - 运行代码后,浏览器会自动打开Notion的授权页面,你完成登录和授权后,本地服务器就会自动捕获到
code并换取令牌。
方法二:用Selenium模拟浏览器交互(适合不想搭服务器的场景)
如果不想搭建本地Web服务,你可以用自动化浏览器工具Selenium来模拟用户操作:打开授权页面、等待用户完成登录授权、然后直接捕获跳转后的URL,从中提取code。
步骤示例
- 先安装依赖:
pip install selenium
还要下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),并把驱动路径配置到环境变量里,或者在代码里指定路径。
- 编写代码:
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
相关产品推荐
相关产品推荐

