小米的搶購騙局+小米的搶購頁面的源代碼分析(三)工具類分析


小米的javascript除了數據部分,下面就只剩871行的javascript了。javascript

下面分模塊進行分析。首先從簡單的工具類入手。css

從616行到最後。一共253行。java

小米因爲採用了一個數組,存儲全部的靜態字符串。因此須要手動對代碼進行翻譯jquery

    var Util = {
        time: function() {
            var a = m.$("reback");
            if (count === 0x0) {//count應該是一個計數器,是倒計時使用的
                m.$("box-close").innerHTML = "X";//一個關閉的X
                a.innerHTML = "進入活動";
                a.className ="reback_btn_next";
                this.start();
                return false
            };
            count = count - 0x1;//倒計時減一
            a.innerHTML = 從新進入(<span id='initCount'> + count + 」</span>) json

    
        },數組

  //以上的time函數,是顯示您正在排隊倒計時的那個窗口,count這個值,我們先記住,看看是從何而來 服務器

        start: function() {
            var b = this,
            a = m.$(reback); //這裏的m.$應該相似於jquery的選擇符,選擇的是對象的id
            a.onclick = function() {
                getStatus.jsonInter(CONFIG.srcs.hdget, 」hdget「, true);//是搶購的關鍵函數,在這裏觸發搶購,若是搶購成功,頁面會自動跳轉,這裏須要注意下:以前的搶購這個按鈕是存在的,因此我點一下reback,就是稍後那個10秒到5秒的倒計時,請求真的會從新提交給服務器,而不用等30秒。18號的搶購中,卻刪除了這個按鈕,致使我搶購失敗。也讓鬱悶的我決定寫這篇文章。
                b.retime();//下一個函數
                _gaq.push([_trackEvent, 活動, 搶購,進入活動);
                a.onclick = null;
                return false
            }
        },cookie

//以上,點擊開始搶購後的執行的代碼,注意這裏return false,你懂得。
        retime: function() {
            m.$(box-close).innerHTML =」 「;
            m.$(reback).className = reback_btn;
            count = CONFIG.count  //count是等待的秒數
        },app

//以上,進行重試的倒計時
        changebg: function() {
            stop = false;
            setInterval(function() {
                if (!stop) {
                    m.$("top").className = "topmitv";
                    stop = true
                } else {
                    m.$("top").className = "topmi3";
                    stop = false
                }
            },
            0x1388) //5秒鐘後自動換背景哦。
        },dom

//以上,自動背景替換,5秒換一下

        showVideo: function(g) {
            if (typeof document.body.style.maxHeight !== 」undefined「) {//只顯示一個等待框。
                var a = document.body.scrollWidth;
                var e = document.body.scrollHeight;
                var b = m.$(」videoBoxMask「);
                b.style.width = a + 」px「;
                b.style.height = e + 」px「;
                b.style.display = 」block「;
                b.onclick = function() {
                    Util.closeBox()
                };
                var c = 」<span class="close" onclick="Util.closeBox()" title="關閉">X「;
                var f = document.getElementById(」videoBox「);
                var d = g.getAttribute(」data-url「);
                f.innerHTML = c.replace(」{{videoUrl}}, d);
                f.style.display =block「;
                return false
            }
        },

//以上,顯示風起雲涌的人山人海的對話框,等吧,兄弟們。
        closeBox: function() {
            m.$(」videoBox「).style.display = none「;
            m.$(」videoBox「).innerHTML =」「;
            m.$(」videoBoxMask「).style.display =」none「;
        },

//以上,關閉搶購排隊對話框

        getBookInfo: function(c) { //傳入一個c,c是什麼呢?
            var a = 」「,
            e = 」「,
            d = 」「,
            b = function(g, f, h) {
                return 」<h3>很遺憾,您沒有預定「 + g + 」喔</h3>參與開放購買須要提早預定,別灰心,你可返回首頁嘗試購買「 + f + 」, 也可當即預定11月26日星期二開放購買</p>「 + h + 」返回活動首頁「
            };
            switch (c) {        //原來c是搶購的種類
            case 」phone「:
                a = 」小米手機「;
                e = 」小米電視及小米盒子「;
                d = CONFIG.urls.bookPhone;
                break;
            case 」tv「:
                a = 」小米電視「;
                e = 」小米手機及小米盒子「;
                d = CONFIG.urls.bookTv;
                break;
            case 」box「:
                a = 」小米盒子「;
                e = 」小米手機及小米電視「;
                d = CONFIG.urls.bookBox;
                break
            };
            m.$(」box-reg-wrap「).innerHTML = b(a, e, d);
            m.$(」box-reg-wrap「).style.background =」url(http://p.www.xiaomi.com/open/131101/images/mitu-1.png) no-repeat 5px 0「  //來張漂亮背景
        },

//以上,只是用來通知哥們沒有預定。。不能搶購。
        pushGA: function(b) {
            var a = 」「;
            switch (b) {
            case 」phone「:
                a = 」購買手機「;
                break;
            case  」tv「:
                a = 」購買電視「;
                break;
            case 」box「:
                a = 」購買盒子「;
                break
            };
            _gaq.push([」_trackEvent「, 」活動「, 」搶購「, a])
        },

//以上,是用來借用google的分析引擎,記錄用戶行爲和流量
        bookedPop: function(c, d) { //d很關鍵,d裏面有預約的url
            var b = CONFIG.isBook,
            a = d.getAttribute(」href「);
            if (m.cookie(CONFIG.cookies.userid)) { //採用cookie進行權限驗證,下降服務器負載
                if ((c === 」phone「 && b.phone === false) || (c === 」tv「 && b.tv === false) || (c === 」box「 && b.box === false)) {//沒預約的判斷
                    this.getBookInfo(c);//提示哥們沒有預約
                    getStatus.boxy(true, 」-reg「) //去預約吧
                } else {
                    window.open(a) //打開支付的頁面,
                }
            } else {
                location.href = CONFIG.urls.login//悲催的沒登錄。。。
            };
            return false
        },

 //以上,是支付的代碼

        showBox: function(b) {
            var a = CONFIG.isBook;
            this.pushGA(b);
            if (m.cookie(CONFIG.cookies.userid)) {
                CONFIG.proType = b;
                if ((b === 」phone「 && a.phone === false) || (b === 」tv「 && a.tv === false) || (b === 」box「 && a.box === false)) {
                    this.getBookInfo(b);
                    getStatus.boxy(true, 」 -reg「);
                    return false
                };
                getStatus.jsonInter(CONFIG.srcs.hdget,」hdget「, true)
            } else {
                location.href = CONFIG.urls.login
            }
        },
        animate: function(e, b) {
            var c = document.getElementById(e);
            var d = b;
            var a = function() {
                var i = d / 0xa;
                var g = 0x0;
                var f = function() {
                    g++;
                    if (g == 0xa) {
                        clearInterval(h)
                    };
                    var j = 0x0 - 0x5a * g;
                    c.style.backgroundPosition = j +」px 0「
                };
                f();
                var h = setInterval(f, i)
            };
            a();
            window.loadingAnimate = setInterval(a, d)
        },
        resetServertime: function() {
            var a = 0x1e * 0xea60;
            window.resetTime = setInterval(function() {
                getStatus.jsonInter(CONFIG.srcs.hdinfo, 」hdinfo「, false)
            },
            a)
        }
    };

//以上,是顯示用的動畫
    var loginInfo = {
        data: {
            userId: 0x0,
            userName: 」「 //用cookie存用戶信息
        },
        init: function() {
            this.data.userId = m.cookie(CONFIG.cookies.userid); //取出用戶名
            if (!this.data.userId) {
                return false
            };
            this.data.userName = (this.data.userId) ? m.cookie(」XM_「 + this.data.userId + 」_UN「) : 」「;//這裏要hack的人要注意了,是cookie的格式,應該能夠僞造
            if (this.data.userName == null || this.data.userName == 」「) {
                var a = document.createElement(」script「);
                a.src = 」https://account.xiaomi.com/pass/userInfoJsonP?userId=「 + this.data.userId + _$[277];
                a.type = 」&callback=loginInfo.getAccountInfo「;
                a.async = true;
                document.getElementsByTagName(」text/javascript「)[0x0].appendChild(a)
            } else {
                this.upUserInfo()
            }
        },

//以上,是右上角登錄狀態的顯示
        upUserInfo: function() {
            var a = this.data.userName;
            if ( !! m.$(」LoginArea「)) {
                m.$(」LoginArea「).innerHTML = 」歡迎您&nbsp;「 + a + 」!<a href='http://order.xiaomi.com/site/logout'>退出「;
                m.$(」LoginArea「).style.paddingLeft = 」12px「
            }
        },

//以上,同上,寫的好業餘

        getAccountInfo: function(b) {
            if (b.userId) {
                this.data.userName = (b.uniqName) ? b.uniqName: b.userId;
                var a = {
                    path: 」/「,
                    domain:」.xiaomi.com「
                };
                m.cookie(」XM_「+ this.data.userId + 」_UN「, this.data.userName, a);//這算掩耳盜鈴嗎?
                this.upUserInfo()
            }
        }
    };

//以上,用戶信息

//下面是,網頁進入完畢後自動執行的。參考 jquery的ready

    m.ready(function() { //愈來愈像改寫的jquery了,爲了防止衝突,加了個m
        m.phone(CONFIG.mIndex);
        getStatus.init();
        loginInfo.init();
        Util.changebg();
        m.$(」box-cache-btn「).onclick = function() {
            getStatus.jsonInter(CONFIG.srcs.hdget, 」hdget「, true) //按鈕,觸發搶購,而後開始等待30秒。。
        };

       //以上是註冊點擊搶購按鈕的事件,點擊搶購按鈕,就執行getStatus.jsonInter方法


        m.addEvent(m.$(」linksCon「), 」mouseover「,
        function() {
            m.$(」hdLnks「).style.display = 」block「;
            m.$(」linksCon-span「).style.cssText = 」background-color:#fff;color:#333「
        });
        m.addEvent(m.$(「linksCon」),"mouseout",
        function() {
            m.$("hdLnks").style.display = "none";
            m.$("linksCon-span").style.cssText = "background:none;border:0;"
        })
    });

//以上 

//如下是自動執行代碼,是給google用來作分析的
    var _gaq = _gaq || [];
    _gaq.push([「_setAccount」, 「UA-24946561-1」]);
    _gaq.push([「_addOrganic」,「baidu」, 「word」]);
    _gaq.push([「_addOrganic」, 「soso」, 「w」]);
    _gaq.push([「_addOrganic」, 「vnet」, 「kw」]);
    _gaq.push([「_addOrganic」, 「sogou」, 「query」]);
    _gaq.push([「_addOrganic」, 「youdao」, 「q」]);
    _gaq.push([「_addOrganic」, 「so」, 「q」]);
    _gaq.push(["_setDomainName", "xiaomi.com"]);
    _gaq.push(["_setAllowLinker", true]);
    _gaq.push(["_trackPageview"]); (function() {
        var b = document.createElement("script");
        b.type = "text/javascript";
        b.async = true;
        b.src = ("https:"== document.location.protocol ? " https://ssl" : "http://www") + ".google-analytics.com/ga.js";
        var a = document.getElementsByTagName("script")[0x0];
        a.parentNode.insertBefore(b, a)
    })();
    var _msq = _msq || [];
    _msq.push(["setDomainId", 0x64]);
    _msq.push(["trackPageView"]); (function() {
        var a = document.createElement("script");
        a.type = "text/javascript";
        a.async = true;
        a.src = " http://p.www.xiaomi.com/js/xmst.js";
        var b = document.getElementsByTagName("script")[0x0];
        b.parentNode.insertBefore(a, b)
    })();

//以上,基本與搶購沒啥關係了,是谷歌的查詢統計

今天有點累了。不過再總結一句,在源代碼的config部分裏面,有個30秒超時的設置,也就是說任何人去搶購,去點擊按鈕,無論你點多塊,實際上是沒用的,這個頁面只會在30秒後提交第二次。因此,基本上全部的手機,都是30秒內被搶光的。解決辦法之一,就是你開30個網頁,甚至100個網頁,1000個網頁,這些打開搶購開關的網頁,某個頁面會在30秒內跳轉到可購買的頁面。

修改完畢

相關文章
相關標籤/搜索