java - 使用 Java 在启用 JavaScript 的网页上自动执行 Web 任务

标签 java javascript jquery http cookies

我正在使用 Java。

基本上我想要实现的是能够在网络上运行自动化任务。例如登录网站、在那里做事、填写表格、注销等。

我已经成功地通过使用 HttpURLConnection 类发送基本的 POST 和 GET 消息,在不存在 javascript 代码(仅 html、html 表单)的简单网站上做到了这一点(登录并发送评论)。

问题是我遇到了一个网站,它使用 javascript 代码生成 session cookie(在客户端)。因此,当您访问此站点时,JavaScript 代码将在浏览器中执行,生成 session cookie。这些 cookie 会随每个请求一起发送,没有它们,网站将无法运行。 (就是这个网站http://www.jofogas.hu/)

我无法获取这些 cookie,因为我不知道如何找出执行了哪些 Javascript 代码,也不知道如何在 Java 中运行 javascript 代码,然后使用该代码的结果。

最佳答案

回答如何:

首先我看到 set-cookie header 没有设置任何名为 ses 的 cookie,并且这个 cookie 神奇地出现了。您知道,在 javascript 中,要设置 cookie,您可以调用 document.cookie。因此,我获取了源代码,自动缩进,然后搜索 document.cookie。您很容易就会发现 setNewSessionCookie,并且可以看到它创建了一个名为 ses 的 cookie。

function setNewSessionCookie() {
    var b = get_vid();
    var d;
    var e;
    var a;
    var c = new Date();
    c.setTime(c.getTime());
    a = getCookie("ses");
    if (!a) {
        b = get_vid();
        if (!b) {
            return
        }
        d = (new Date()).getTime();
        a = b + "_" + d
    }
    e = new Date(c.getTime() + (1000 * 60 * 15));
    document.cookie = name + "ses=" + a + ";expires=" + e.toGMTString()
}

此 cookie 使用变量 a 的值进行设置,该变量由 get_vid() 设置。

function get_vid() {
    var b;
    var a = getCookie("vsid");
    if (!a) {
        return false
    }
    if (a.search(",") == "-1") {
        b = Base64.decode(a)
    } else {
        b = a
    }
    return b.split(",")[0]
}

TL;DR:该函数获取vsid cookie(通过set-cookie header发送),对其进行base64解码,并返回逗号之前的部分。接下来,通过附加 "_"+ (new Date()).getTime()

创建 ses cookie

就我而言:

getCookie("vsid") // "ODk5NjEwMzEsMTQzNDMwNDM4Ng=="
Base64.decode(getCookie("vsid")) // "89961031,1434304386"
getCookie("ses") // "89961031_1434304048406"

我警告您有关网络抓取的法律问题,它可能违反网站使用条款(这些条款不是我所说的任何语言......)。

编辑:对于问题:

Automated webtasks on javascript enabled webpages, using Java

您可能对 Selenium Project 感兴趣和他们的java driver

关于java - 使用 Java 在启用 JavaScript 的网页上自动执行 Web 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832314/

相关文章:

java - 我想要 Spring 注入(inject)的函数需要可变参数。我应该提供一个需要列表的重载吗?

java - 将 DICOM 标签解析为 ArrayList<String>

javascript - 为什么 "1"++ "1"= "11"但 "1"- - "1"= 2 在 JavaScript 中

javascript - 来自显示 :none to display:inline-block animation, 图像轮播

java - 安全输出流

java - JOAuth,一个基于 java 的 OAuth 1(最终版)和 OAuth 2(草案 10)库。我该如何使用它?

JavaScript 按字母顺序创建索引映射

javascript - focus() 在隐藏 div 内的输入上不起作用

jquery - 它没有在添加的行中显示 A、B、C... 按钮,但我希​​望 A、B、C... 按钮不显示在顶部控件上

javascript - 为什么这会导致最大调用堆栈错误?