我正在编写一个python脚本,从我的学校网站下载课程内容(mp4,pdf)。我的学校使用Weblogin SSO身份验证来访问任何受保护的URL。
我可以使用下面脚本的第一部分验证我的凭据:
#1. Authenticate
login_url = "https://weblogin.MY_SCHOOL.edu/login"
payload = {'login':'my_loging','password':'my_pass'}
target_url = "https://My_SCHOOL.instructure.com/courses/12345678""
with requests.Session() as c:
req_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36}'}
c.headers.update(req_headers)
c.get(login_url) # to get cookies
c.post(url1, data=payload) #,headers = req_headers)
#2. get html from target site
W1 = c.get(target_url)
print(W1.url)
print(W1.text)
#3. parse html and download content.
#tbc
我可以看到我的身份验证在c.post.text中成功,但是当我尝试在相同的request.session()中使用get()访问任何目标站点时,我没有得到预期的我的类的html内容,而是一条消息:
"由于您的浏览器不支持JavaScript,因此您必须按 继续按钮一次以继续"
目标网址重定向到此网址:
" https://idp.MY_SCHOOL.edu/idp/profile/SAML2/Redirect/SSO"
为什么在成功进行SSO身份验证后无法访问目标网址?我不确定请求模块中的javascript支持是否是这里的问题,因为即使我在我的互联网浏览器中禁用JS支持,我也能看到target_url的一些html内容,尽管不是全部。我的get()请求卡在重定向的网址中似乎很奇怪:" https:... / SAML2 / Redirect / SSO"
我很感激有关如何解决这个问题的任何指示。我不想使用硒或机械化等网络驱动程序。我使用QtWebkit来呈现Javascript内容,但我不知道是否可以将我的身份验证cookie从request.session()传输到QtWebkit。
非常感谢任何帮助。谢谢
答案 0 :(得分:0)
我不是SSO的专家,但我想我知道发生了什么。在典型情况下,您的浏览器会将您的登录凭据发布到登录URL。响应将是包含表单的html页面。表单将包含您的SSO令牌。在html页面中,嵌入式javascript会将表单提交给您尝试访问的应用程序。应用程序将验证令牌,然后授予您访问权限。启用javascript后,会无缝地发生这种情况。如果您在浏览器中关闭javascript并尝试登录,则会收到相同的消息,您必须按一个按钮才能提交包含令牌的表单。要通过脚本执行此操作,您将不得不解析表单,获取令牌值,然后自己发布。