小米手机抢购原理

[java]代码库

view source
print ?
小米的javascript除了数据部分,下面就只剩871行的javascript了。
 
下面分模块进行分析。首先从简单的工具类入手。
 
616行到最后。一共253行。
 
小米由于采用了一个数组,存储所有的静态字符串。所以需要手动对代码进行翻译
 
    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 = ”重新进入('initCount'>“ + count + ”)“
 
     
        },
 
  //以上的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
            }
        },
 
//以上,点击开始抢购后的执行的代码,注意这里return false,你懂得。
        retime: function() {
            m.$(”box-close“).innerHTML =” “;
            m.$(”reback“).className = ”reback_btn“;
            count = CONFIG.count  //count是等待的秒数
        },
 
//以上,进行重试的倒计时
        changebg: function() {
            stop = false;
            setInterval(function() {
                if (!stop) {
                    m.$("top").className = "topmitv";
                    stop = true
                else {
                    m.$("top").className = "topmi3";
                    stop = false
                }
            },
            0x1388//5秒钟后自动换背景哦。
        },
 
//以上,自动背景替换,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 = ”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 

很遗憾,您没有预约“ + g + ”喔

参与开放购买需要提前预约,别灰心,你可返回首页尝试购买“ + f + ”, 也可立即预约
1126日星期二开放购买

“ + 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 = ”欢迎您 “ + a + ”!'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()
            }
        }
    };
 
//以上,用户信息
 

你可能感兴趣的:(小米手机抢购原理)