获取综合教务系统(URP)的数据包
获取综合教务系统(URP)的数据包
最近想做一个类似超级课程表的软件,研究了一下学校的URP系统,想通过URP获取课表,成绩等信息,
在网上查了下资料发现 android超级课程表原理(各大高校教务平台的数据获取原理)这篇文章,对我启发很大,但是获取的cookie不能使用,好像有些学校(比如山西农大)就不支持这样的做法,于是自己就又改进了一下,实现了应该所有高校的URP系统都能获取,在这里分享一下(本案例是使用android进行的操作,原理都一样,语言自选)
需要工具
- httpclient.jar包
- fiddler
流程:
- 首先获取登陆界面的cookie
- 通过先获取这个网页的cookie让后发送到获取验证码图片的网站,返回一个验证码图片
- 然后将账号,密码,验证码,网页的cookie发送到综合教务系统(http://jwxt.sxau.edu.cn/loginActionDD.do)
- 教务系统会判断账号密码验证码是否正确,然后会认证你的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)的数据包相关推荐
- 基于Openwrt(Linux)系统实现SRv6数据包的传输——实验一
基于Openwrt(Linux)系统实现SRv6数据包的传输--实验一 前言 实验准备 硬件准备 软件准备 刷写Openwrt固件 安装软件包 实验过程 实验一: "背靠背"连通 ...
- Java获取并解析服务器端的JSON数据包
最近做spring boot项目,需要从微信api获取用户数据,并加以解析,转换成Java中的对象,所以就决定写一个JSONAnalysis静态工具类,在需要的时候只需调用该方法即可. 参考资料: J ...
- python解析tcp数据包-python解析获取发往本机的数据包并打印
1.[文件] tcp.py ~ 2KB 下载(69) # -*- coding: cp936 -*- import socket from struct import * from time impo ...
- Java--使用httpClient模拟登陆正方教务系统获取课表
最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...
- Android实现模拟登陆教务系统并解析网页数据
前言 时光飞逝,日月如梭,转眼间四年的大学生活已经结束啦!开始了程序员的加班生活.我的第二学位的毕业设计是实现一个学习小助手.这其中最重要的环节就是模拟登录学校的教务系统,获取到教务系统的数据并解析, ...
- android流量控制的实现,Android系统中P2P应用数据包捕获及流量控制研究
摘要: P2P应用产生的流量正大肆吞噬着网络带宽,增加了网络运营商的管理压力.同时随着以Android为主的移动设备用户群变得越来越庞大,相应的流量吸费问题也随之产生,特别是Android手机上的P2 ...
- JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
问题分析 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息.模拟浏览器正常操作,封装请求头信息获取SES ...
- js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)
最近下班无聊,就看了一下之前写的教务系统模拟登录代码(python-爬虫),整体逻辑大概自己总结了一下: 1.请求验证码图片. 2.对输入的密码进行加密. 3.封装账号,密码,验证码,发送post请求 ...
- 大话高校正方教务系统(上)
小弟最近准备做一个正方教务系统的手机客户端,而且是带验证码的,百度了一些类似项目都是没有验证码那种的,于是自己研究,先上图 这是我们教务系统的主页,这也是目前大多数院校比较流行的!下面我们来谈谈如何做 ...
- Linux网络 - 数据包的发送过程
继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的. 如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细. 本文只讨论以 ...
最新文章
- 怎样在Web开发中完美控制IE标题栏
- PNN神经网络预测类别的例子
- springboot打包不同环境配置与shell脚本部署
- jq在html中添加dom元素,使用jQuery添加DOM元素的最佳方法
- angularjs 表单校验
- Lintcode93 Balanced Binary Tree solution 题解
- Angular2 依赖注入
- 特斯拉CEO马斯克再次动员员工 加快季度末交付
- 不同程序语言的注释和变量要求
- 常用的Ant风格书写
- 华为手机有哪些功能关掉比较好?
- nvidia tesla k40
- python语言中print函数的作用_python3入门之print,import,input介绍
- 信息系统项目管理师——成本管理
- 36个顶级数据分析方法与模型,学会任意1种,都能让你超越95%的人
- matlab 读取mdf文件路径,通过 MDF 数据存储使用 MDF 文件
- ‘Staring Tomcat v8.0 Server at localhost ’ has encountered a problem 问题解决
- 该网页无法正常运作解决方法
- (一)Gluster 介绍及简单部署
- linux-查看cpu核数
热门文章
- 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集
- 圆方树学习笔记 例题 uoj30 Tourists
- oracle中间人投毒漏洞,ORACLE远程投毒漏洞修复(RAC环境)
- Flume防止重复消费——断点续传
- Mac下导入virtualenv报错:its parent directory is not owned by the current user
- 课堂派考完直接看成绩怎么说(已被修复)
- react native 自定义Image实现预加载图片及错误之后图片显示
- MySQL命令行中文显示乱码怎么办
- 关于Palantir——第二部分:本体(Ontology)
- 数据结构与算法——深入理解红-黑树!