之前在Android 开发学习记录(3)---- httpclient使用(二)中介绍了如何使用httpclient访问需要账户登录的网址,当然首先是要有一个合法的登录账户。
但是现在好多网站在登录时不仅仅要求你输入账号、密码,还要求你输入网站随机产生的一个验证码,一般是以图片形式出现。
这次主要就给自己的笔记里记下当时我在访问需要图片验证码时,如何使用 httpclient 的。(当然这里所说的验证信息还是需要用户来手动填写的,本人菜鸟不会图像识别、、、、)注:这种方法并不能保证所有的网站都能如此登录
首先你要知道你要访问的网址都需要填写哪些信息,千万不要仅仅只看网站登录栏的那些信息,这是不够的。需要分析你在登录时到底都发送出那些信息,可以用chrome浏览器或者WireShark抓包软件都是可以做到的。下面就用chrome来演示
首先模拟登陆自己的目标网站(www.你的网址.com),打开“开发者工具”,用自己的账号密码登陆网站。这时你会在开发者工具栏中发现这样一条记录:
从中可以发现这是一个以POST方式发送给目标网站的信息,点进去可以查看里面的详细信息,找到如下信息:
这里就可以发现,在POST给网址的内容中,表单项不仅仅有 id 与 pw(也就是password)项目,这两项是用户手动输入的账户与密码。还有 authm 和 trust_root 这两项,这就是隐藏的需要 POST 的表单信息。验证码这类的同样会出现在这块儿。其中有些数据看起来很随机,需要从之前GET获取到的网址中寻找关联。
此时,以上面截图为例,这种带有隐藏信息的表单填写如下:
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH);
HttpPost request = new HttpPost("http://ssqzfw.xidian.edu.cn/modules/swyh/servlet/login");
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
/********************header头设置******************************/
postParameters.add(new BasicNameValuePair("account","XXXXXXXXX"));
postParameters.add(new BasicNameValuePair("password","XXXXXXXXX"));
postParameters.add(new BasicNameValuePair("authm","XXXXXXXXX"));
postParameters.add(new BasicNameValuePair("trust_root","XXXXXXXXX"));
/**************************************************/
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
request.setEntity(formEntity);
HttpResponse response = client.execute(request);
String webInformation_1 = readWeb(response);