获取综合教务系统(URP)的数据包

最近想做一个类似超级课程表的软件,研究了一下学校的URP系统,想通过URP获取课表,成绩等信息,
在网上查了下资料发现 android超级课程表原理(各大高校教务平台的数据获取原理)这篇文章,对我启发很大,但是获取的cookie不能使用,好像有些学校(比如山西农大)就不支持这样的做法,于是自己就又改进了一下,实现了应该所有高校的URP系统都能获取,在这里分享一下(本案例是使用android进行的操作,原理都一样,语言自选)

需要工具

  1. httpclient.jar包
  2. fiddler

流程

  1. 首先获取登陆界面的cookie
  2. 通过先获取这个网页的cookie让后发送到获取验证码图片的网站,返回一个验证码图片
  3. 然后将账号,密码,验证码,网页的cookie发送到综合教务系统(http://jwxt.sxau.edu.cn/loginActionDD.do)
  4. 教务系统会判断账号密码验证码是否正确,然后会认证你的cookie,然后才可以获取教务系统的信息

一,获取登陆时URP的cookie

首先看一下登陆界面

这里一共需要账号,密码, 验证码
登陆界面一开始是没有Cookie的,他会请求其他的地址,这里需要自己看Fildder,如我们的就是http://jwxt.sxau.edu.cn/dwr/interface/ajaxtool.js这个网址携带着Cookie,所以我们需要获取这个网址的Cookie

List<Cookie> cookies;
String urlyzm = "http://jwxt.sxau.edu.cn/dwr/interface/ajaxtool.js";HttpClient client = new DefaultHttpClient();HttpResponse httpResponse;//* 建立HTTP GET连线 *//*HttpGet httpRequest = new HttpGet(urlyzm);try {httpResponse = client.execute(httpRequest);   //执行// 若状态码为200 成功if (httpResponse.getStatusLine().getStatusCode() == 200) {   //返回值正常// 获取返回的cookiecookies = ((AbstractHttpClient) client).getCookieStore().getCookies();Log.d("MainActivity", "statGetYam: success!!" + cookies.toString());statGetImg();}} catch (Exception e) {Log.d("MainActivity", "statGetYam: error!!!" + e);}

cookies就是我们登陆界面的Cookie(未验证)

二,通过先获取这个网页的cookie让后发送到获取验证码图片的网站,返回一个验证码图片

获取验证码的网站长这样http://jwxt.sxau.edu.cn/validateCodeAction.do?random=0.028191011294455448
可以看出后面random后面的是一窜随机数可以把后面的数字改一下就能用(如0.028191011294455447)

private void statGetImg() {String uriAPI = "http://jwxt.sxau.edu.cn/validateCodeAction.do?random=0.6114370593559289";  //验证码的网站 后面的随机数可以自己设置HttpGet httpRequest2 = new HttpGet(uriAPI);try {//将之前获取的未认证的Cookie添加到header中httpRequest2.setHeader("Cookie", "JSESSIONID=" + cookies.get(0).getValue());HttpResponse httpResponse2 = new DefaultHttpClient().execute(httpRequest2);if (httpResponse2.getStatusLine().getStatusCode() == 200) {StringBuffer sb = new StringBuffer();HttpEntity entity = httpResponse2.getEntity();InputStream is = entity.getContent();//这里我在activity_main.xml定义了一个ImageView用来显示验证码bitmap = BitmapFactory.decodeStream(is);handler.sendEmptyMessage(1);Log.d("MainActivity", "statGetImg success");} else {Log.d("MainActivity", "statGetImg error!" + httpResponse2.getStatusLine().getStatusCode());}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

三,将账号,密码,验证码,网页的cookie发送到综合教务系统

我们要将数据发送http://jwxt.sxau.edu.cn/loginActionDD.do这个地址

可以看出在post数据时需要输入zjh(账号),mm(密码),v_yzm(验证码)

HttpClient client = new DefaultHttpClient();HttpResponse httpResponse;//* 建立HTTP Post连线 *//*HttpPost httpRequest = new HttpPost(uriAPI);List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("zjh", "*******"));   //这里的密码我用*取代了params.add(new BasicNameValuePair("mm", "*******"));   //这是密码params.add(new BasicNameValuePair("v_yzm", "验证码"));   //这是从图片中读取的验证码try {httpRequest.setHeader("Cookie", "JSESSIONID=" + cookies.get(0).getValue());// 发出HTTP requesthttpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));// 取得HTTP responsehttpResponse = client.execute(httpRequest);   //执行// 若状态码为200 okif (httpResponse.getStatusLine().getStatusCode() == 200) {   //返回值正常Log.d("MainActivity", "startConnection: success!!!  认证成功" );}} catch (Exception e) {Log.d("MainActivity", "startConnection: error!!!" + e);}

这样就认证成功了 就可以获取自己所需的数据了

四,模拟浏览器获取自己的成绩

通过fiddler可以获取到自己查询成绩的url地址
通过把已认证的Cookie发送给这个url地址就可以获取到自己的成绩
我们学校用的是GET的请求方式,可以根据具体使用环境改成POST

String result = "";String uriAPI = "http://jwxt.sxau.edu.cn/gradeLnAllAction.do?type=ln&oper=fainfo&fajhh=627";  //这个地址就是成绩的地址HttpGet httpRequest2 = new HttpGet(uriAPI);try {httpRequest2.setHeader("Cookie", "JSESSIONID=" + cookies.get(0).getValue());HttpResponse httpResponse2 = new DefaultHttpClient().execute(httpRequest2);if (httpResponse2.getStatusLine().getStatusCode() == 200) {StringBuffer sb = new StringBuffer();HttpEntity entity = httpResponse2.getEntity();InputStream is = entity.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is, "GB2312"));//是读取要改编码的源,源的格式是GB2312的,安源格式读进来,然后再对源码转换成想要的编码就行String data = "";while ((data = br.readLine()) != null) {sb.append(data);}result = sb.toString();  //此时result中就是我们成绩的HTML的源代码了Log.d("MainActivity", "startConnection xml success" + result);} else {Log.d("MainActivity", "startConnection error!" + httpResponse2.getStatusLine().getStatusCode());}} catch (Exception e) {Log.d("MainActivity", "startConnection xml error" + e);}

注意
如果不进行验证码的验证直接发送账号密码也可以进去,只是不能进行信息的读取,会一直返回这样的500错误

<html>
<head><title>500 Servlet Exception</title></head>
<body>
<h1>500 Servlet Exception</h1>
<code><pre>
java.lang.NullPointerExceptionat zhjw.grade.search.GradeLnAllAction.execute(GradeLnAllAction.java:45)at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106)at zhjw.util.filter.CharacterEncoding.doFilter(CharacterEncoding.java:108)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at zhjw.util.filter.UserAuthBase.doFilter(UserAuthBase.java:39)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.zfsoft.zfca.tp.cas.client.filter.ZFSSOFilter.doFilter(ZFSSOFilter.java:103)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.zfsoft.zfca.tp.cas.client.logout.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:100)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at zhjw.util.filter.newfilter.UrpsoftFilter.doFilter(UrpsoftFilter.java:96)at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:420)at com.caucho.server.port.TcpConnection.run(TcpConnection.java:514)at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520)at com.caucho.util.ThreadPool.run(ThreadPool.java:442)at java.lang.Thread.run(Thread.java:619)
</pre></code>
<hr /><small>
Resin-3.0.27 (built Mon, 19 Jan 2009 01:26:35 PST)
</small>
</body></html>

