学校的网络系统上总有很多需要登陆的地方,但死板的页面又不是很友好,往往需要打开PC通过层层页面登陆,却只是为了查询某个很短小的信息,所以很早就想把整个查询过程做成一个客户端,方便你我他。但是开始总觉得无从下手,因为当时什么都不懂,基于这个需求就反复查询了一些资料,终于,在弄清楚了一些概念和动用了抓包工具后,我发现我的想法离实现一步步靠近了......
首先用抓包工具(像HTTP Analyzer就比较好用)在后台记录,自己在前台手动登陆一次,抓取封包后分析整个过程
主要要点如下:
1.整个过程访问了几个页面
2.POST or GET
3.请求的是哪个页面
4.传了哪些参数
5.是否有Redirect(301,302)
6.后续的操作是否用到第一步获取的的COOKIES,主要是SESSION ID
服务器往往通过SESSION ID判断你是否登陆
(如果出现6的情况,就稍微复杂一些了)
后续用HttpClient模拟相应的操作即可
http://ipjmc.iteye.com/blog/1577495 这里转载了HttpClient一个很简单的例程
获取内容可以使用强大的Jsoup包,或者只是文字信息,干脆使用同样强大的正则
前五项通过HttpClient+Jsoup都能解决
我们主要来看看碰到6的情况怎么办
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
Log.i(TAG, "NONE");
} else
{
for (int i = 0; i < cookies.size(); i++) {
//保存cookie
Log.d(TAG, cookies.get(i).getName()+"="+cookies.get(i).getValue() );
Log.d(TAG, cookies.get(i).getName()+"=" );
}
cookie=cookies.get(0).getValue();
这里通过调试发现序列为0的恰好是SESSION ID就直接用了
获取出来了
后续再连接其他页面时,就可以把这个SESSION ID加到HEADER里带着登陆身份为所欲为了
getMethod1.setHeader("Cookie", "JSESSIONID="+cookie);
HttpResponse response = httpClient.execute(getMethod1); //发起GET请求
Header location=response.getFirstHeader("location");
if (location!=null) Log.i(TAG, location.getValue().toString());
result=EntityUtils.toString(response.getEntity(),"utf-8");
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
这样一来,以后如果有什么网站没有提供登陆API,我们也可以自制手机登陆客户端了