《12306 抢票系列之只要搞定RAIL_DEVICEID的来源从此抢票不再掉线(中).docx》由会员分享,可在线阅读,更多相关《12306 抢票系列之只要搞定RAIL_DEVICEID的来源从此抢票不再掉线(中).docx(35页珍藏版)》请在金锄头文库上搜索。
1、12306 抢票系列之只要搞定RAIL_DEVICEID的来源,从此抢票不再掉线(中)直奔重点高楼大厦寻关键线索Js文件中关于网络请求最典型的就是异步回调,将原本简单的操作复杂化,非要你等我,我等他,他还等着他的她.最终直接结果就是整个请求流程反过来了,假设正常流程:是 A-B-C-D-E-F,那么异步请求很可能陷入这样的陷阱: F - E - D - C - B - A所以一层又一层的回调函数真的是难以维护,这种技术也在慢慢淘汰更新成更容易维护的方式,还是不再展开了,回到正题上来,还是先找到程序到底什么时候开始调用的吧!ja.prototype = initEc: function(a) v
2、ar b = , c = this , d = void 0 != a & void 0 != a.localAddr ? a.localAddr : ; c.checkWapOrWeb(); this.ec.get(RAIL_OkLJUJ, function(a) b = a; c.getDfpMoreInfo(function() if (!(9E5 F(RAIL_EXPIRATION) - (new Date).getTime() & null != F(RAIL_DEVICEID) & void 0 != F(RAIL_DEVICEID) & !c.NeedUpdate() for (
3、var a = , e = , g = c.getpackStr(b), m = , q = , t = , k = , n = 0; n g.length; n+) new != gn.value & -1 = Fb.indexOf(gn.key) & (-1 != Gb.indexOf(gn.key) ? q.push(gn) : -1 != Ib.indexOf(gn.key) ? t.push(gn) : -1 != Hb.indexOf(gn.key) ? k.push(gn) : m.push(gn); g = ; for (n = 0; n q.length; n+) g = g
4、 + qn.key.charAt(0) + qn.value; q = ; for (n = 0; n k.length; n+) q = 0 = n ? q + kn.value : q + x + kn.value; k = ; for (n = 0; n a; a+) G(function() (new ja).getFingerPrint() , 20 + 2E3 * Math.pow(a, 2); else (new ja).getFingerPrint(); G(function() r.setInterval(function() (new ja).getFingerPrint(
5、) , 3E5) , 3E5)与此同时,Pa 函数也是 js 文件的第一行代码,来都来了,那就顺便看一眼 js 的整体结构代码吧!(function() )();自执行的匿名函数实现的闭包,这样的好处在于函数内的变量不会污染其他文件,更何况混淆之后的变量名称充斥着大量的变量 a,b,c,d,e,f之类的,不用闭包也不行啊!现在继续以 Pa 为线索搜索,最终发现了函数入口,除此之外再无其他.var mb = !1;u.addEventListener ? u.addEventListener(DOMContentLoaded, function b() u.removeEventListener
6、(DOMContentLoaded, b, !1); Pa(), !1) : u.attachEvent & u.attachEvent(onreadystatechange, function c() mb | interactive != u.readyState & complete != u.readyState | (u.detachEvent(onreadystatechange, c), Pa(), mb = !0)js 是典型的事件驱动型编程语言,当发生什么什么事件后我要干这个,页面加载时我要开始工作了,按钮被点击了我要登录了,页面关闭时我要下班了等等诸如此类的逻辑.上述代码实现的就是页面元素加载成功后开始执行 Pa() 函数,而 Pa 函数又会执行 (new ja).getFingerPrint() ,紧接着又会执行 initEc 函数.现在基本流程已经大致清楚了,总结一下基本代码逻辑如下:(function() var mb = !1; u.addEventListener ? u.addEventListener(DOMContentLoaded, function b() u.removeEventList