我正在使用 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/