以上

获取综合教务系统(URP)的数据包相关推荐

  1. 基于Openwrt(Linux)系统实现SRv6数据包的传输——实验一

    基于Openwrt(Linux)系统实现SRv6数据包的传输--实验一 前言 实验准备 硬件准备 软件准备 刷写Openwrt固件 安装软件包 实验过程 实验一: "背靠背"连通 ...

  2. Java获取并解析服务器端的JSON数据包

    最近做spring boot项目,需要从微信api获取用户数据,并加以解析,转换成Java中的对象,所以就决定写一个JSONAnalysis静态工具类,在需要的时候只需调用该方法即可. 参考资料: J ...

  3. python解析tcp数据包-python解析获取发往本机的数据包并打印

    1.[文件] tcp.py ~ 2KB 下载(69) # -*- coding: cp936 -*- import socket from struct import * from time impo ...

  4. Java--使用httpClient模拟登陆正方教务系统获取课表

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

  5. Android实现模拟登陆教务系统并解析网页数据

    前言 时光飞逝,日月如梭,转眼间四年的大学生活已经结束啦!开始了程序员的加班生活.我的第二学位的毕业设计是实现一个学习小助手.这其中最重要的环节就是模拟登录学校的教务系统,获取到教务系统的数据并解析, ...

  6. android流量控制的实现,Android系统中P2P应用数据包捕获及流量控制研究

    摘要: P2P应用产生的流量正大肆吞噬着网络带宽,增加了网络运营商的管理压力.同时随着以Android为主的移动设备用户群变得越来越庞大,相应的流量吸费问题也随之产生,特别是Android手机上的P2 ...

  7. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案

    问题分析 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息.模拟浏览器正常操作,封装请求头信息获取SES ...

  8. js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)

    最近下班无聊,就看了一下之前写的教务系统模拟登录代码(python-爬虫),整体逻辑大概自己总结了一下: 1.请求验证码图片. 2.对输入的密码进行加密. 3.封装账号,密码,验证码,发送post请求 ...

  9. 大话高校正方教务系统(上)

    小弟最近准备做一个正方教务系统的手机客户端,而且是带验证码的,百度了一些类似项目都是没有验证码那种的,于是自己研究,先上图 这是我们教务系统的主页,这也是目前大多数院校比较流行的!下面我们来谈谈如何做 ...

  10. Linux网络 - 数据包的发送过程

    继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细. 本文只讨论以 ...

