HtmlUnit 登录尝试导致我无法通过的奇怪页面。 "Script is disabled. Click Submit to continue"
HtmlUnit Login attempt leads to a weird page I can't get past. "Script is disabled. Click Submit to continue"
TLDR:
我使用 HtmlUnit
无头浏览器登录,站点将我重定向到一个页面,我必须单击提交按钮才能继续,在 HtmlUnit
中找不到它的元素。登录后找不到点击它转到所需页面的方法。此页面 不 正常人工登录。
背景
我的学校有一个学习环境,我们可以在其中订阅课程以下载课程 material 等。
因为我刚开始学习 Java 一门课程,我想我可以尝试看看我是否可以制作一个 java 应用程序来登录并获取所有课程 material对我来说。
我必须注意,此学习环境需要从 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>
我不能 想出如何点击 noscript 标签之间的输入。
我试图用 getElementsByTagName
找到提交输入,这样我就可以模拟点击它,但它似乎甚至没有意识到它在那里。当我在 noscript 标签上使用 getChildElementCount()
时,它返回 0
。
我需要做一些特别的事情才能通过这个页面吗?
我认为这个问题的回答范围很广,但是当您提供更多信息和发现时,我会更新答案。
免责声明:此答案仅用于教育目的。我不愿意帮助您构建网络抓取工具。至少不是免费的 ;)
您登陆的页面是一个 anti-scraper 页面,其构建目的是为了防止自动系统登录该页面。这意味着两个想法:
- 已检测到您的假浏览器(即使您是从常规 ip 连接的)
- 他们正试图阻止您。
这可以让您了解可能有其他技术会阻止您继续进行,但值得一试。
首先,您可能只是因为 HTTP header 设置不当才被检测到,请尝试更改浏览器版本,甚至尝试重现您真实浏览器的 HTTP header。
如果它不起作用,我们很容易到这里,因为 form
和 input
都包裹在 <noscript>
标签中( 这里我告诉你 SURFspot 如何改进 ),所以你可以解析表单 method
和 action
属性并输入 name
和 value
然后你需要只是为了下一步产生一个假的 post 请求(所以你不是点击按钮而是假装如果你能够...
会发生什么
因此,生成一个表格 post,右边 URL 具有正确的值。检查他们是否为您设置了 cookie(如果是,也复制它们)并将正确的值设置为 realm
header(他们也可能正在检查)并且门应该打开。
TLDR:
我使用 HtmlUnit
无头浏览器登录,站点将我重定向到一个页面,我必须单击提交按钮才能继续,在 HtmlUnit
中找不到它的元素。登录后找不到点击它转到所需页面的方法。此页面 不 正常人工登录。
背景
我的学校有一个学习环境,我们可以在其中订阅课程以下载课程 material 等。
因为我刚开始学习 Java 一门课程,我想我可以尝试看看我是否可以制作一个 java 应用程序来登录并获取所有课程 material对我来说。
我必须注意,此学习环境需要从 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>
我不能 想出如何点击 noscript 标签之间的输入。
我试图用 getElementsByTagName
找到提交输入,这样我就可以模拟点击它,但它似乎甚至没有意识到它在那里。当我在 noscript 标签上使用 getChildElementCount()
时,它返回 0
。
我需要做一些特别的事情才能通过这个页面吗?
我认为这个问题的回答范围很广,但是当您提供更多信息和发现时,我会更新答案。
免责声明:此答案仅用于教育目的。我不愿意帮助您构建网络抓取工具。至少不是免费的 ;)
您登陆的页面是一个 anti-scraper 页面,其构建目的是为了防止自动系统登录该页面。这意味着两个想法:
- 已检测到您的假浏览器(即使您是从常规 ip 连接的)
- 他们正试图阻止您。
这可以让您了解可能有其他技术会阻止您继续进行,但值得一试。
首先,您可能只是因为 HTTP header 设置不当才被检测到,请尝试更改浏览器版本,甚至尝试重现您真实浏览器的 HTTP header。
如果它不起作用,我们很容易到这里,因为 form
和 input
都包裹在 <noscript>
标签中( 这里我告诉你 SURFspot 如何改进 ),所以你可以解析表单 method
和 action
属性并输入 name
和 value
然后你需要只是为了下一步产生一个假的 post 请求(所以你不是点击按钮而是假装如果你能够...
因此,生成一个表格 post,右边 URL 具有正确的值。检查他们是否为您设置了 cookie(如果是,也复制它们)并将正确的值设置为 realm
header(他们也可能正在检查)并且门应该打开。