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

如何在Python中通过登录凭证获取请求头Authorization密钥?

问题描述

想用requests库访问某需要携带Authorization请求头的网站数据,但手动获取的密钥几分钟就失效,希望通过登录凭证自动获取该密钥。尝试过多种代码方案:前两种提交登录请求返回404;第三种用HTTPBasicAuth得到200状态码,但响应头中没有Authorization字段,不知道如何提取密钥。

用户尝试的代码示例:

代码1(返回404)

import requests

headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}

login_url = 'https://example.com/login'

login_data = {
    'username': 'username',
    'password': 'password'
}

session = requests.session()
login_response = session.post(login_url, data=login_data, headers=headers)

print(login_response.status_code) # always gives 404

代码2(返回404)

import requests

headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
username = "username",
password = "pass",
url = "https://url.com/login"
with requests.session() as session:
    reponse = session.post(url, auth=(username, password), headers=headers)

print(reponse) # it gives 404 also

代码3(返回200但未获取到Authorization密钥)

import requests
from requests.auth import HTTPBasicAuth

headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
username = "user",
password = "pass",
url = "https://url.com"
response = requests.get(url, auth=HTTPBasicAuth(username, password), headers=headers)

print(response) # 200
print(response.headers) #doesnt have "authorization"

解决方案

核心分析

HTTPBasicAuth是将用户名密码编码为Base64直接放在Authorization头中,但多数现代网站的登录流程是提交表单后返回Token(如JWT),或把Token存入Cookie/响应体,而非直接在响应头返回Authorization字段。你得到200说明身份验证成功,但密钥不在响应头里,需要从响应体或Cookie中提取。

具体操作步骤

1. 抓包确认真实登录流程

用浏览器开发者工具(F12→「网络」标签)手动登录一次,重点观察:

  • 真实的登录请求URL(绝非猜测的/login,常见格式如/api/auth/login)
  • 请求方法(大概率是POST)
  • 请求体参数名(可能不是username/password,比如user_account/passwd,部分网站还需携带csrf_token)
  • 登录成功后Token的存储位置:是在响应体的JSON数据中(如{"token": "Bearer xxx"}),还是Cookie的某个字段里(如access_token)

2. 调整代码适配真实流程

示例1:Token在响应体中返回

import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
# 替换为抓包得到的真实登录接口URL
login_url = "https://xxx.com/api/auth/login"
# 按抓包到的参数名填写
login_data = {
    "user_account": "你的用户名",
    "passwd": "你的密码",
    "csrf_token": "抓包获取的csrf值"  # 若网站需要,先访问登录页获取
}

session = requests.Session()
# 先访问登录页面,获取必要的Cookie或csrf_token(如果需要)
session.get("https://xxx.com/login", headers=headers)
login_response = session.post(login_url, data=login_data, headers=headers)

if login_response.status_code == 200:
    # 解析响应体提取Token
    result = login_response.json()
    auth_token = result.get("token")  # 替换为实际返回的键名
    # 构造Authorization请求头
    headers["Authorization"] = f"Bearer {auth_token}"
    # 用Session访问需要授权的接口
    data_response = session.get("https://xxx.com/api/data", headers=headers)
    print(data_response.text)

示例2:Token存储在Cookie中

import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
login_url = "https://xxx.com/api/auth/login"
login_data = {"username": "你的用户名", "password": "你的密码"}

session = requests.Session()
login_response = session.post(login_url, data=login_data, headers=headers)

if login_response.status_code == 200:
    # 从Cookie中提取Token(替换为实际的Cookie键名)
    auth_token = session.cookies.get("access_token")
    headers["Authorization"] = f"Bearer {auth_token}"
    data_response = session.get("https://xxx.com/api/data", headers=headers)
    print(data_response.text)

3. 解决之前的404问题

之前的代码返回404,核心原因是登录URL错误,必须使用抓包得到的真实接口,而非自行猜测。此外,部分网站要求登录请求携带Referer头,或需先访问首页获取Cookie后再提交登录请求。

注意事项

  • 若网站有验证码,需额外处理(如调用验证码识别工具)
  • Token前缀(如Bearer)需与抓包到的格式一致,不能随意修改
  • 使用requests.Session()可自动维持Cookie,避免重复处理身份验证信息

内容的提问来源于stack exchange,提问作者Rachid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:15:17