HttpClient4,最原始的需求就是使用其来模拟浏览器想服务器发起http请求,当然,他的功能不止于此,但是我需要的就是这个功能而已,jdk也有其自带的类似的api:UrlConnection,效率比httpclient高,但是和其他第三方产品一样,比httpclient原始,其实http协议是在tcp/ip协议之上的,所以,如果是用socket来实现也是可以的,只不过更原始了,没这个必要了!

Httpclient4和Httpclient3的区别较大,但如果会用一个,另一个只要看一下例子或api就会用了,简单!

实例化一个client,设置策略:

DefaultHttpClient client = new DefaultHttpClient();
//设置 HttpClient 接收 Cookie,用与浏览器一样的策略
client.getParams().setParameter("http.protocol.cookie-policy",
CookiePolicy.BROWSER_COMPATIBILITY);

实例化一个Post方法:

这里的gsid是微博是否登录成功的关键,相关知识是在模拟微博登录的过程中的,后来我还发现还有一个st的参数也是必不可少的,这个参数也可以通过登录之后分析获取。就是这么简单。

HttpPost post = new HttpPost("http://weibo.cn/mblog/sendmblog?vt=4&gsid="+gsid+"&st=" + st);//de00

为这个post请求设置http头信息:

这些头信息我们可以先在浏览器访问这个连接地址,比如在firefox,然后用httpfox工具抓取这个请求信息,然后按照抓到的信息一个一个的填写。

post.setHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1");
post.setHeader("host", "weibo.cn");
post.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
post.setHeader("Accept-Language","zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
post.setHeader("Accept-Encoding", "gzip, deflate");//没有这句,反馈回来的response Content-Length 值为0,所以要加上这句,一点一点的和HttpFox抓取的数据比较,就可以找出问题所在。
post.setHeader("Referer","http://weibo.cn/mblog/sendmblog?vt=4&gsid=" + gsid + "&st=" + st);//13c5
//post.setHeader("Referer","http://m.weibo.cn/");
post.setHeader("Cookie", "gsid_CTandWM=" + gsid);
post.setHeader("Connection","keep-alive");
post.setHeader("Content-Type","multipart/form-data; boundary=---------------------------9994580724461");

多媒体实体:

其中分割线与Header中的参数boundary一致。

MultipartEntity reqEntity =  new MultipartEntity(null,"---------------------------9994580724461", null);

给多媒体实体设置相应的参数,包括图片:

String imageurl = "D:\\baiduimage-jiezhi\\" + this.getImageNameCount() + ".jpg";
StringBody con = new StringBody("戒指控 @爱银饰");
reqEntity.addPart("content", con);
if (!imageurl.equals("")) {
FileBody file = new FileBody(new File(imageurl),"image/jpeg");//这里和HttpFox抓到的数据一致,根据网贴设置为file不行,要”image/jpeg“才行。
reqEntity.addPart("pic", file);
}
//这个visible参数也是通过httpfix抓取请求时可以看到的,所以需要加上
 reqEntity.addPart("visible", new StringBody("0"));
post.setEntity(reqEntity);

发送请求,获得反馈response:

HttpResponse resp = client.execute(post);

当然我们可以通过HttpResponse对象看我们是否发送成功等等。

在模拟微博登陆并发送微博的过程中遇到很多问题,都是通过一点一点的尝试解决的,特别是发送文字+图片微博,这点还是比较麻烦的,不过后来总算解决,已经改两个月过去了,呵呵,才来写这篇总结,算是记录一下吧,具体还是要看项目中的代码和具体的需求啦!

HttpClient4的使用,模拟浏览器登陆新浪微博,发表微博和文字+图片微博的更多相关文章

  1. JAVA--利用HttpClient模拟浏览器登陆请求获取响应的Cookie

    在通过java采集网页数据时,我们常常会遇到这样的问题: 站点需要登陆才能访问 而这种网站,一般都会对请求进行账号密码的验证,验证的方式也有多种,需要具体分析. 今天分析其中的一种情况: 站点对登陆密 ...

  2. python 模拟浏览器登陆coursera

    import requests import random import string def randomString(length): return ''.join(random.choice(s ...

  3. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  4. curl模拟自动登陆&采集网页数据

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  5. python urllib2 模拟网站登陆

    python urllib2 模拟网站登陆 1. 可用浏览器先登陆,然后查看网页源码,分析登录表单 2. 使用python urllib2,cookielib 模拟网页登录 import urllib ...

  6. 【好文要转】Python:模拟登录以获取新浪微博OAuth的code参数值

    [转自]http://www.tuicool.com/articles/zAz6zi [原文]http://blog.segmentfault.com/hongfei/1190000000343851 ...

  7. 浏览器与服务器交互原理以及用java模拟浏览器操作v

    浏览器应用服务器JavaPHPApache * 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie, * 简单的讲,当浏 ...

  8. 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

    第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...

  9. requests模拟浏览器请求模块初识

    requests模拟浏览器请求模块初识  一.下载 requests模拟浏览器请求模块属于第三方模块 源码下载地址http://docs.python-requests.org/zh_CN/lates ...

随机推荐

  1. Smokeping安装教程

    Smokeping安装教程 #Smokeping2.6.8安装教程 #2016.3.6 改编v1.0 #Linux运维技术交流 347163978   环境 CentOS release 6.4 (F ...

  2. C#多线程的异步委托/调用

    C#异步调用(Asynchronou Delegate) C#异步调用获取结果方法:主要有三种,也可以说是四种(官方说四种,电子书说三种),官方在MSDN上已经有详细的说明:链接 需要了解到获取异步执 ...

  3. 【转】Gvim开发环境配置笔记--Windows篇

    配置文件(vimrc) set nocompatible set nu! set cursorline colorscheme murphy " vim 自身命令行模式智能补全 set wi ...

  4. String系列

    String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...

  5. Ubuntu 14.04数据库服务器--mysql的安装和配置

    mysql是Oracle公司的一种开放源代码的关系型数据库管理系统,被广泛应用于各中小网站,是一种跨平台的数据库管理系统,现在介绍一下如何在Ubuntu 14.04上安装和配置mysql 1. 更新源 ...

  6. microsoft

    http://blog.csdn.net/morewindows/article/details/8684061 http://blog.csdn.net/watkinsong/article/det ...

  7. mysql group_concat函数是有长度限制的

    在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...

  8. php缓存总结

    php缓存技术: 1.全页面静态化缓存;2.页面部分缓存;3.数据缓存;4.查询缓存;5.按内容变更进行缓;6.内存式缓存;7.apache缓存模块;8.php APC缓存扩展;9.Opcode缓存. ...

  9. 一点点刚学不久的JS

    1   js中的变量和输入输出 {使用js的三种方式} 1 在html标签中直接内嵌js(并不提倡使用): <button onclick="alert('小婊砸你真点啊!')&quo ...

  10. java打jar包小总结

    一 命令行方法 编译java 在bin目录下,也就是class所在目录下命令行输入如下命令进行归档处理 jar -cvf mylib.jar *.class 现在你可以看见一个已经生成的jar包了 此 ...