[英]HtmlUnit Login attempt leads to a weird page I can't get past. "Script is disabled. Click Submit to continue"
域名注册地址:
我使用HtmlUnit
无头浏览器登录,站点将我重定向到一个页面,我必须单击提交按钮才能继续,在HtmlUnit
找不到它的元素。 登录后找不到点击它进入所需页面的方法。 此页面不存在常规人工登录。
背景
我的学校有一个学习环境,我们可以在其中订阅课程以下载课程资料等。
当我刚开始为一门课程学习 Java 时,我想我可以尝试看看我是否可以制作一个 Java 应用程序,它可以登录并为我获取所有课程材料。
我必须指出,此学习环境需要从类似于 Outlook 的Microsoft 环境登录,但为大学定制。 也许这提供了关于我登陆的页面应该是什么的线索。
我试过的
我查看了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>
我一生都无法弄清楚如何点击 noscript 标签之间的输入。
我试图用getElementsByTagName
找到提交输入,这样我就可以模拟点击它,但它似乎甚至没有意识到它在那里。 当我在 noscript 标签上使用getChildElementCount()
时,它返回0
。
我需要做一些特别的事情才能通过这个页面吗?
我认为这个问题需要回答的范围很广,但是当您提供更多信息和发现时,我会更新答案。
免责声明:此答案仅用于教育目的。 我不愿意帮你构建一个网络爬虫。 至少不是免费的;)
您登陆的页面是一个反爬虫页面,其目的是防止自动系统登录到该页面。 这暗示了两个想法:
这可以让您了解,在此过程中可能还有其他此类技术会阻止您继续进行,但值得一试。
首先,您可能只是因为 HTTP 标头设置不佳而被检测到,尝试更改 BrowserVersion,甚至尝试重现真实浏览器的 HTTP 标头。
如果它不起作用,我们很容易到这里,因为form
和input
都被包裹在一个<noscript>
标签中(这里我告诉你 SURFspot 如何改进),所以你可以解析表单method
和action
属性和输入name
和value
那么您只需要在下一步中生成一个假的发布请求(所以您不是单击按钮而是假装如果您能够...
因此,生成一个带有正确值的表单帖子到正确的 URL。 检查他们是否为您设置了 cookie(如果是,也复制它们)并将正确的值设置为realm
标头(他们可能也在检查),然后门就会打开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.