首页 文章

Jsoup登录废弃游戏数据

提问于
浏览
0

问题是我可以使用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 回答

  • 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用于验证用户输入 . 无需处理 .

  • 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进行解析

  • 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的名称(有几个) . 然后尝试用上面的代码模拟这个 .

    我应该提一下,我没有为此站点测试此代码 . 这需要时间和耐心,但这是工作的一部分 .

相关问题