基于油猴JavaScript脚本自动抢羽毛球场地——以CUC手球馆为例
我们学校只有室内的羽毛球场地,所以手球馆位置十分有限,需要每天8点整准时进入微信链接才能抢,还不一定能抢到。所以不妨写一个简单的脚本来帮助我们抢,也有助于我们锻炼身体。
我们可以通过微信右上角的复制网址得到相应的url,我们发现这个url会有中传统一身份认证,所以用Python做会比较麻烦,建议使用JavaScript在前端浏览器运行就会方便一些。
- 环境问题
首先我们需要一个能运行油猴脚本的浏览器,电脑端比如Chrome,edge,360极速浏览器X等,手机端可以用edge,X浏览器等,然后启动TamperMonkey或暴力猴插件(有的需要下载),然后新建一个脚本,名字随便取,需要匹配相应的链接规则,可以使用通配符:
// @match *://changguan.cuc.edu.cn/*
- 定时问题
首先我们需要获得当前时间,然后将当前时间和目标时间作差,来表示需要等待的时间。当到达目标时间了,就执行相应的函数操作,否则继续等待。
// 获取当前时间
now = new Date();
targetTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0); // 设置为当天8点0分0秒
// 计算需要等待的毫秒数
waitTime = targetTime - now;
- 等待过程函数
我们需要在waitTime秒之后就进入相应的链接进行抢羽毛球操作,所以需要用到setTimeout函数,但是有一个问题,究竟是直接点击元素按钮还是跳转url呢?
通过F12进行分析,这个按钮调用的是checkTime(‘YMQ01’,‘0’,‘002’)函数,而通过实验发现到了8点checkTime还是无法进入,所以只能用跳转链接的方式。
if (waitTime > 0) {
// 等待指定时间
time1=setTimeout(function() {
// 加载指定网址
window.location.href = "https://changguan.cuc.edu.cn/Views/Field/FieldOrderGr.html?VenueNo=002&FieldTypeNo=YMQ01";
}, waitTime);
}
- 跳转后操作函数
由于油猴脚本是打开网页就会从头开始运行函数,所以当3步骤完成后会继续依据时间判断waitTime,由于我们需要抢的是第二天的羽毛球场地,所以需要点击相应元素。
通过F12可以看到相应元素对应的是getDateData(‘1’)函数,我们直接运行这个函数就可以获得第二天的数据了。
由于这个getDateData(‘1’)函数调用之后有点卡,我怀疑需要向网络发送请求,而且有很大延时,所以通过F12的网络可以分析出延时大概平均为500毫秒左右。
所以我们需要等待至少700ms之后才能得到新的数据,才能进行点击操作。
-
检查是否有空场地
我们需要找到包含可用数的元素,一种是可用数:*,另外一种就是预定已满,但是这里的span只有class属性,没有id,所以需要用到querySelectorAll函数,按照".class名称"来索引。
querySelectorAll返回的是一个数组,我们需要对数组中每一个元素遍历查找span元素的innerText是否包含“可用”两字,同时在for循环中,我们想要倒序先抢最晚的羽毛球场地,用i--
操作。 -
点击提交
首先选中相应的时间段场地,触发onclick事件,可以选择上面的class:col-style,也可以通过getElementById来实现,不过通过源码分析这里的id名会根据当前时间而改变id名称,上午打开网页第一个按钮就是“li上午0”,下午打开网页第一个按钮就是“li下午0”,等等。
确定预定按钮对应的函数就是comfirmsubmit(),可以直接调用,最后还有确定验证框:
确定验证框使用的是weui_btn_dialog primary,是很多微信网页都会用到的验证框。
href="javascript:;"表示用空的js代码替换默认链接,绑定一个隐藏的事件回调,来执行业务,我们需要通过$('.weui_btn_dialog.primary')
的方式找到对应的隐藏变量,通过触发器trigger来触发click事件,成功后退出循环break。
else{
getDateData('1');
time2=setTimeout(function() {
var elements = document.querySelectorAll('.textsize');
for (var i = elements.length-1; i >= 0; i--) {
if (elements[i].innerText.includes('可用')) {
document.querySelectorAll('.col-style')[i].onclick();
//document.getElementById("li上午0").onclick();
comfirmsubmit();
$('.weui_btn_dialog.primary').trigger('click');
break;
} else {
continue;
}
}
}, 700);
}
这样就顺利地预定了羽毛球馆,只不过我们需要在8点之前打开场地类别选择的网页,之后到时间就能自动抢到CUC手球馆了,亲测订单时间显示为8点0分0秒或1秒。
大家可以把相应的页面元素换成自己学校的,然后看还需要进行什么操作,再进行修改。关于安全问题,我们只是做了一个模拟点击的操作,会比手抢快那么一点点,可能会被检测出来,所以在我们想打羽毛球的时候才用,其他时间就让给其他人吧。