欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

程序员文章站 2023-03-26 12:56:42
最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作。 把css 图片之类的过滤掉,发现了default.aspx这个东西 如果你们学校教务系统不使用Cookie则会是这样 我们可以发现,真实 ......

最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作。

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

把css 图片之类的过滤掉,发现了default.aspx这个东西

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

如果你们学校教务系统不使用Cookie则会是这样

我们可以发现,真实的请求地址为 http://110.65.10.xxx/(bdq1aj45lpd42o55vqpfgpie)/default2.aspx

随后我们发现这个网址括号围起来的一串信息有点诡异,而且每次进入的时候信息都不一样,经过资料查询,这是一种http://ASP.NET不使用Cookie会话管理的技术。

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

服务器会返回一个Cookie值,然后在本地保存,这与下面的会不相同。

获取会话信息(不使用Cookie)

这里我们要使用requests库,并且要伪造header的UA信息

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

而requests中使用Cookie很简单

只需要这样

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

由于我们学校采用的是无Cookie方案,所以下面的代码均没有发送Cookie,如果你的学校采用了Cookie,只需要像我上面这样发送Cookie就行了。

而如果你们学校使用Cookie,就不必获取带有会话信息的地址了,直接存储Cookie即可。

而如果你们学校使用Cookie,就不必获取带有会话信息的地址了,直接存储Cookie即可。

验证码的处理

分析r返回的文本信息

发现验证码的标签的资源地址为 src="CheckCode.aspx" ,我们可以直接requests然后下载验证码图片,下载图片的一种优雅的方式如下

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

发现有信息无法被解码,应该是gb2312编码,查看解码前的编码

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

然后将不能解码的代码复制能够解码的地方

发现%D1%A7%C9%FA编码解码后为学生

这也就对应了学生选项的登录

学号和密码和验证码能够显而易见地知道是哪些信息,但是我们发现有__VIEWSTATE这一项

查找一下,这是一个表单隐藏信息,我们可以用BeautifulSoup库解析可以得出该一项数据的值

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

这是完整的登录数据包,

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

登录

如果登录完成了,如何判断是否登录成功呢?我们从登录成功返回的界面发现有姓名这一标签,而我们等一下也是需要学生姓名,所以我们用这个根据来判断是否登录成功。

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

代码如下,进行了验证码用户名和密码的提示信息判别

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

获取选课信息

接下来就是获取选课信息了,这里我们以校公选课为例子,点击进去,进行抓包,headers没有什么好注意的,我们只用关注get发送的包即可

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

发现有学号与姓名与gnmkdm这一项,姓名我们需要编码为gb2312的形式才能进行传送

这里我们注意headers需要新增Referer项也就是当前访问的网址,才能进行请求

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

注意到上面有一个设置VIEWSTATE值的函数,这里等下在选课构造数据包的时候会讲

模拟选课

随便选一门课,然后提交,抓包,看一下有什么数据发送

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

前三个值可以在原网页中input标签中找到,由于前两项为空,就不获取了,而第三项我们使用soup解析获取即可,由于这个操作是每请求一次就变化的,我们写成一个函数,每次请求完成就设置一次。

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

进行选课

选课我们只要将lesson_list传入即可,这就是我们之前创建的Lesson类的实例的列表,'Button'的内容为' 提交 ',这两边各有一个空格,完事后我们可以进行发送请求进行选课。

这里我们用正则提取了错误信息,比如选课时间未到、上课时间冲突这些错误信息来提示用户,我们还解析了网页的已选课程,这里也不细讲了,都是基础的网页解析。

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!

 

总结

这次我们完成了模拟正方教务系统选课的过程,由于这个教务系统技术比较陈旧,所以比较好弄,事实上抢课的时候用Fiddler即可完成操作,因为我们只需要提前登录然后记录网址即可。

由于不同学校的正方教务系统有可能不同,所以上面很多细节都是需要修改的。

进群:125240963   即可获取源码或者十套PDF书籍哦!

选修课有很多有趣的!用Python模拟登录学校教务系统抢课!