zoukankan      html  css  js  c++  java
  • 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对象看我们是否发送成功等等。


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

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3161518.html
Copyright © 2011-2022 走看看