2021-11-26更新
学校把出校申请放到微信小程序里面去了。众所周知,微信是个傻逼软件,跟微信有关的东西都超级难搞。所以在小程序里写申请脚本就复杂太多了,而且新的出校申请比以前来说方便了不少。所以这个项目应该是废弃了QAQ。


为什么这学校到现在还要麻烦的出校申请啊可恶!
让我不得不写个脚本来使流程方便一点,这个脚本绑定到我的QQ机器人上,这样就能方便了出校了!
效果是这样的

脚本下载和使用教程

我把脚本和它的使用教程放在我的github上了https://github.com/12skoko/Application-for-leaving-NJUPT

抓包分析

我们先用浏览器正常申请一次全程抓包进行分析,这次我用的抓包软件是Charles
直接打开申请网址:http://bsdtlc.njupt.edu.cn/StartWorkflow?Workflow=WF_XSCXSQ
因为没有登录所以会被跳转到登录界面

登录完后跳转到了welcome.do的目录下
我们重新打开刚才的申请网址就能打开了

我们把信息填一下提交,显示执行提交成功就OK了
接下来到Charles里分析
抓下来很多,先分析第一个

我们一请求申请网址就给了两个cookies,'route'和'JSESSIONID',先记下来,然后302重定向到/CASLogin
第二条请求是刚才重定向的/CASLogin,请求头的cookies是刚才给的'route'和'JSESSIONID',响应又重定向了另一个地址http://rzfw.njupt.edu.cn/cas/login?service=http%3A%2F%2Fbsdtlc.njupt.edu.cn%3A80%2FCASLogin
这个地址是用来登录的
第三条请求就是加载登录界面,请求头的cookies是刚才的'route',响应给了一个新的'JSESSIONID'

接下来的很多请求全是加载图片和js脚本等,直接忽略,一直到有一个标志性的post请求

这应该就是最终登录账号的请求,我们来看一下这个请求里面需要哪些东西。
cookies里面有三个变量,这'JSESSIONID''route'和'_pv0',这里的'JSESSIONID'和'route'是之前已经获取到的,接下来就要查询这个'_pv0'是哪来的

查找一下文本,找到在'/cas/v2/getPubKey'路径下的一个请求里给了这个'_pv0'


回到登录账号的请求,表单里面有三个变量,'username''password'和'execution',剩下的几个变量都是空值或者定值。'username'是账号,也就是学号。'password'老长老长了,应该是被加密过后的密文了(如果又是明文传输又不是ssl的话也太屑了)
老方法查一下'execution'是什么鬼


竟然是嵌在登录界面的html里的,好吧总之'execution'也有了,还剩'password'是怎么加密的了
其实密码的加密方式在之前已经出现过了,在getPubKey里面给了两个变量,模数和指数,所以密码是用rsa加密的,写个简单的脚本就能加密了

def encryption(n,e,plaintext):
    arr = 0
    for c in plaintext:
        arr *= 256
        arr += ord(c)
    q = pow(arr, int(e,16)) % int(n,16)
    q=hex(q)[2:]
    for i in range(len(q),128):
        q='0'+q
    return q

把所有东西都正确post传回去之后就会传回来一个Location,里面有ticket。(如果这里传的是对的话,就会返回302,如果传的不对的话,会返回200,重新回到登录界面)

这个时候已经登录完成了,接下来请求刚才拿到的ticket地址,这里的cookies是最开始打开申请网站时候给的两个cookies,响应头里又给了两个cookies,'UserID'和'PortalToken'

此时办事大厅已经可以正常打开了

接下来的请求又是许多的图片和js脚本,我们直接略过,一直到最后一个post请求是提交我们表单的请求。
这里面有一大坨莫名其妙的变量名字,但是仔细看,这竟然全都是拼音缩写,比如sqr是申请人,jjlxr是紧急联系人等。

好吧,这些问题不是很大,现在还有最后一个问题,就是这个请求post的地址后面带了很多参数,接下来就要找那个参数是从哪里来的了。
还是老样子,把值复制进去查找一下就可以。

这些值全部在打开申请网址的那个HTML代码里面。
OK了!接下来把出校申请的表单post上去,就可以成功的提交申请了!
办事大厅查询成功

最后修改:2024 年 11 月 08 日
点个赞吧ヾ(๑╹◡╹)ノ"