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等处理一下。
- HttpWatch+HttpClient模拟登录学校教务系统
- Python项目模拟登录学校正方教务系统抓取课程表。
- postman+fiddler 登录学校教务系统
- 模拟登录学校教务网 获取课程表信息
- 安卓HttpClient+Jsoup+Httpwatch模拟登陆正方教务获取信息
- 利用Python requests库模拟登陆学校教务系统
- Java模拟登录正方教务管理系统
- Java--使用httpClient模拟登陆正方教务系统获取课表
- 学校教务系统开发学习
- 利用python3.4爬取学校教务系统,并封装成api供app调用(二)之不带验证码模拟登录
- android模拟登录后带cookie访问受保护的网站比如学校教务网
- python模拟登录URP教务系统评教
- Python爬虫实战——模拟登录教务系统
- 江西理工大学正方教务系统查成绩(模拟登录)
- 模拟登录正方教务管理系统-JAVA实现
- 用Python做有趣的事儿——模拟登陆学校教务系统
- 模拟教务系统登录过程中的一些总结---至今还未成功模拟登录
- 爬取学校教务系统学生课表
- 第七章 与Web集成——《跟我学Shiro》
- MongoDB初步(2)
- Activity , Window和View的关系是什么?
- Android获取debug签名和release签名方法
- 【CERC2013】【BZOJ4052】Magical GCD
- HttpWatch+HttpClient模拟登录学校教务系统
- 记不住
- 64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver-的解决方案
- Android中设置用户的头像
- Could not find destination factory for transport解决方法
- 机房水题欢乐赛 2016-02-02
- 如何在FrameLayout添加布局
- Java程序员在用的大数据工具,MongoDB稳居第一!
- ctextart类的文档仅仅首页修改页眉