Java - 创建模拟浏览器

时间:2012-07-05 21:33:48

标签: java

我正在开发一个与社交网络上的用户交互的程序。我想要一个处理大部分或全部网络通信的工具

我的工作涉及登录网站,阅读帖子,发送回复和个人信息。

我最初认为我可以处理与某些套接字代码的必要交互。我最初的单次运行案例成功运行(我能够登录,发布内容,回复查询等),但是尝试一起运行所有内容都不起作用(服务器无法识别我的请求,各种其他错误)。我做了一些非常糟糕的cookie跟踪,我将套接字从80切换到443用于SSL通信,我生成自己的数据包发送到社交网络服务器,因为这是我第一次尝试进行网络交互,所以我离我很远深度。我更喜欢跟踪cookie,处理SSL通信,处理一般通信问题等的集成解决方案。基本上我希望我能给出一个按钮的X,Y坐标(或者从页面获取按钮列表,找到我想要的那个) ,选择那个)和文本框中输入内容的文本,让模拟浏览器执行所有必要的数据包,以实现网络交互。

我想知道是否有一个我可以使用的java模拟浏览器。即,我可以获取页面上文本框的句柄,输入我的登录信息并执行登录过程(模拟浏览器将处理所有cookie,处理各个数据包等)

我的目标是拥有一个程序,我可以在我的计算机上运行,​​可以与社交网络上的用户进行交互,而不需要我的任何重要输入(我不希望程序垄断Firefox,这阻止我使用Firefox而在我的系统上)

对于上下文,我发送典型的html页面调用以及自定义数据包调用(并解析结果)

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

我建议您使用以下两条路线之一:

选项1: 使用Apache Http Components Library。我发现这很容易用于将表单数据发送到Web服务器。它支持SSL和cookie,虽然我还没有用它。我遇到的唯一问题是我似乎无法通过代理服务器进行通信。 见my the question I posted about this. 但是,只要您不通过代理,我就给图书馆一个热烈的推荐,我在上面链接中发布的代码显示了它的易用性。以下是将表单数据发送到Web服务器的代码示例:

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.methods.*;  //HttpHead, HttpPut, HttpGet, etc...
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.entity.*;
import org.apache.http.impl.client.SystemDefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public static void sendForm(String user, String val) throws IOException {    
    List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    formparams.add(new BasicNameValuePair("user", user));
    formparams.add(new BasicNameValuePair("message", val));
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
    String uri = "http://theServer.com";
    HttpPost httppost = new HttpPost(uri);  
    HttpClient httpclient = new SystemDefaultHttpClient();
    HttpResponse response = httpclient.execute(httppost);
    response.getStatusLine().toString() + "\n" +
    EntityUtils.toString(response.getEntity()));
    System.out.println(EntityUtils.toString(response.getEntity()));       
}

选项2: JavaFX附带了一个功能齐全的Web浏览器,称为Web视图。您可以通过编程方式与其进行交互,这在最近的Java Spotlight Podcast部分中进行了讨论。

答案 1 :(得分:0)

你可以embed env.rhino.js in your Java app

env.js是“作为脚本环境的浏览器的高度可移植的javascript实现(通常称为'无头'浏览器)。”

rhino实现使用rhino javascript引擎,它是JavaScript的Java运行时,并将随Oracle Java实现一起提供。

env.js具有相当的能力,因为它使用了参考html5解析器的交叉编译版本,并且可以处理充分利用jQuery库和html dom的JavaScript。


此外,我确实喜欢Thorn对JavaFX Web组件的建议。但是,如果您不需要显示任何视觉效果,则可能只需要WebEngine而不是WebView。

答案 2 :(得分:0)

行业标准是Selenium。它通常用于创建自动化系统测试,但它可以在需要代码内浏览器的任何地方使用。

我会告诫你,让它运作起来可能是一个陡峭的学习曲线......需要相当大的奥术glue code,但是一旦你开始运行它就会非常好。