最新文章

  1. 怎样在Web开发中完美控制IE标题栏
  2. PNN神经网络预测类别的例子
  3. springboot打包不同环境配置与shell脚本部署
  4. jq在html中添加dom元素,使用jQuery添加DOM元素的最佳方法
  5. angularjs 表单校验
  6. Lintcode93 Balanced Binary Tree solution 题解
  7. Angular2 依赖注入
  8. 特斯拉CEO马斯克再次动员员工 加快季度末交付
  9. 不同程序语言的注释和变量要求
  10. 常用的Ant风格书写
  11. 华为手机有哪些功能关掉比较好?
  12. nvidia tesla k40
  13. python语言中print函数的作用_python3入门之print,import,input介绍
  14. 信息系统项目管理师——成本管理
  15. 36个顶级数据分析方法与模型,学会任意1种,都能让你超越95%的人
  16. matlab 读取mdf文件路径,通过 MDF 数据存储使用 MDF 文件
  17. ‘Staring Tomcat v8.0 Server at localhost ’ has encountered a problem 问题解决
  18. 该网页无法正常运作解决方法
  19. (一)Gluster 介绍及简单部署
  20. linux-查看cpu核数

热门文章

  1. 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集
  2. 圆方树学习笔记 例题 uoj30 Tourists
  3. oracle中间人投毒漏洞,ORACLE远程投毒漏洞修复(RAC环境)
  4. Flume防止重复消费——断点续传
  5. Mac下导入virtualenv报错:its parent directory is not owned by the current user
  6. 课堂派考完直接看成绩怎么说(已被修复)
  7. react native 自定义Image实现预加载图片及错误之后图片显示
  8. MySQL命令行中文显示乱码怎么办
  9. 关于Palantir——第二部分:本体(Ontology)
  10. 数据结构与算法——深入理解红-黑树!