我正在尝试一个项目,该项目收集我所有每月的公用事业金额并分散欠我室友的金额。我已经设法以编程方式登录到两个网站,但我在最后一个网站上遇到了问题,因为它们使用的是 SAML (https://www.blackhillsenergy.com/)。我已经使用 Chrome 的开发人员工具检查了网络请求,但没有取得任何突破。我尝试使用 requests_ecp 但我也没有任何运气。我得到了 SAML 的想法,但很难理解它们的实现以及如何在我的脚本中使用它。下面是我的示例代码?有什么想法吗?
def get_bh_bill():
url = 'https://www.blackhillsenergy.com/cpm/v1/user/accounts?username={fill here}'
bh_login = ''
bh_pass = ‘'
# Start a session so we can have persistent cookies
session = requests.session()
session.auth = HTTPECPAuth('https://sso.blackhillsenergy.com', username=bh_login, password=bh_pass)
acc_res = session.get(url)
acc_soup = BeautifulSoup(acc_res.text, "html.parser")
print(acc_soup.prettify())
return '0000'
答案 0 :(得分:0)
SAML 通常是这样工作的。
您访问了所需的站点,他们发现您未通过身份验证,因此他们创建了一个 SAML 请求,将其路由到您的浏览器,然后将您发送到 IdP,即身份提供商。
IdP 读取 SAML 请求,然后要求您提供凭据。通过身份验证后,它会创建一个 SAML 响应,并通过您的浏览器将其路由回原始站点。
路由是通过呈现一个简单的 HTML 表单来完成的,其中包含 SAML 请求/响应,以及少量的 javascript 来提交它。这就是它跨域移动信息的方式(SAML 通常跨域完成,这就是它不使用 cookie 的原因。)
您的脚本需要做的基本上是遵循工作流程,自动提交表单,在询问时登录,然后将表单提交回来。这是一个多步骤的工作流程。也可能涉及大量重定向。