抓取青果教务系统信息

加上分析JS,测试程序以及期间遇到360误杀爷的EXECJS模块以及其他巴拉巴拉一堆问题,共耗时一天多一早晨的时间,爬下了青果公司为XX学校用C#开发的教务系统(我还是第一次爬C#写的网站,拿小本子记下来),这里只介绍课程表的抓取思路,其他的什么教师评价啊,什么选课啊都很简单了,都差不多的思路,有耐心的小伙伴可以去写个抢课系统或者其他上商业价值的软件。

起初猜想

开始猜测,XX学校的管理系统肯定挺容易爬的,不就是个课程表信息吗,然后就自认为几分钟就可以搞定的去分析网络请求,然后,看到了一堆加密随机字符串,以及一堆让人害怕的请求数据,像下图所示的这样:

在这里插入图片描述

上面那个图的东西是登陆页面提交的POST数据,开始很懵逼,推测__VIEWSTATE,还有 dsdsdsdsdxcxdfgfg还有fgfggfdgtyuuyyuuckjg都是动态生成的,结果,嘤嘤嘤嘤嘤,还真是,所以,挖槽,一堆问号泛出大脑。然后果断的放弃了登录页面往后继续分析,因为我知道要解开这些参数,就需要去分析JS代码,并且,一定会很耗时间,所以先暂时放下,过会儿再静下心来解决。所以,暂时放弃了登录页面,转向课程表页面。课程表页面,哇,贼猥琐,长的下图所示这样:

在这里插入图片描述

所以,看这个页面这么丑,一定抓起来很简单嘛,所以,信心倍增,冲冲冲,爷要抓这个。。。。。。。。就这样,半小时过去了。。。。。。又半小时过去了。。。。。然后爷开始体力不支,躺下睡了一觉,大概倒下2个小时,重新爬了起来,果断地啪一声关了笔记本电脑的盖子,这特么,都是啥,嘤嘤嘤。。。。。。。请求参数长下图这样,分析得,都是动态生成的,需要从JS分析:

在这里插入图片描述

然后,那课程表数据呢?一张图片而已,你看,还特么把路径写在了源码中,有路径,这管理系统太特么好爬了。。。。。。。结果得,太特么XX了,我特么#####fuck#####…(此处省略1亿字),是有图片得路径,结果访问后提示无效,所以,这玩意只能访问一次,这是啥。。。。嘤嘤嘤,长下图所示的这样(这是啥?是图片嘛,怎么还有HTML标签?难道上面的东西是图片信息?一堆尝试后,无结果,这就是为什么爷白白花了1个多小时导致最后贼困,睡了2小时的原因。。。。。):

在这里插入图片描述
分析过程

有了上面说的种种太Fuck了的体验之后,开始明白事情的有趣性。倒了杯凉开水,喝了几滴,开始平静下来专注于解决这些问题。首先分析的是 课程表页面的hidyzmhidsjyzm还有m参数。(或许有人问,你特么怎么不从登录页面开始?爷告诉你一个真理,初次作得找软柿子捏,你看登录页那一堆XXFuck了的随即参数,我估计,开始还没啥成就感就从登录页一直卡住很久的孩子,心理阴影面积应该挺大吧 )

初始从“检索”按钮的点击事件入手,开始分析表单提交的整个流程,如下图所,“检索”按钮点击事件触发这个ChkVal()函数,对这个函数打断点,从下图不难看出,我们要找的m参数其实就是这里的s,要找的hidsjyzm就是通过md5("12843"+TheObjVal+s).toUpperCase()生成的。

在这里插入图片描述

所以,我们现在只需要回溯js执行期间涉及到的各个函数及执行过程就可以生成对应的m以及hidsjyzm。从上图来看,未知的参数及函数有:Sel_XNXQrandomString()md5(),所以,接着寻找这些参数以及函数。

下图所示,Sel_XNXQ是一个常量,当然,不可能保持恒久不变,会根据学期的变化而变化,文章末尾会拿出一张图片来解释这里的各个参数具体变化规律。在这里插入图片描述
然后是randomString()函数,在Validate.js中找到的在这里插入图片描述
然后是md5,不过看了看,整个md5.js文件差不多来来回回把里面的所有函数都执行了一遍才出来结果,相当费劲的js在这里插入图片描述

找到上面的几个参数和函数,剩下的就是抽取这些参数以及方法到一个js文件中,然后用python调用执行这些函数,获取到最后的参数。
所以,参数的问题已经解决了hidsjyzm还有m,然而剩下的那个hidyzm则是在Pri_StuSel.aspx请求的返回的代码中包含在这里插入图片描述
获取到这些参数,就可以进行构造POST请求http://jwgl.XXX.edu.cn/znpk/Pri_StuSel_rpt.aspx?m=...了,然而,这并不会直接去请求课程表的图片,这个请求地址的目的仅仅是为了提交给服务器这几个参数而已,不过这也是不可缺少的一步,所以,接下来在这些参数传递给服务器的基础上,还需要请求另一个地址http://jwgl.XXX.edu.cn/znpk/Pri_StuSel_Drawimg.aspx?type=2&w=1171&h=420&xnxq=20191&px=0,这样才会返回给你一大堆gb2312编码后的字符串,然后,我们只需要拿到这些数据,以二进制形式写入图片文件中就可以得到课程表的图片了。

