问题是我可以使用Jsoup发布由javascript控制的登录数据吗?这是迄今为止的信息
网站的登录网址:
http://www.cybernations.net/login.asp
(他们确实有无机器人政策,但我通过电子邮件发送给管理员并获得了下载游戏数据文件的自动登录权限)
存储文件的URL
http://www.cybernations.net/stats_downloads.asp
我使用Jsoup来解析登录页面的html以向我显示脚本的代码行...
Elements scriptTags = doc.getElementsByTag("script");
循环遍历元素列表的输出...
<!--
function FrontPage_Form1_Validator(theForm)
{
if (theForm.Username.value == "")
{
alert("Please enter a value for the \"Username\" field.");
theForm.Username.focus();
return (false);
}
if (theForm.Username.value.length > 40)
{
alert("Please enter at most 40 characters in the \"Username\" field.");
theForm.Username.focus();
return (false);
}
if (theForm.Validate_Password.value == "")
{
alert("Please enter a value for the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
if (theForm.Validate_Password.value.length < 1)
{
alert("Please enter at least 1 characters in the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
if (theForm.Validate_Password.value.length > 50)
{
alert("Please enter at most 50 characters in the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
return (true);
}
//-->
编辑1:编辑了连接代码 登录的当前代码如下所示,返回登录页面。
Connection.Response loginForm = Jsoup.connect( loginURL )
.method(Connection.Method.GET)
.execute();
Document document = Jsoup.connect( loginURL )
.data("Login", "Login")
.data("Username", user )
.data("Validate_Password", pass )
.cookies(loginForm.cookies() )
.post();
我觉得我在这里缺少一些非常简单的东西,我应该指示connect()方法遵循重定向吗?
编辑2:感谢您的所有帮助,我想我将切换到Apache的http客户端,因为它(希望)可以让我更好地控制连接。谢谢大家!
答案 0 :(得分:1)
您发布的功能就是验证输入,您可以忽略它,因为服务器可能不允许用户名和密码不符合他们的标准。
如果您想像网页一样发送登录信息,您只需要POST到“/login.asp”。只需查看HTML中的表单:
<form action="/login.asp" method="POST" name="FrontPage_Form1" .....
您必须自己处理登录。您可能需要从响应标头中读取cookie并在某处记住它们,然后将每个后续请求发送回服务器(就像Web浏览器那样)。有关详细信息,请查看this。
此外,您可能需要考虑如何处理验证码。看来他们的网站强制您在访问该页面两次后传递验证码,这将阻止您的程序无法登录。
您可以查看this answer以获取有关如何自动登录的更多信息。要回答有关保存cookie的问题,只要在向服务器发出其他请求时可以访问它们,保存它们并不重要。我刚刚链接的答案有代码来访问您登录时从服务器返回的cookie(使用您的变量修改):
Connection.Response res = Jsoup.connect("http://www.cybernations.net/login.asp")
.data("Username", "myUsername", "Validate_Password", "myPassword")
.method(Method.POST)
.execute();
Document doc = res.parse();
String sessionId = res.cookie("ASPSESSIONIDAAACSTQB");
同样的答案向您展示了如何使用jsoup在后续请求中发送cookie:
Document doc2 = Jsoup.connect("http://www.cybernations.net/stats_downloads.asp")
.cookie("ASPSESSIONIDAAACSTQB", sessionId)
.get();
现在, 您需要准确保存的Cookie是您需要弄清楚的。尝试使用Google Chrome中的开发者选项。登录该站点,查看该站点用于存储会话的cookie的名称(有几个)。然后尝试使用上面的代码模拟它。
我应该提一下,我没有为这个网站测试过这段代码。这需要时间和耐心,但这是工作的一部分。
答案 1 :(得分:1)
表单HTML元素是最重要的。您必须检查什么是表单方法和参数名称。
<form action="/login.asp" method="POST" name="FrontPage_Form1" onsubmit="return FrontPage_Form1_Validator(this)" language="JavaScript" >
...
<input value="" name="Username" id="Username" type="text" class="displayFieldIE" size="30" maxlength="40">
...
<input value="" name="Validate_Password" id="Validate_Password" type="password" class="displayFieldIE" size="30" maxlength="50">
...
</form>
因此,您必须使用参数Username和Validate_Password将数据发布到login.asp。
您链接的Javascript是为了验证用户输入。无需处理。
答案 2 :(得分:1)
我的方法中没有任何问题。可能是网站正在检查来源。尝试将引荐来源设置为
String loginURL = "http://www.cybernations.net/login.asp";
Connection.Response loginForm = Jsoup.connect(loginURL)
.method(Connection.Method.GET).execute();
Document document = Jsoup.connect(loginURL)
.data("Login", "Login")
.data("Username", user)
.data("Validate_Password", pass)
.header("Host", "www.cybernations.net")
.header("Origin", "http://www.cybernations.net")
.referrer(loginURL)
.cookies(loginForm.cookies())
.post();
首次尝试失败后,该网站使用验证码。所以一定要传递正确的凭据。 ;)
如果这不起作用,请尝试通过apache http client连接并将响应传递给jsoup进行解析