您的位置:首页 > 职场人生

码农凑热闹!小米抢购手机页面前端代码分析

2013-12-09 13:35 633 查看
今天来个比较潮的,分析一下小米前端js排队代码;! 走过路过不要错过了!
话说小米手机不错,主要是miui不错。买个手机天天要抢。其实我是比讨厌这种营销。把手机价格搞的低低的,吸引注意。好长一段时间,你很难抢的到手机。 相比小米,我更喜欢魅族,虽然我用的是小米1s.以后有点闲钱,换手机买一部魅族。

下面来享受这段代码。 你想做抢购软件?抢购机器人?先看懂这代码吧!

10.15号的抢购js代码,都写到一个js文件中.里面的代码是mini版本的,查个工具把他格式化一下就可以了。
http://p.www.xiaomi.com/open/131009/mi3/buy/process.min.js

小米为了增加代码阅读的复杂性(也可能为了转义字符),把一些变量定义成一个数组,而且这个数组用16进制表示。

做过白帽子的,应该很熟悉。用16进制表示字符找出很多xss漏洞,sql注入漏洞吧。可以自己写(其实alert或console.info
16进制就可以得到字符串)或找个工具转成字符串,增加代码的可读写性。
好了,下面就来分析代码了。
以10.15的抢购代码为例

为了阅读性我们两成两段,一个是他的数组变量_$,另一段是就是其它代码
_$ 变量太长了,我贴一点点,不完整!

hdcontrol({"stime":1382068631,"status":{"allow":false,"miphone":{"hdstart":false,"hdstop":false,"hdurl":"","duration":null},"mibox":{"hdstart":false,"hdstop":false,"hdurl":"","duration":null}}})


View Code

这段代码只是抢购js的前端排队代码,真正的排除代码当然是放在后台的服务器上了。也就是说,你完全知道这段代码,对你抢购也没太大的帮助。如果排队没成功(json.status.allow=false),直接访问购买的页面,服务端会让你跳转到排队页面。

那服务端的排列规则,只小米自己知道。有时可能公平,也可能不公平(也人说他是直接标志的,我觉得这个可能性比较低)。

以10.15这次抢购为例子,可以肯定小米给每个帐号的概率肯定是不一样的。我想这样做的目的只防止黄牛,减少不满。但很多时候也会误伤。如果黄牛的特点跟普通用户一样,或者普通用户也当小黄牛。这时误伤的概率就比较大了。这个要靠小米的后台分析能力了。他们最好的办法就是增加供给。

扯远了,又跑题了。这段代码,进入页面ready
后就执行miphoneBuy.init方法,方法里面里的checkCookie,如果第一次登录,调用就取一下miphoneBuy.jsonInter()服务器的时间。然后启动定时器,每秒钟执行一次,查看现在的状态,根据服务器的时间与开始抢的时间(如果已经开始抢购了,还要根据cookie中手机和盒子是否已经saleout
,这个cookie是由调用miphoneBuy.jsonInter()后,服务器的返回值
json.status.miphone.hdstart,json.status.miphone.hdstop,
json.status.mibox.hdstart, json.status.mibox.hdstop;决定写入的,判断出展示
stepHtml的哪一步的方法。共6步,代表意思见代码注解。

当倒计时完成,开始抢购时,展示第三步(展示购买按钮),点击购买手机,或盒子(TV),发现页面没用直接调用服务端排列。
而是var randomCount
= parseInt(Math.random() * (0xa - 0x5 + 0x1) + 0x5), //随机取5 到 11
中的整数。随机取5-11秒,让页面再次等待5-11秒,才提交服务端排队。如果没排上又是等第一次取的randomCount秒。

那了解这段代码,我们能做些什么。可以在控制台上输入。
isPhone = true;
//或者isBox=true;
isRollStatus = true;
miphoneBuy.jsonInter(); //提交服务端排队
跳过页面等待,直接提交服务端排队

或者把等待进入活动的等待时间修改成更小的值如
count=0;CONFIG.count=0;

或者写个程序,登录后,保持sesion,直接访问排除url,返回成功直接进入购买页面。

那这样我们这样有没有作用呢?

这取决于服务端的规则。
1,如果服务端完全公平,都不考虑黄牛,不考虑你调用次数,这个代码很有作用。这以现在情况我觉得不太可能

  2,如果服务端,有做防止黄牛情况,而且根据不同的帐号给不同的概率,而且还做了防频繁提交。

那我们的代码只能设计成count=5;CONFIG.count=5;但作用有只有一点点点。
如果我是开发者,这种情况比可能性最大

3,如果服务端,是直接分配好了,打标志。那我们代码根据没作用。我觉得这个不太可能。
以上纯属理论分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: