HttpWatch+HttpClient模拟登录学校教务系统

来源:互联网 发布:json.parse 特殊字符 编辑:程序博客网 时间:2024/04/29 21:47

因为最近在做一个安卓项目,有查成绩模块,而学校并不提供接口,也没找到其他可用的API,无奈之下只能回归原始的模拟登录。

此处以我学校广东医学院外网入口:http://125.90.8.125:8000/portal/home.do?method=index 

首先,我们得先弄明白我们校园网是怎么工作的,这里要用到HttpWatch,分析我们正常登录时的请求与响应信息,当然你有chrome或fox之类的也行。我个人还是觉得HttpWatch看着要清晰些。

没用过HttpWatch的自己下载研究琢磨下,这里不作赘述。我这用的是HttpWatch Professional 7.0中文版。在登录页面输入你的用户密码,别急着确定,先点击HttpWatch左上角的红色圆点,开始记录,再点登录。







然后就会看见各种信息哗啦哗啦涌过来了,无需跳转的页面完全加载好,你已经确定进来了就可以按停止了。





好,这时候我们的正常登陆就完成了,可以开始分析我们教务系统怎么跳转的了。

定位到第一条,我们可以知道,在我们点击了那个“登录”按钮之后,首先执行了一条post方法,请求路径为http://125.90.8.125:8000/portal/login.do,返回值为302,即重定向。究竟带了什么东西过去呢?我们点击下面的Post数据,可以看到这样的:



显然,带了我们的用户密码过去了,并且没有其他的多余参数。这里我们知道了一个重要信息,用户名和密码的参数名分别为j_username,j_password。

我们都知道,HTTP是一个请求响应协议,既然发起了请求,那我们肯定得拿着响应里的cookie信息继续访问,哪些cookie是需要的呢?

定位第一条,点击头信息,如下


左边是发送过去的,右边是发送后返回接收的,可以看到,我们带着用户名密码向login.do发送请求后,返回了location(重定向的地址),Server(服务端信息),以及5个Set-Cookie(服务端在客户端再次发起请求前对客户端Cookie的赋值)。这里我们需要的是location和Set-Cookie。


定位到第二条,点头信息,可以看到,


经过与第一条返回的头信息对比,我们知道了,我们学校的教务平台再次发送请求携带的cookie里有三个东西,分别第一条返回的Set-Cookie里的第一项,第四项,第五项(据我所知有的学校返回的cookie里只有一个键值对,因校而异)。

第二条的结果内容是这样的


给了个路径,所以有了第三条的get请求,而第三条返回内容类似,也是路径



。。。。所以最终进去了的页面和登录页面是一个url



有点麻烦,这也是我不太喜欢用iframe来布局的原因。好,现在我们知道整个流程了,开始码农模式

首先写个方法来处理我们的用户名密码,作为post携带的参数

<pre name="code" class="java">List<NameValuePair> parmasList = new ArrayList<NameValuePair>();HashMap<String, String> parmasMap = new HashMap<String, String>();parmasMap.put("j_username", userName);parmasMap.put("j_password", passWord);Set<String> keySet2 = parmasMap.keySet();for (String temp : keySet2) {parmasList.add(new BasicNameValuePair(temp, parmasMap.get(temp)));}


</pre><pre name="code" class="java">然后我们模拟向login.do执行Post,并取出返回的SetCookie,location等,处理并存放
<pre name="code" class="java">List<NameValuePair> parmasList = new ArrayList<NameValuePair>();parmasList = initLoginParmas("12209030071", "********");//密码不给看HttpPost post = new HttpPost(LoginUrl);post.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);// 阻止自动重定向,目的是获取第一个ResponseHeader的Cookie和Locationpost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");post.setHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");// 设置编码为GBKpost.setEntity(new UrlEncodedFormEntity(parmasList, "GBK"));HttpResponse response = new DefaultHttpClient().execute(post);Header[] headers = response.getHeaders("Set-Cookie");String JSESSIONID = headers[0].getValue().split(";")[0] + ";";String SECURITY_AUTHENTICATION_COOKIE = headers[3].getValue().split(";")[0] + ";";String SECURE_AUTH_ROOT_COOKIE = headers[4].getValue().split(";")[0];cookie.append(JSESSIONID).append(SECURITY_AUTHENTICATION_COOKIE).append(SECURE_AUTH_ROOT_COOKIE);// 取得cookie并保存起来location = response.getFirstHeader("Location").getValue();// 重定向地址,目的是连接到主页


              
</pre><pre name="code" class="java">-----------------------------------------------------------------------------------------------
我们已经完成最重要的第一步,拿到相关cookie了,接下来向上面的location执行get请求,并将我们已经拿到的cookie给它,再给它一些头信息以防万一,模拟第二步。
<pre name="code" class="java">HttpGet get = new HttpGet(url);get.addHeader("Host", "Host");get.addHeader("Referer", Referer);get.addHeader("Connection", "Keep-Alive");get.addHeader("Cookie", cookie.toString());HttpResponse httpResponse = new DefaultHttpClient().execute(get);


                  
</pre><pre name="code" class="java">在本例中,那个location其实没什么用,因为它的返回信息就是一个js页面跳转,跳转的页面的源文件又是一个js页面跳转。。。(分别指的是第二条第三条的返回内容)
经过观察后中间的cookie没有变化,所以掠过这些步骤,直接向最终的url发起该get请求,得到我们想要的页面信息。
<img src="http://img.blog.csdn.net/20160202221325562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="1150" height="600" alt="" />
</pre><pre name="code" class="java">接下来,想要查成绩,看课程表或查看教务系统内其他一些个人信息,如法炮制即可,最终显示给用户的数据可以再用正则表达式或一些爬虫工具如jsoup等处理一下。

0 0
原创粉丝点击