TLDR:
我使用HtmlUnit
无头浏览器登录,网站将我重定向到一个页面,在该页面上我必须单击“提交”按钮才能继续,在HtmlUnit
中找不到其元素。登录后找不到找到该页面的方法。此页面not上有常规的人工登录。
背景
我的学校有一个学习环境,我们订阅课程以下载课程材料等。
[当我刚开始学习Java来学习一门课程时,我想我可以尝试看看是否可以使Java应用程序登录并为我获取所有课程资料。
我必须注意,此学习环境要求从Microsoft环境登录,该登录类似于Outlook,但是为大学定制的。也许这为我进入的页面提供了线索。
我尝试了什么
我看了HtmlUnit,看来无头浏览器至少可以完成我的登录目标。我设置了一个WebClient
并导航到该页面。
例如:
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.getOptions().setRedirectEnabled(true);
HtmlPage page = webClient.getPage(LOGIN_FORM_URL);
一切顺利,我进入登录页面并隔离了表单,并用我的凭据填写了输入内容:
HtmlForm form = page.getForms().get(0);
HtmlEmailInput username = form.getInputByName("UserName");
HtmlPasswordInput pass = form.getInputByName("Password");
HtmlElement buttonElement = form.getElementsByTagName("span").get(1);
username.setValueAttribute(USERNAME);
pass.setValueAttribute(PASSWORD);
HtmlPage page2 = buttonElement.click();
问题
我原本希望重定向到学习环境,但页面却很奇怪。这是用page2.asXml()
打印的结构:
<html>
<head>
<title>
Working...
</title>
</head>
<body>
<form method="POST" name="hiddenform" action="https://engine.surfconext.nl:443/authentication/sp/consume-assertion">
<input type="hidden" name="SAMLResponse" value="PHNhbWxwOl.... An insanely long value />
<noscript>
<p>Script is disabled. Click Submit to continue.</p><input type="submit" value="Submit" />
</noscript>
</form>
<script language="javascript">
//<![CDATA[
window.setTimeout('document.forms[0].submit()', 0);
//]]>
</script>
</body>
</html>
在我的一生中,我可以not弄清楚如何单击noscript标记之间的输入。
我试图用getElementsByTagName
查找提交输入,因此可以模拟对它的单击,但是它似乎甚至都没有意识到它在那里。当我在noscript标签上使用getChildElementCount()
时,它返回了0
。
我需要做一些特别的事情才能通过此页面吗?
我认为这个问题的回答范围很广,但是随着您提供更多的信息和发现,我将更新答案。
免责声明:此答案仅用于教育目的。我不愿意帮助您构建网络抓取工具。至少不是免费的;)
您登陆的页面是一个反爬虫页面,旨在防止自动系统登录到该页面。这意味着两个想法:
这可以使您理解,在前进的道路上可能还有其他这种技术可以阻止您继续前进,但是值得一试。
首先,可能仅由于不良的HTTP标头设置而检测到您,尝试更改BrowserVersion甚至尝试重现真实浏览器的HTTP标头。
如果不起作用,我们很容易去这里,因为form
和input
都包装在<noscript>
标签中(这里我告诉您SURFspot如何改进) ,因此您可以解析method
和action
格式的属性,并输入name
和value
,然后只需生成一个伪造的发帖请求即可(因此,您无需单击按钮,而是伪造如果您能够...会发生什么?
因此,在正确的URL上生成具有正确值的表单发布。检查它们是否为您设置了cookie(如果也要复制它们),并将正确的值设置为realm
标头(它们也可能会进行检查),然后门将打开。