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. jd.py

    #!/usr/bin/env python #coding:utf-8 import urllib2,re,sys,os,types #from bs4 import BeautifulSoup re ...

  2. poj1066 Jugs

    poj1066 Jugs http://poj.org/problem?id=1606 解题思路:本题可以用数学方法解得,最易理解,常规的解法是搜索.直接用接近模拟的广度优先搜索即可过. 给两个容器, ...

  3. Taking Pictures Using FireMonkey Interfaces

    http://docwiki.embarcadero.com/RADStudio/Seattle/en/Taking_Pictures_Using_FireMonkey_Interfaces

  4. 页面提交错误,页面间参数传递java.lang.NumberFormatException: null

    多次出现这样的错误,在点击一个按钮触发提交整个页面的事件时,总是报错,不止一次出现这样的错误了. 出现这种问题的分析: 1 我们从这个问题的本身来看,java.lang.NumberFormatExc ...

  5. 一切皆为 JavaScript

    JavaScript起源于Netscape公司的LiveScript语言,这是一种基于对象和事件驱动的client脚本语言.最初的设计是为了检验HTML表单输入的正确性. 早些年,JavaScript ...

  6. 用百度API实现热(WIFI)、GPS、基站定位

    直接在代码.. .嘎嘎 /** * 百度基站定位错误返回码 */ // 61 : GPS所在地结果 // 62 : 扫描整合的基础上有针对性的失败.在这一点上的定位结果无效. // 63 : 网络异常 ...

  7. 苹果手表的真实触感信息(Real Touch Messaging)

    苹果手表凭借其炫酷的设计和界面,无疑已成为一个新的科技焦点,也是苹果在可穿戴领域的重头戏. Apple Watch 有一个非常吸引人的特性:Real Touch Messaging,也就是真实触感消息 ...

  8. finalize过程

    之前说过case有两个 switch (startOpt) { case FORMAT: boolean aborted = format(conf, true); System.exit(abort ...

  9. 使用AjaxFileUpload.js实现文件异步上�

    ajax是无法提交文件的,所以在上传图片并预览的时候,我们常常使用Ifame的方法实现看似异步的效果.可是这样总不是非常方便的,AjaxFilleUpload.js对上面的方法进行了一个包装,使得我们 ...

  10. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...