`
cjcrobin
  • 浏览: 12862 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

使用HttpClient4.X模拟浏览器登录使用Google Alert(一)

    博客分类:
  • Java
阅读更多
最近使用Google Alert,然后就想自己做点东西,结果悲剧的发现Google Alert居然没有提供API给开发者直接使用.无比蛋疼之余只好尝试着使用HttpClient来模拟浏览器行为进行登录,伪造一份Google Alert API出来使用.

这种方法的好处在于,就程序所获得的信息基本和我们从浏览器看到的信息差不多,问题就在于一旦访问量大了的话,Google会做出反应的。

接下来一步步来简单实现这些功能。

1.第一步我们需要确定,登陆的网页,在这里,Google所有的登录页面最后都会转到https://accounts.google.com/ServiceLogin这个页面或者https://accounts.google.com/ServiceLoginAuth。这个连接后面可能有一大堆的参数比如https://accounts.google.com/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com.sg/alerts/manage,但是可以完全忽略。
有了这个连接我们就可以像浏览器一样发送请求然后返回登录的界面。普通的在浏览器地址栏输入的连接发送的都是GET请求,因此我们使用HttpGet来模拟。

DefaultHttpClient hc = new DefaultHttpClient();
HttpGet request = new HttpGet(url);


此外,浏览器很重要的一个行为就是会在访问中加入HTTP Header,所以我们也需要在访问的连接中加入HTTP Header。至于需要加入什么Header,我们可以通过观察Chrome中的network来了解。



最基本的我们一般会加入ACCEPT, ACCEPT-LANGUAGE, USER-AGENT这些信息。比如添加ACCEPT我们可以用
request.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");


设置完HTTP Header我们就可以发送HTTP请求了,发送完请求我们应该会得到服务端给的回复就是Response。
HttpResponse response = hc.execute(request);


但这里得到的还是Response对象,还无法直接获得HTML文件。我们需要借助输入输出流来获得hmtl码。
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));


接下来,大家应该很熟悉了,一行一行的读去就行。
StringBuffer result = new StringBuffer();
while((line = br.readLine()) != null){
result.append(line);
}


最后的result.toString()就将输出我们所需要的HTML了。
到这里,so happy, 我们已经提取到了登录页面的HTML码了,剩下的我们就需要获取这个登录页面中的一些登录所需要的信息了。

2.第二,我们需要知道发送登录请求的连接,这个我们可以通过chrome或者firefox中查看得到。



从上图我们可以很清楚的看到,Google的登录不仅仅只是登录用户名和密码,还有许多其他的隐藏信息。这也就是我们为什么需要抓取登录页面的原因,这样我们才能够获取到这些参数。

为了获取这些参数,我们可以手动的去一个一个的找出来,更好的一种方法是使用Jsoup包,使用Jsoup包就和javascript中使用getElementById之类的方法一样,可以很方便的获取HTML中的元素。

Document doc = Jsoup.parse(html);//将纯HTML文本转化成具有结构的Document对象
Element formEl = doc.getElementById("gaia_loginform");//获取登录form
Elements inputs = formEl.getElementsByTag("input");//获取form底下的所有input


除了网页中自带的一些参数,最重要的是用户名和密码,因此如果是用户名或者密码的input,我们不能直接使用默认的value,而是我们指定的value。

for(Element el: inputs) {//loop循环每一个input
    String elName = el.attr("name");//获取input的name属性
    String elValue = el.attr("value");//获取input的value属性
    String elType = el.attr("type");//获取input的type属性
    
    if(elName.equals("Email")) {
        elValue = name;//如果属性名是Email,就将值设置成用户定义的值
    }else if(elName.equals("Passwd")) {
        elValue = word;//如果属性名是Passwd,就将值设置为用户定义的值
    }
    
    if(!elName.equals("button")&&!elType.equals("submit")) {//此外有些button是input应排除
        list.add(new BasicNameValuePair(elName, elValue));//创建键值对加入list
    }
}


以上这段代码返回的list就包含了我们所需要的所有登录的参数了。剩下的我们就需要像之前模拟GET请求一样,模拟浏览器发送POST请求。

和GET请求一样我们需要先创建一个request。这里的url是我们从登录页面上的form action获取的url。
HttpPost request = new HttpPost("https://accounts.google.com/ServiceLoginAuth");


然后同样的设置HTTP Header。
request.setHeader(......);


唯一不同的是,我们需要设置POST附带的参数。这里使用setEntity方法。params是一个List<NameValuePair>。也就是前一段代码中返回的变量list。
request.setEntity(new UrlEncodedFormEntity(params));


设置完参数,就可以发送request然后接收response了。不过这里我们还添加了第二个参数,context,这个context会记录一个请求所需要的一些数据变量,暂时先不用了解,到了后面我们会了解到其用途。
HttpResponse response = hc.execute(request, context);//context 是 HttpContext的对象


这样我们就登录成功了。要想知道是否真的成功了我们可以查看返回的状态码。
int statusCode = response.getStatusLine().getStatusCode();


这里的状态码应该是会返回302,也就是说暂时发生了跳转,这是因为Google跳转到另外的连接进行了认证。这样我们就顺利的完成了登录。

今天就到这里吧,太累了,明天还要继续上班,礼拜五快来吧........过后我们还会继续登录后的操作,这才是登录的意义所在不是。在所有内容之后我会将整个代码放上,所以如果有不明白的,欢迎大家回复讨论,也可以到时看代码了解。
Note:与新浪博客同步
  • 大小: 40 KB
  • 大小: 32 KB
分享到:
评论
2 楼 cjcrobin 2013-09-27  
sorry, 刚看到, 你可以试看看最简单的
context = new BasicHttpContext();
1 楼 救爷你好 2013-09-25  
卤煮,请问你httpcontext 怎么初始化的?我用你的方法返回状态码是200,说名没有登录成功,怎么破?

相关推荐

    HttpClient 3.x to HttpComponents HttpClient 4.x

    随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...

    httpclient 4.X版本下载有的带源码包

    2013-11-21 15:31 292,890 httpclient-4.0.2.jar 2017-12-20 12:08 351,132 httpclient-4.1.1.jar 2012-08-03 01:45 451,595 httpclient-4.1.2-sources.jar 2012-08-03 01:44 352,254 httpclient-4.1.2.jar 2012-08-...

    httpclient4.x官方范例

    在4.x版本中,HTTPClient进行了重大更新,与之前的3.x版本相比,它引入了更多的功能、优化和改进。本文将深入探讨HTTPClient 4.x的核心特性,并基于提供的"httpclient4.1_examples"示例文件,解析如何使用这个库进行...

    HTTPClient 4.3.X

    标题 "HTTPClient 4.3.X" 涉及的是Apache HttpClient库的一个版本,这是一个广泛使用的Java库,用于实现客户端HTTP通信。这个库为开发者提供了丰富的功能,包括发送HTTP请求,处理响应,管理连接池,处理cookies,...

    httpclient4.3.x及其依赖jar包

    HttpClient 4.3.x是该库的一个重要版本,它提供了丰富的功能和改进,使得开发者能够更方便地与Web服务器进行交互。在本文中,我们将深入探讨HttpClient 4.3.x的核心特性、依赖关系以及如何在实际项目中应用。 **...

    Java HttpClient 4.x Jar包

    含tutorial,commons-logging-1.1.1, commons-codec-1.4-bin.zip, httpcomponents-client-4.0.3-bin.zip, httpcomponents-core-4.1-bin.zip

    可用org.apache.commons.httpclient-3.1.0.jar.zip

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....

    HttpClient4.x手动释放底层HTTP连接[借鉴].pdf

    HttpClient4.x是Apache提供的一款高效的HTTP客户端库,它提供了许多强大的功能,例如支持GET、POST、PUT、DELETE等请求方法、支持HTTPS、支持Cookie、支持缓存等等。但是,使用HttpClient4.x时需要手动释放底层HTTP...

    httpclientDemo(4.x与4以下的版本)例子

    这个"HttpclientDemo(4.x与4以下的版本)"示例显然涵盖了HttpClient在不同版本间的使用方法,特别是4.x版本和4.x之前的版本之间的差异。在本文中,我们将深入探讨HttpClient的基本概念、主要功能以及在不同版本中的...

    JAVA-用HttpClient来模拟浏览器GET,POST.docx

    JAVA使用HttpClient模拟浏览器GET、POST请求 在本文中,我们将介绍如何使用Apache Commons HttpClient库来模拟浏览器的GET和POST请求。HttpClient库是一个开放源码的项目,是Apache Commons项目的一部分,旨在简化...

    HttpClient3.1.jar

    HttpClient3.1.jar是Apache HttpClient库的一个版本,它在Java编程环境中用于实现HTTP客户端通信。...以下是对HttpClient3.1...在新的项目中,开发者通常会考虑使用更新的版本(如HttpClient 4.x)或替代品,如OkHttp。

    android原生POST、httpClient4.X实现向PHP服务器上传文件 源码

    《android原生POST、httpClient4.X实现向PHP服务器上传文件》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/17565481,奶奶个熊,今天CSDN写个博客都写不成,格式啥啥的完全跟写的时候不...

    httpclient-4.5.2.jar.zip

    HttpClient 4.x系列是Apache基金会开发的一个开源项目,旨在提供一个高效的、高度可定制的HTTP客户端API。4.5.2版本在4.5.1的基础上修复了一些已知问题,增强了性能,并对API进行了微调,以更好地适应现代网络环境。...

    HttpClient所需jar包(全) httpClient.4.13jar

    HttpClient 4.13版本是这个库的一个较新版本,包含了一系列的改进和修复。 在Java开发中,HttpClient是一个常用的工具,尤其在处理Web服务或者API调用时。它支持同步和异步操作,可以处理复杂的HTTP协议细节,使...

    java httpclient 模拟登录

    在Java编程中,HttpClient库是Apache提供的一款强大的HTTP客户端工具,用于执行HTTP请求,包括GET、POST、PUT等多种HTTP方法。...对于更复杂的情况,可能需要使用HTMLUnit或Selenium等工具进行浏览器级别的模拟登录。

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...

    httpclient4.4.1 and httpclient4.5.3.rar

    HttpClient 4.5.3是4.x系列的一个重要升级,它引入了更多新功能和改进,进一步增强了HttpClient的稳定性和可扩展性: - **HTTP/2支持**:HttpClient 4.5.3引入了对HTTP/2协议的支持,这是一个重要的进步,因为它...

Global site tag (gtag.js) - Google Analytics