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

如何通过SSO认证的URL使用Python下载文件并解决认证错误

解决SSO认证下Python请求CSV文件的问题

问题分析

返回的HTML内容显示目标网站采用OAM(Oracle Access Manager)单点登录系统,这类认证并非简单的HTTP基础认证(Basic Auth),而是需要通过表单提交、会话Cookie及JavaScript处理完成完整认证流程。你当前使用的requests.get(url, auth=(user, password))仅适用于Basic Auth,无法应对这种复杂的SSO认证逻辑。

解决方案

方法1:会话保持+模拟表单提交

先获取登录页面的动态隐藏参数,提交表单完成认证后,保持会话请求CSV文件:

import requests
from bs4 import BeautifulSoup

csv_url = "https://Path-to-url&Action=Download&format=CSV"
username = 'user-name'
password = 'password'

# 创建会话对象,自动维护Cookie
session = requests.Session()

# 第一步:访问CSV地址,触发重定向获取登录页面
response = session.get(csv_url)
soup = BeautifulSoup(response.content, 'html.parser')

# 提取表单中所有隐藏参数
form_data = {}
for input_tag in soup.find_all('input', type='hidden'):
    form_data[input_tag['name']] = input_tag['value']

# 填入账号密码
form_data['username'] = username
form_data['password'] = password

# 获取表单提交地址
login_url = soup.find('form')['action']

# 第二步:提交登录表单完成认证
session.post(login_url, data=form_data)

# 第三步:再次请求CSV文件,此时会话已通过认证
csv_response = session.get(csv_url)

# 保存文件
with open("BGCustomersbySKU-OCI.csv", "wb") as f:
    f.write(csv_response.content)

方法2:浏览器自动化(应对复杂JS验证)

如果上述方法失效(如存在验证码、动态JS校验),可直接模拟浏览器行为:

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 time

csv_url = "https://Path-to-url&Action=Download&format=CSV"
username = 'user-name'
password = 'password'

# 初始化Chrome浏览器(需对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(csv_url)

# 等待登录页面加载并输入账号密码
wait = WebDriverWait(driver, 10)
username_input = wait.until(EC.presence_of_element_located((By.NAME, 'username')))
password_input = driver.find_element(By.NAME, 'password')

username_input.send_keys(username)
password_input.send_keys(password)

# 提交登录表单
driver.find_element(By.CSS_SELECTOR, 'form[name="myForm"]').submit()

# 等待文件下载完成(根据实际情况调整等待时长)
time.sleep(5)

driver.quit()

关键注意事项

  • OAM认证依赖会话Cookie,必须使用requests.Session()保持会话状态,避免每次请求重新初始化连接。
  • 登录表单中的bmctx、OAM_REQ等参数为动态生成,需每次请求时实时提取,不可硬编码。
  • 若网站启用多因素认证(MFA),需额外添加对应验证步骤的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:40:31