课程表的实现(基于强智科技教务系统)

1,本小系统服务于在校大学生。用户可以根据代码定制安装自己的轻量级课程表app在手机上(当然,可以把网络请求部分修改移植到PC或者Web平台上)。

2,好处:再也不用为了在手机上看课表而专门去下载30~60MB不等大小并且有各种干扰信息的APP了。 同时,许多教务系统只能用IE登陆,是否让人恼火?

3,这里尝试做个简单的课表查询小程序(Android)。当然对于这里所提到的网络请求都清楚了,可以实现更多基于教务系统周边更有意思的应用。

4,源代码可以在github上查看,如有任何疑问,可以issue,也可以@我canliture@outlook.com
目前教务网的接口有点变动,已有的代码拿来不能直接运行,后续我也没上传最新的代码了。现有的代码可以作为参考,有问题可以邮箱问我。

阅读前

  • 在阅读本文章,代码的时候假定你已经对 HTTP的GET,POST 有基本的认识。知道 HTML的form 表单干什么用。

  • 对基于 “强智科技教务系统” 的同学友好。因为他们做的登陆接口,查询接口相差不大。我找了几个跟本校教务系统界面差不多的系统,查看了 验证码接口,登陆接口 。发现几乎没什么变化。所以我猜内部的课表接口是重用的一套代码。

    下面是我找到的跟本校的教务系统同一风格并且验证码接口,登陆接口一样的教务系统界面截图。(至于内部课表的接口我就不知道是否跟本校的接口格式一致,大家具体情况具体分析)

当然这个登陆接口也类似啦

这里直接贴出这种界面的课程表接口(xnxq01id为学年学期id,zc为周次):xskb_list.do?xnxq01id=2018-2019-1&zc=12

  • 当然对于非 “强智科技教务系统” 的同学来说,也很容易根据代码分析,然后写出适合自己学校的课表查看小程序。

  • 代码重在分析网络请求,筛选重要信息。 这是任何人都能学到的知识。

源码说明

本代码最终数据呈现平台为 Android ,在解析接口,获得数据过程中会讲解怎么将其呈现在界面上。当然你也可以做基于web,PC端的。

代码仍有不足,后续会更新,可持续关注哟:学期灵活切换;验证码识别。

有任何问题可以@我,canliture@outlook.com

代码模块解析

1. 网络请求

教务系统登陆通用 三要素账号,密码,验证码(Tips: 有些系统验证码没有,实现更容易; 我学校教务系统里有学生,家长选项,默认设置学生就好)

有了所述的三要素,我们就可以进入教务系统进行各项操作啦。下面是分析网络请求

