问题是我可以使用Jsoup发布由javascript控制的登录数据吗?这是迄今为止的信息
该站点的登录URL:
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客户端,因为它(希望)可以让我更好地控制连接 . 谢谢你们!
3 回答
表单HTML元素是最重要的 . 您必须检查什么是表单方法和参数名称 .
因此,您必须使用参数Username和Validate_Password将数据发布到login.asp .
您链接的Javascript用于验证用户输入 . 无需处理 .
我认为你的方法没有任何问题 . 可能是网站正在检查来源 . 尝试将引荐来源设置为
首次尝试失败后,该网站使用验证码 . 所以一定要传递正确的凭据 . ;)
如果这不起作用,请尝试通过apache http client连接并将响应传递给jsoup进行解析
您发布的那个功能就是验证输入,您可以忽略它,因为服务器可能不允许用户名和密码不符合他们的标准 .
如果您想像网页那样发送登录信息,您只需要POST到“/login.asp” . 只需在HTML中查看表单:
你必须自己处理登录 . 您可能需要从响应标头中读取cookie并在某处记住它们,然后将每个后续请求发送回服务器(就像Web浏览器一样) . 有关详细信息,请查看this .
此外,您可能需要考虑如何处理验证码 . 看起来他们的网站强制您在访问该页面两次后传递验证码,这将阻止您的程序无法登录 .
编辑:
您可以查看this answer以获取有关如何自动登录的更多信息 . 要回答有关保存cookie的问题,只要在向服务器发出其他请求时可以访问它们,保存它们并不重要 . 我刚刚链接的答案有代码来访问您登录时从服务器返回的cookie(使用您的变量修改):
同样的答案向您展示了如何使用jsoup在后续请求中发送cookie:
现在,您需要准确保存的cookie是您需要弄清楚的 . 尝试使用Google Chrome中的开发者选项 . 登录该站点,查看该站点用于存储会话的cookie的名称(有几个) . 然后尝试用上面的代码模拟这个 .
我应该提一下,我没有为此站点测试此代码 . 这需要时间和耐心,但这是工作的一部分 .