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


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

  • 相关阅读:
    操作系统
    redis
    数据库原理与mysql
    计算机网络
    重写、重载、隐藏以及多态分析
    c++复习重点
    重装系统记录
    正则表达式匹配ip地址
    信号量和互斥锁的区别 互斥量与临界区的区别
    为Markdown文件生成目录
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3161518.html
Copyright © 2011-2022 走看看