You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何自动获取动态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

火山引擎 最新活动