如何从教务系统抢到课

最后更新时间: 2018-02-13 | 作者: AberSheeran | 捐助

又到了一学期一次的抢课时节,由于我校规定必须在四个分类下各修一门选修课,所以不用上课不用课本的网课往往供不应求。而有趣的是,在选课时间是整整一天。也就是说,这期间拥有已经修过的分类下的网课的人可以找别人进行换课。这让网课更加供不应求。

作为一个码农,我当然不会去手动抢课。再说了,学校那个垃圾教务系统设计,刷不刷得进去全靠运气,并发支持不过百。我一个非酋不跟欧皇比运气。

Hacking

我校教务系统很骚气,虽然是2014-2015年用LNMP开发的,但前后端分离。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$.ajax({
    url: "http://jwgl.ahnu.edu.cn/login/check.shtml",
    type: "POST",
    dataType: "json",
    data: "user=" + $("#user").val() + "&pass=" + $("#pass").val() + "&usertype=" + $("input[name='usertype']:checked").val(),
    success: function(msg) {
      if (msg.success == "success") {
        location.href = "/";
        return true;
      } else {
        $("#msg").html(msg.message);
        $("#msgdiv").css("display", "block");
      }
    }
  })

页面Js一找,一发requests.session登陆完成。

查看学校选课页面的Js代码,在一堆前端验证+拼音缩写之中找到了这个

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 function save(xkkh)
 {
  $.ajax({
    url:'/xk/xxk/savexxk?action=ok',
    dataType:'json',
    data:{'xkkh':xkkh},
    type:'POST',
    success: function(data){
      alert(data.msg);
      location.reload();
      }
    });
 }

 function delxkkh(xkkh)
 {
  $.ajax({
    url:'/xk/xxk/delxxk?action=ok',
    dataType:'json',
    data:{'xkkh':xkkh},
    type:'POST',
    success: function(data){
      alert(data.msg);
      location.reload();
      }
    });
 }

页面内Js代码的思路如下:

检查完课程的剩余量之后,将{"xkkh": lesson_coding}这样的json信息发送到对应网址来选课。

但由于选课没有开始,我并不能看到选课按钮会执行什么代码(没错,选课不开始,就没有选课按钮)。只好看着它几十个拼音缩写的变量来分析课程代码可能会怎么样。最后猜了一段代码出来。第二天一看,我的代码思路没问题,但lesson_coding不是显示在页面源码的coding,而是在页面源码的coding基础上,在代表学年学期的字符串上加一个括号!

也就是说,通过审查元素你可能会看到这样的2017-2018-1-07492110-0101224-1。但你应该发到教务系统的应该是(2017-2018-1)-07492110-0101224-1

小小的修改之后,成功抢到了两门网课(当然是截胡了别人的交易)。脚本见Github

最后......隔壁的欧皇凭运气一开局就抢到了两门网课!我***

标签: Python
收录于#校园时光