Java - 创建模拟浏览器

标签 java

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

我的工作包括登录网站、阅读帖子、发送回复和个人消息。

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

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

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

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

谢谢你的帮助

最佳答案

我建议您选择以下两条路线之一:

选项 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 View 。您可以通过编程方式与其交互,这在 Java Spotlight Podcast 的最近一期中进行了讨论.

关于Java - 创建模拟浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11352888/

相关文章:

java - 如何实现 OnFragmentInteractionListener?

java - 将包含 boolean 值的文本文件作为对象读取到数组列表中

c# - AsyncTask 错误无法发送 POST 数据

java - 相当于 HANDLE* 的 JNA

java - 使用Weka : Can Training Data be of Multiple Length?

java - 从 Java 程序运行系统命令时无输出

Java-如何从字符串 '$'中删除符号 '$49monthly'

java - 关闭程序后如何重用以前的变量值

maven - 在没有 Maven 的情况下构建 Maven 项目

java - 确保通用参数不是原始参数