破解【百度文库开学幸运大转盘】刷新限制

活动地址:文库开学啦--幸运大转盘,惊喜不间断!

今天,揣了半个多月的一千多个幸运星,准备在活动的最后一天抽奖(当然过期就失效了,赶紧把握)。

可是百度的前端不知道怎么想的(可能出于防刷防挂),竟然每次抽完奖都要刷新一次页面!我有一百多次的抽奖机会,若等刷新,那不是烦死。。。

为了节约抽奖花费的时间,遂决定破解它。

首先,采取最简单的方法,重写关闭按钮(关闭弹窗之后才刷新)的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)

原文地址:https://www.cnblogs.com/xlst/p/2725115.html