说起来很奇怪,为什么超级课程表火了这么久,关于原理的帖子就从来没出现过。这是我第一次在优快云写博客,以前都写在自己的网站上了,希望大家能够支持我谢谢。
由于我是长沙理工大学的大二在校生,所以我接下来的演示都是基于长沙理工大学的教务平台来写的,其实大家看懂后,就不会区别于学校了,因为原理都一样。然后我使用android平台进行演示,还是那句话,原理都一样,语言自选。
首先需要准备的工具是HttpWatch,这是抓包需要的工具,然后还有一个jar包,叫Jsoup,这是用来解析网页HTML代码的。其次所以要的类是HttpClient、HttpPost、HttpGet。
先来看看最后的效果图,我实现了获取教务平台的考试成绩和考试座位安排的数据,课程表数据一样的原理获取。
关于android的基本知识及我所用的相应组件就不介绍了,直接开始正文了。
安装好HttpWatch后,打开IE浏览器,打开HttpWatch,先别点记录,因为还没有进入教务平台网站的。 = =
这是我学校的教务平台网站地址 ,进入后,选择用户登录。好的,此时点击HttpWatch上的记录。
然后输入学号密码, = = 这里我就打上马赛克了,如果开发者真的需要用我学校的教务平台来进行学习,我愿意给你我的学号密码,不过请私下联系我。
输入学号密码后点击登录,等网页完全加载完毕后点击记录边上的取消,这个时候就要对抓下来的数据进行分析了。接下来的演示可能有点傻瓜制 = = 希望秒懂的人谅解一下像我这样的新手。
大家可以看到HttpWatch有上下两块界面,首先看到上面的界面,找到“方法”为Post的那行数据,单击,就可以看到下面的界面出现了相应的内容。首先我们打开POST数据。
大家可以看到有很多参数和数值,但是!!除了我打钩的这三个参数外,其余的参数对于我们开发客户端而言形同虚设。大家可能会问了,在之前那个登陆页面中,明明有验证码需要输入的啊,但为什么在POST数据中,连cCode(验证码)这个参数都形同虚设呢?关于这个问题,我问了很多人,可是最终得到的结果是。。。。应该是这个教务平台的BUG = = 所以大家先别介意没有输入验证码,我跟大家保证,我们不需要输入验证码,也可以登录!!!!
好的,在分析完POST数据后,,我们点击另一个选项卡,“头信息”。
同样,在众多发送的头信息中,我们所需要的只是Cookie,Cookie是什么?从本质上讲,他可以看成你的身份证,也就是说你在接下来的网页操作中,Cookie可以证明操作对象是你而不是别人。好的,关于其余参数的作用,如果你对抓包很有兴趣的话可以继续深究,但是对我们现在做客户端已经无用了~
对了,其实还有一个参数还是相当重要的,那就是在HttpWatch中上方的那个页面中有一列叫做URL,这个就是我们Post或者Get的直接网址,一定要注意!!不然你Post的时候没有Post到相对应的网站就等于白Post了 = =
第一步基本就已经完成了,就是关于使用HttpWatch抓包和分析数据的事基本就已经搞定了~(不过这只是第一个抓包内容,之后还需要抓包的,就是抓成绩或者课表的页面)。
List<Cookie> cookies; //保存获取的cookie HttpClient client = new DefaultHttpClient(); HttpResponse httpResponse;
String uriAPI = ""; /* 建立HTTP Post连线 */ HttpPost httpRequest = new HttpPost(uriAPI); List<NameValuePair> params = new ArrayList<NameValuePair>(); /** * 以下三个数据就是我们的之前在POST里的数据,不用在意验证码 */ params.add(new BasicNameValuePair("PassWord", "*****"); //这里的密码我用*取代了 params.add(new BasicNameValuePair("UserID", "201150080223"); //这是学号 params.add(new BasicNameValuePair("Sel_Type", "STU")); //以学生身份登录 try { // 发出HTTP request httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 取得HTTP response httpResponse = client.execute(httpRequest); //执行 // 若状态码为200 ok if (httpResponse.getStatusLine().getStatusCode() == 200) { //返回值正常 // 获取返回的cookie cookies = ((AbstractHttpClient) client).getCookieStore().getCookies(); } else { } } catch (Exception e) { e.printStackTrace(); }
上面的代码应该还是比较易懂的,关于部分不熟悉的类请大家自行阅读API文档哈。
第二步的目的一是将三个数据(学号、密码、登陆身份)Post到教务网站上,另一个是获取到登陆成功后的cookie。