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

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对象看我们是否发送成功等等。


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

原文地址:https://www.cnblogs.com/dyllove98/p/3161518.html