又到了一学期一次的抢课时节,由于我校规定必须在四个分类下各修一门选修课,所以不用上课不用课本的网课往往供不应求。而有趣的是,选课时间是整整一天。也就是说,这期间拥有已经修过的分类下的网课的人可以找别人进行换课。这让网课更加供不应求。
作为一个码农,我当然不会去手动抢课。再说了,学校那个垃圾教务系统设计,刷不刷得进去全靠运气,并发支持不过百。我一个非酋不跟欧皇比运气。
Hacking
查看学校选课页面的Js代码,在一堆前端验证+拼音缩写之中找到了这个
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
最后......隔壁的欧皇凭运气一开局就抢到了两门网课!我***
时过经年,学弟找我要脚本,而原来的脚本已经失效。我也懒怠去破解验证码,他一语惊醒我。如果只是给自己选课不一定要自己写代码,完全可以在页面里执行JS代码。
例如我想抢课程代码为2017-2018-1-07492110-0101224-1
的课,我只需要打开浏览器的控制台,在里面执行
setInterval(function(){
$.ajax({
url:'/xk/xxk/savexxk?action=ok',
dataType:'json',
data:{'xkkh': "(2017-2018-1)-07492110-0101224-1"},
type:'POST',
success: function(data){
if (data.msg=="选课成功!") {
alert(data.msg);
}
}
});
}, 1000)
然后等着选课成功就好。