至此,课程表分析结束,在请求头中,不难发现ASP.NET_SessionId=yfl0kb45uzmft....ygznpvd3j的重要作用,所以,接下来,就是去分析登陆页面,我们来获取这个ASP.NET_SessionId

分析中发现,ASP.NET_SessionId这个cookie其实在访问教务系统首页的时候就被设置在浏览器里,并且不会跟随登录或者其他操作的变化而变化。并且,我们在未登录的情况下拿到的ASP.NET_SessionId,是不能进行课程表查询操作的。上面分析的课程表获取方法的前提是 ASP.NET_SessionId参数代表的浏览器已经登陆了账号。所以,此时需要解决的问题有两个——
1.获取ASP.NET_SessionId
2.进行模拟登录使得ASP.NET_SessionId这个参数有登录的意义

和本篇文章开始的那样,模拟登录也是不容易的,我们需要解决下图所示的几个参数:__VIEWSTATEdsdsdsdsdxcxdfgfg,fgfggfdgtyuuyyuuckjg在这里插入图片描述

首先进行实验得到,__VIEWSTATE这个参数每次刷新页面都会改变,并得到这个参数其实只是服务器返回的初始页面中一个特定的数值而已,看似很多很复杂摸不到头绪,实际可以直接在页面中用正则匹配出来,获取也是十分容易,如下图所示:在这里插入图片描述
含有此参数的页面需要请求的链接是:http://jwgl.XXX.edu.cn/_data/login_home.aspx

接着往下分析,dsdsdsdsdxcxdfgfg这个参数以及fgfggfdgtyuuyyuuckjg这个参数,我们追溯登录按钮的点击事件,最后分析出如下图所示两个JS函数:在这里插入图片描述
一个是chkpwd(),另一个是chkyzm(),前者是dsdsdsdsdxcxdfgfg的加密函数,后者是fgfggfdgtyuuyyuuckjg的加密函数,所以,方法和上面的js类似,回溯代码执行过程,提取全部的参数以及涉及到的函数,抽取到一个js文件中,用python执行获取到。
这里涉及到的函数以及参数有这几个:md5()txt_asmcdefsddsd,还有obj.value

md5()在上面分析的时候就已经找出,然而剩下的那个txt_asmcdefsddsdobj.value是个啥,然后打断点尝试,尝试几番之后,得到结论,这两个参数,前者是密码,后者是验证码。

所以这里有这涉及到验证码怎么获取的问题,所以,我们去解决验证码,回过头来接着写怎么往下走。

对于验证码的获取问题,就能简略概述的就简略概述。这里提供三种方式获取验证码:
1.使用pytesseract包,PIL包,以及识别引擎tesseract-ocr(具体怎么做有兴趣可以自己去百度)
2.打码平台(感兴趣也可以去百度看看,人工打码需要收费的)
3.把图片验证码爬下来,手动输入(我用的这种方式。有的人可能说了,为什么用这个?因为没钱,没 技术 粗心大意懒得去写机器识别浪费时间)

所以,开始pa验证码。这个很容易,并且,只需要拿到ASP.NET_SessionId,就可以给某一毫秒处访问验证码生成站点的时候给唯一的ASP.NET_SessionId绑定一个验证码,并且,推测服务器也是这么搞得,因为我没找到任何前端隐藏的标签或是自己判别验证码的证据。
验证码这个,挺有意思的,我也是直接追溯的验证码点击事件更换图片验证码的JS代码,如下图所示,只是拿到了点击时刻的毫秒值,去掉####巴拉巴拉一堆处理之后得到了t,用t加上基础url去请求验证码(开始的时候我以为教务系统傻X到用固定的t值绑定相同的图片来充当验证码,后来发现,相同的t值对应不同的验证码,然后爷就“嘤嘤嘤”了)
在这里插入图片描述

所以,我们解决了验证码的问题,然后回到登陆参数上,因此,有了验证码,然后就知道了js函数中的obj.value的值,所以,此时登录的所有参数都解决了

哦?以为这样就结束了嘛

刚刚开始而已

下面就是把提取到的JS函数汇总到一起,取出无用数据,进行优化,以及,给各式各样的函数起一个你看的懂得名字。哦吼,当然,还有python调用相关得代码。这样就结束了?吼吼,当然没有,还需要组建所有得请求,达到良好以接近于优秀的request请求逐个获取需要得到的参数,最后是测试,重组,然后其他账号测验。当然,我都整理好了,下面就不带着一起扯皮了,下载链接在文末

这个是文章里提到的XXX一堆参数的说明在这里插入图片描述
下载链接:

猜你喜欢

转载自blog.csdn.net/weixin_44449518/article/details/105429855
今日推荐