如何自动获取动态Access Token或使用账号密码发起GET请求?
解决Access Token自动获取或凭证直接请求的问题
很理解你反复去DevTools找Token的麻烦——15分钟过期确实折腾人。这里给你两个靠谱的解决方案,帮你彻底摆脱手动操作:
方案一:自动获取Access Token并复用
核心思路是模拟用户登录的流程,从登录接口直接拿到最新的Token,再把它注入到你的请求里。步骤如下:
- 定位登录接口:打开Chrome DevTools的Network标签,清空现有请求后重新在网站登录。找到登录时触发的POST请求(通常路径类似
/api/auth/login或/web/login),记录它的URL、请求头和请求体格式。 - 编写登录请求代码:用
requests发送登录请求,传入你的用户名和密码,解析返回的JSON数据提取Access Token。 - 整合到现有脚本:把获取Token的逻辑放在请求目标接口之前,每次请求前确保拿到最新的Token(或者捕获401未授权错误时重新获取)。
示例代码整合:
import requests def get_access_token(username, password): login_url = "https://www.containers.io/api/auth/login" # 替换为实际登录接口 login_payload = { "username": username, "password": password # 可能需要额外参数,比如验证码、rememberMe等,根据DevTools里的请求体调整 } login_headers = { 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", 'content-type': "application/json" # 若请求体是表单则改为application/x-www-form-urlencoded } response = requests.post(login_url, json=login_payload, headers=login_headers) response.raise_for_status() # 处理登录失败的情况 return response.json()["access_token"] # 替换为实际返回的Token字段名 # 主逻辑 username = "your_real_username" password = "your_real_password" try: access_token = get_access_token(username, password) url = "https://www.containers.io/web/alerts" querystring = { "access_token": access_token, "envId": "58739be2c2", "folderId": "active", "sortBy": "status" } headers = { 'origin': "https://www.containers.io", 'accept-encoding': "gzip, deflate, br", 'accept-language': "en-US,en;q=0.9", 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", 'accept': "application/json, text/plain, */*", 'referer': "https://www.containers.io", 'connection': "keep-alive", 'cache-control': "no-cache", } response = requests.get(url, headers=headers, params=querystring) response.raise_for_status() JSON_format = response.json() print(JSON_format) except requests.exceptions.RequestException as e: print(f"请求出错: {e}")
方案二:使用Session保持认证状态
有些网站登录后会通过Cookie维持会话,不需要每次请求都带Token。这种情况下,你可以用requests.Session()对象来自动管理Cookie:
- 先通过Session发送登录请求,Session会自动保存登录后的Cookie。
- 后续用同一个Session发送目标GET请求,无需手动添加Token参数,Session会自动带上Cookie完成认证。
示例代码:
import requests username = "your_real_username" password = "your_real_password" # 初始化Session session = requests.Session() session.headers.update({ 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" }) # 登录 login_url = "https://www.containers.io/api/auth/login" login_payload = {"username": username, "password": password} session.post(login_url, json=login_payload) # 发送目标请求(无需手动带access_token) url = "https://www.containers.io/web/alerts" querystring = { "envId": "58739be2c2", "folderId": "active", "sortBy": "status" } headers = { 'origin': "https://www.containers.io", 'accept-encoding': "gzip, deflate, br", 'accept-language': "en-US,en;q=0.9", 'accept': "application/json, text/plain, */*", 'referer': "https://www.containers.io", 'connection': "keep-alive", 'cache-control': "no-cache", } response = session.get(url, headers=headers, params=querystring) response.raise_for_status() JSON_format = response.json() print(JSON_format)
注意事项
- 登录接口的参数和格式一定要和DevTools里抓到的一致,比如有些网站会要求
csrf-token,需要先从页面获取再放到请求头里。 - 如果Token过期后请求会返回401状态码,可以在代码里捕获这个错误,自动重新登录获取新Token再重试请求。
- 不要把真实的用户名和密码硬编码在脚本里,建议用环境变量或者配置文件来存储,比如
os.getenv("USERNAME")。
内容的提问来源于stack exchange,提问作者user3819295




