小米的抢购骗局+小米的抢购页面的源代码分析(三)工具类分析

原创
2013/11/19 14:40
阅读数 1.6W


小米的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 = 重新进入(<span id='initCount'> + count + ”</span>)

    
        },

  //以上的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 = ”<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秒内跳转到可购买的页面。

修改完毕

展开阅读全文
打赏
2
22 收藏
分享
加载中

引用来自“whao”的评论

楼主我想问, 我现在用java 想模拟登录 ---- 预约---抢购 ---这个过程怎么搞, 目前我自己写了登录,但是登录的url 貌似都搞不清楚。 我看js 很吃力(对复杂一点的前端看不懂啊) 我怀疑它是在js 里面把 请求登录的url 替换了。。。能帮我看看么? 对了我用抓包工具看到的请求url 和 在js 里面看到的提交地址 不一样。。而且请求返回的是302 。。。
https://account.xiaomi.com/pass/serviceLogin 看这个界面。。 确实url被各种修改,随便一看就有这句: window.location.href=url.replace("serviceLoginAuth2","serviceLogin");
2014/06/05 10:29
回复
举报

引用来自“whao”的评论

楼主我想问, 我现在用java 想模拟登录 ---- 预约---抢购 ---这个过程怎么搞, 目前我自己写了登录,但是登录的url 貌似都搞不清楚。 我看js 很吃力(对复杂一点的前端看不懂啊) 我怀疑它是在js 里面把 请求登录的url 替换了。。。能帮我看看么? 对了我用抓包工具看到的请求url 和 在js 里面看到的提交地址 不一样。。而且请求返回的是302 。。。
登陆这块没做研究。这玩意已经是一年前的了。我倒觉得应该是替换掉了。
2014/06/05 10:25
回复
举报
楼主我想问, 我现在用java 想模拟登录 ---- 预约---抢购 ---这个过程怎么搞, 目前我自己写了登录,但是登录的url 貌似都搞不清楚。 我看js 很吃力(对复杂一点的前端看不懂啊) 我怀疑它是在js 里面把 请求登录的url 替换了。。。能帮我看看么? 对了我用抓包工具看到的请求url 和 在js 里面看到的提交地址 不一样。。而且请求返回的是302 。。。
2014/05/29 17:22
回复
举报

引用来自“Ethan丶Lee”的评论

剩下的代码分析呢,现在小米的排队机制改到后台了,在后台排队等待响应。这是我观察的结果,11月19日改的。

完工。
2013/11/20 20:16
回复
举报

引用来自“Ethan丶Lee”的评论

剩下的代码分析呢,现在小米的排队机制改到后台了,在后台排队等待响应。这是我观察的结果,11月19日改的。

我认为也是,后台决定是否能买上,不过通过多次提交(大于10000)hdget请求,如果后台有一次承认roll上了,然后在浏览器输入购买页地址,就是在头部js里面op=choose那个页面url,就能买上一台吧?
2013/11/20 19:11
回复
举报
剩下的代码分析呢,现在小米的排队机制改到后台了,在后台排队等待响应。这是我观察的结果,11月19日改的。
2013/11/20 16:30
回复
举报
mark
2013/11/19 21:36
回复
举报
更多评论
打赏
7 评论
22 收藏
2
分享
返回顶部
顶部