活动地址:文库开学啦--幸运大转盘,惊喜不间断!
今天,揣了半个多月的一千多个幸运星,准备在活动的最后一天抽奖(当然过期就失效了,赶紧把握)。
可是百度的前端不知道怎么想的(可能出于防刷防挂),竟然每次抽完奖都要刷新一次页面!我有一百多次的抽奖机会,若等刷新,那不是烦死。。。
为了节约抽奖花费的时间,遂决定破解它。
首先,采取最简单的方法,重写关闭按钮(关闭弹窗之后才刷新)的oncilck事件。可是,看过代码结构之后,发现原始调用方法并不那么容易找着(其实我真的找不着),因为它的javascript代码经过压缩和混淆的,行数信息没什么意义。
然后,就想到可以阻止刷新代码,于是覆盖了location.reload方法,可是chrome里,覆盖无效(直接覆盖location对象也不行,而内置的Date对象则是可以覆盖的),而且使用delete操作符也删除失败(这个预料之中,只是不试就不甘心)。
接下来,就向window的onbeforeunload下手了。可是window.onbeforeunload=function (e){return false}却由浏览器弹出 是否离开 的询问框,于是再补充了利用e事件阻止默认行为的代码e.preventDefault();依然无效。唉,眼看午休时间就要完了,只能暂时放弃,按一下【抽奖】,关闭弹窗,再按ESC键,将就着抽了几十次奖。
晚上回家,吃完晚饭再去百度抽奖,这回用的是火狐浏览器。
按照中午的套路,重写一次location.reload方法,哈哈,火狐真大方,让改了。
经过几次修改,火狐版最终代码如下:
// 很奇怪,location.reload必须定义两次才成功 location.reload = function(){} location.reload = function(){} // 按钮div(点击关闭弹窗并执行刷新代码) var mydivz = document.getElementsByClassName('know-btn')[0]; // 模拟鼠标点击关闭按钮,原来打算用于setInterval的,后来直接赋给 关闭按钮的 onmouseover 事件 function myC(){ var myez = document.createEvent('MouseEvent'); myez.initEvent('click', false, false); mydivz.dispatchEvent(myez); }; // setInterval(myC, 1000); // 自动关闭弹窗 // 最外围的弹窗容器 var innerDivz = document.getElementsByClassName('inner')[0]; // 加事件 innerDivz.onmouseover = myC;
控制台里运行上述代码,点击抽奖之后,鼠标移动到弹窗上就触发关闭事件,而且不会刷新,可以直接继续点抽奖。
突然,快写完博文的时候,我意识到自己竟忘了最原始真实的东西。
打开活动页面,再一次 点抽奖(会弹【亲,抽奖幸运星不够了啦...快去积攒幸运星再来抽奖吧^^】窗口,关闭之后也会刷新页面),然后,利用控制台去掉遮挡的浮层,发现,我可以继续点抽奖了。。。。
其实,如果百度后台不是很严,也可以直接一个for循环,几百次post就过去了(获奖结果可以通过返回值的最后一个数字统计,从百度双肩背包的0开始,顺时针到苹果ipad2的11)