打开浏览器(这里我们用Chrome浏览器,当然firefox也有类似的如下操作),进入教务网登陆界面,按F12弹出 开发者工具 点击 Network ,再在最左侧点击教务网的 请求路径名 ,可以看到Request Headers(请求头)。(如果点击Network什么都看不到那就在开发者工具打开的前提下刷新一下教务网就行了)。请求头里 最重要 的当然是 Cookie 啦。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYWcN8sE-1581321944235)(https://i.imgur.com/RA6HP8U.png)]

Cookie在这里作为登陆的唯一标识。也就是说,你登陆后,把Cookie保存下来,使用这个Cookie(存活期内)能够访问这个教务系统下的任意地址的网页,数据。

下面可以做个小实验验证这个观点,这个实验理解了,后面程序的 模拟登陆教务网 也可以理解了。

假定我的 教务网地址 是: kk.edu.cn/jww/ ,我登陆成功并且 跳转地址kk.edu.cn/jww/framework/main.jsp ,复制成功登陆时用的Cookie值。在浏览器上打开一个新标签页,输入 教务网地址kk.edu.cn/jww/ ,此时(一般情况)是没有登陆的,我们再次打开开发者工具,这次不点击Network了,我们点击 Application ,双击Cookie值,修改它为我们之前登陆的Cookie值(如下图),再把本标签页地址栏的地址换为登陆后我们想访问的地址(比如说登陆后跳转的地址)并回车!我们已经算是登陆教务系统并且进入系统了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07Yq6VxS-1581321944240)( https://i.imgur.com/rv7Efkr.png)]

下面是登陆教务网的核心代码。

Connection loginConn = Jsoup.connect(loginHomePage);
loginConn.cookies(cookies);                                   //login using cookies
loginConn.data(reqData);                                      //login parameters
Connection.Response loginResponse = loginConn.execute();

说明:Jsoup库很简单,并且在这里用的不多,通过代码说明很容易理解。

loginHomePage为教务网 form的action 属性值(查看源码可以看到),也就是我们表单要提交的url地址。
如果我们直接看代码第四行,把而三行注释掉,获得一个Response,我们可以直接打印出loginResponse的内容,全部为HTML代码,根本没有图片。也就是说, 我们得单独请求图片,并且保存请求图片返回的Cookie,并且登陆时使用这个Cookie来登陆。

现在思路就是:我们想要登陆,就得先请求并下载验证码图片,获取请求图片时返回的Cookie,并且用这个Cookie加上我们自己填写的账号,密码,和根据下载的图片填写的验证码,把这些参数一并提交给服务器进行登陆

于是我们可以完善我们的代码:

 //all static for convenience//file request parametersstatic String personType = "0";           //0-我是学生,  1-我是家长。 很多教务网都没有这个字段,可忽略掉static String userNumber = "****";        //你的账号static String password = "****";          //你的密码static String verifyCode = "";            //验证码默认设置为空,后续通过用户的输入来填充这个值//登陆请求的地址final static String loginHomePage = "http://kkk.edu.cn/jww/Logon.do?method=logon";//验证码请求地址final static String verifyImgSrcURL = "http://kk.edu.cn/jww/verifycode.servlet";//验证码保存的桌面位置final static String verifyImgDestURL = "C:\\Users\\Canliture\\Desktop\\verifyCodeImg.jpg";//课表的地址final static String getTableBaseURL = "http://kkk.edu.cn/jww/tkglAction.do?method=goListKbByXs";//cookie namefinal static String sessionName = "JSESSIONID"; //cookie valuestatic String sessionValue = "";                          //request parameters [personType, username, password, RANDOMCODE]static Map<String, String> reqData = new HashMap<>();  static Map<String, String> cookies = new HashMap<>();       //save cookies// 'reqData' initializationstatic { reqData.put("personType", personType); //  0 - students or teachers , 1 - parentsreqData.put("USERNAME", userNumber);  reqData.put("PASSWORD", password);}public static void main(String[] args) throws IOException {//download verifyImg and//get the cookie we getfrom the img//use the cookie everywhere around the site.downloadImgReturnCookie(verifyImgSrcURL, verifyImgDestURL);System.out.println("Download Image Successfully");//print cookieSystem.out.println(cookies);//input verifycodeSystem.out.print("Please input your verifyCode: ");verifyCode = new Scanner(System.in).nextLine();reqData.put("RANDOMCODE", verifyCode);//login using cookie prepared.Connection loginConn = Jsoup.connect(loginHomePage);//login using cookiesloginConn.cookies(cookies);     //login parameters                 loginConn.data(reqData);//try to loginConnection.Response loginResponse = loginConn.execute();System.out.println( loginResponse.body() );//。。。未完,看下面分析}// download verifyCode image from 'srcUrl' and save to 'dest' at localhostprivate static void downloadImgReturnCookie(String srcUrl, String dest) throws MalformedURLException, IOException{//get image using the cookieHttpURLConnection imgConn = (HttpURLConnection) ( new URL(srcUrl) ).openConnection();//get the cookieString cookie = imgConn.getHeaderField("Set-Cookie");sessionValue = cookie.substring( cookie.indexOf('=') + 1, cookie.indexOf(';') );cookies.put( sessionName,  sessionValue );//new input from network( 'imgConn' )try( BufferedInputStream imgInputStream = new BufferedInputStream( imgConn.getInputStream() ) ){//new output to local file systemtry( BufferedOutputStream imgOutputStream = new BufferedOutputStream( new FileOutputStream(dest) );  ){byte[] buf = new byte[1024];while( -1 != ( imgInputStream.read(buf) ) )   imgOutputStream.write(buf);} catch(IOException e) { e.printStackTrace();  }} catch(IOException e) { e.printStackTrace();  }}

代码先调用downloadImgReturnCookie(verifyImgSrcURL, verifyImgDestURL);请求验证码图片,并且保存到桌面,于此同时把返回的Cookie保存起来。再通过new Scanner(System.in).nextLine()获取用户输入的验证码(下载到桌面了自己很容易打开并且肉眼识别了)。
最后登录,打印登陆请求返回的HTML源码。

我们发现,当我们输入了错误的验证码(或者账号或密码错误)的时候,打印出来的是登陆界面的HTML源码,当我们登陆成功的时候,返回的内容很简单:<script language='javascript'>window.location.href='http://kk.edu.cn/jww/framework/main.jsp';</script>。据此我们很容易判断我们是否登陆成功了。

以上是网络请求的全部分析过程。

更多的将数据呈现在Android平台上可以查看源代码。同时可以查看下面的效果图。

课程表的实现(基于强智科技教务系统)相关推荐

  1. python登录教务系统_强智科技教务系统python爬虫模拟登录分析(湖南)

    强智科技教务系统python爬虫模拟登录分析(湖南) 本文章仅用作于学习 前提:最近期末到来,想第一时间看到新出成绩的,于是就有了爬取学校教务系统自己的成绩并通过Qmsg酱推送到自己QQ上的想法,目前 ...

  2. python爬虫获取强智科技教务系统学科成绩(模拟登录+成绩获取)

    python爬取强智科技教务系统,以江苏科技大学为例:本人开发的系统作为参考:https://www.wjn1996.cn/estudy/tools/educationLogin.jsp?school ...

  3. 强智科技教务系统验证码识别

    强智科技验证码识别 前言 由于近期在写一个教务系统的爬虫程序,但是网站的验证码让人很头疼,所以笔者临时找了一些资料学习了一下,本人python用的很少,而且在机器学习这块也是新手,从来没有接触过,所以 ...

  4. python实现强智科技教务系统抢课(两种方法)

    前言 又到了选课的时间,又一次被教务系统的预选给安排了,硬是一门都没选中.于是想实现有没有自动捡课的方法.就整体分为两种方法,一种是获取get请求然后由python多线程提交去选课,一种是利用自动化测 ...

  5. 强智科技教务系统学科成绩c语言,湖南强智科技教务系统python模拟登录并爬取成绩(财院)...

    其实之前有写过一篇帖子了 在之前使用教务系统的过程中,偶然一次发现登上教务系统后再退出来的后的登录网址竟然不需要验证码,想着之前有写过教务系统的爬虫模拟登录,没验证码的岂不是更好干(之前那次折腾了好久 ...

  6. 计算机算法基础_强智科技继续冠名第十六届“强智杯”湖南省大学生计算机程序设计竞赛...

    2020年10月17-18日,第十六届"强智杯"湖南省大学生计算机程序设计竞赛在长沙理工大学成功举办,本次竞赛由省教育厅主办.省高教学会计算机教育专业委员会协办.长沙理工大学承办, ...

  7. 基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件 基于Java毕业设计校园教务系统登录源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S架构 开 ...

  8. python设计教务管理系统_python课程设计——基于wx的GUI教务系统——2020.12.25

    一丶python-GUI教务系统 1.实践具体内容及基本要求 1.实验内容 选题1:创建一个单机版有GUI界面的(或Web版)的学生成绩系统,能从文件(或数据库)中读写数据,并具备如下功能. (1) ...

  9. SZTU深圳技术大学教务系统小爱课程表导入——强智科技13369

    作为个人来讲非常值得纪念的,具有一定流传度的,较为正规的小项目--小爱课程表导入,于2020/9/9正式完成.审核通过时间暂未明确,测试已经完美. 2020/9/16修复已知的BUG 2020/9/2 ...

  10. 强智科技教务处模拟登录

    通过对教务处登录进行抓包分析,发现登录教务处只需要两个操作 1 将username和password两个的值post到http://202.114.242.21/whkjdx/Logon.do?met ...

最新文章

  1. 在ListCtrl控件中插入图标
  2. oracle数据库pfile文件,Oracle pfile/spfile参数文件详解
  3. ad敷铜后还有部分飞线_网友自制LPL赛区AD选手排名图!阿水Lwx荣誉值已超越Uzi_电竞...
  4. 中国教育电脑市场趋势报告、技术动态创新及市场预测
  5. python3发送邮件_Python3使用SMTP发送带附件邮件
  6. aspx反射调用方法
  7. 关于软件开发的一些常识和思考
  8. 操作系统原理(七)文件系统
  9. Excel 快速填充序号
  10. Python-while 计算100以内奇数和
  11. Eplan教学视频合集-百度网盘-收集于网络,供参考
  12. 100句励志名句让你在困境中绝地求生
  13. 亚马逊电商可以用阿里云服务器吗
  14. 微博官方API使用方法【全流程教学】
  15. NeurIPS 2022 | 北大阿里提出BEVFusion:激光雷达-相机融合新框架
  16. 海子的诗-以梦为马(祖国)
  17. matlab subs什么意思,什么是matlab subs函数?
  18. centos7.5系统动态扩容磁盘及系统挂载未分配硬盘空间
  19. 第一个被赋予公明身份的机器人_机器人被赋予公民身份引发舆论关注
  20. 笔记36 笨办法学python练习43面向对象OOP的文字理解(一)

热门文章

  1. lisp 车位块自动编号_CAD exPRess tools 车位自动编号
  2. 离散数学 | 数理逻辑
  3. 三线制接近开关原理及接线图
  4. 魔方机器人大赛——魔方步骤转换算法
  5. vue v-modle实现组件之间的动态传值
  6. 频传上市,奈雪的茶优势与隐忧并存
  7. RAID5换硬盘重建记录
  8. 达索系统与中国的那些创新
  9. 搭建Hadoop集群后一直使用的start-all.sh到底是个什么操作
  10. 社交软件红包技术解密(十):手Q客户端针对2020年春节红包的技术实践