如何为请求生成JWT?程序化模拟文件下载请求遇阻
程序化模拟动态JWT的文件下载请求方案
要解决这个动态JWT的下载问题,核心是模拟浏览器的完整会话流程,先获取有效JWT再发起下载请求,具体步骤如下:
核心思路
JWT是服务器基于当前会话生成的临时凭证,必须在同一个会话上下文内获取并使用。因此需要先建立会话、访问目标页面获取会话标识,再抓包定位JWT的生成接口,最后用获取到的JWT构造下载请求。
具体步骤
- 初始化会话:用HTTP客户端(如Python requests、Node.js axios)创建带Cookie持久化的会话,确保和服务器保持同一个会话上下文。
- 访问目标页面:请求你提供的文档页面,获取服务器设置的会话Cookie,同时解析页面内容,提取文件名称、接口标识等必要参数。
- 抓包定位JWT接口:打开浏览器开发者工具(F12),切换到Network标签,勾选「Preserve log」,点击下载按钮,观察所有请求:
- 找到返回JWT的接口(通常是XHR/Fetch请求,响应体包含
jwt或token字段) - 记录该接口的请求URL、请求方式(GET/POST)和所需参数
- 找到返回JWT的接口(通常是XHR/Fetch请求,响应体包含
- 获取动态JWT:用同一个会话调用JWT生成接口,拿到有效JWT。
- 构造下载请求:将JWT替换到下载URL的对应位置,用同一个会话发送GET请求,将响应内容保存为文件。
Python示例代码
import requests from bs4 import BeautifulSoup # 目标文档页面 target_page = "https://patentcenter.uspto.gov/applications/63199073/ifw/docs?application=" # 替换为实际的BASE_URL,从浏览器下载请求中提取 base_download_url = "https://patentcenter.uspto.gov/retrieve/" # 初始化会话,保持Cookie session = requests.Session() # 设置浏览器UA,避免被拦截 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }) # 1. 访问目标页面,建立会话 response = session.get(target_page) response.raise_for_status() # 2. 解析页面获取文件名(示例,实际需根据页面结构调整) soup = BeautifulSoup(response.text, "html.parser") # 假设文件名在下载按钮的自定义属性中,需实际验证页面结构 download_btn = soup.find("button", {"class": "download-button"}) file_name = download_btn.get("data-file-name") # 3. 调用JWT生成接口(需从抓包结果替换为真实接口) jwt_res = session.get("https://patentcenter.uspto.gov/api/auth/generate-token") jwt_res.raise_for_status() jwt_token = jwt_res.json().get("jwt") # 4. 构造下载请求并保存文件 download_url = f"{base_download_url}{file_name}&&directStream=true&JWT={jwt_token}" download_res = session.get(download_url, stream=True) download_res.raise_for_status() with open(file_name, "wb") as f: for chunk in download_res.iter_content(chunk_size=8192): f.write(chunk)
注意事项
- 必须全程使用同一个会话对象,否则服务器会认为是新请求,无法生成有效JWT。
- 抓包时要仔细核对JWT接口的请求参数,部分接口可能需要携带页面返回的csrf token等参数。
- 控制请求频率,避免触发站点的反爬机制。
内容的提问来源于stack exchange,提问作者katrin_melody
相关产品推荐
相关产品推荐

