HttpClient4的使用,模擬瀏覽器登錄新浪微博,發表微博和文字+圖片微博

HttpClient4,最原始的需求就是使用其來模擬瀏覽器想服務器發起http請求,固然,他的功能不止於此,可是我須要的就是這個功能而已,jdk也有其自帶的相似的api:UrlConnection,效率比httpclient高,可是和其餘第三方產品同樣,比httpclient原始,其實http協議是在tcp/ip協議之上的,因此,若是是用socket來實現也是能夠的,只不過更原始了,沒這個必要了!html

Httpclient4和Httpclient3的區別較大,但若是會用一個,另外一個只要看一下例子或api就會用了,簡單!java

實例化一個client,設置策略:api

 

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頭信息:cookie

 

這些頭信息咱們能夠先在瀏覽器訪問這個鏈接地址,好比在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");
		

多媒體實體:app

 

其中分割線與Header中的參數boundary一致。
socket

 

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

 

給多媒體實體設置相應的參數,包括圖片:tcp

 

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對象看咱們是否發送成功等等。

 


在模擬微博登錄併發送微博的過程當中遇到不少問題,都是經過一點一點的嘗試解決的,特別是發送文字+圖片微博,這點仍是比較麻煩的,不事後來總算解決,已經改兩個月過去了,呵呵,纔來寫這篇總結,算是記錄一下吧,具體仍是要看項目中的代碼和具體的需求啦!

相關文章
相關標籤/搜索