从4号开始第一次抢小米,然后利用两个晚上看了代码写了日志,竟发到了人人网上,后来觉得发到人人上算什么。所以放到了这里,从后面的分析来看,这篇里面不乏有些错误,只是原样放到了这里跟大家分享一下我的经历。

By:小宗

今天晚上不想干活,研究了一下小米2014年3月4号抢购的页面。时间不多所以只看了主要看了一下抢购时间到了之后执行的代码,没有看其他的地方。小米页面整理后又近1000行的代码,因此不可能在一个晚上全部看完,因此只看了点击“立即购买”这一条线的代码。不能保证分析的正确性。

内容枯燥,不喜欢的可以直接跳到结论去看

首先,小米抢购页面是这样的,开始抢购之后下面的“即将开始”会变成“立即订购”

所以重要的是点击“立即订购”后发生了什么,打开网站的源代码,以红米为例,上图方框中的代码是:

这里面没有事件,因此抢购开始后或一开始加载时会用JS添加事件之类的。可以看到它有一个DIV标签的ID是“hongmiBtn”,在一个页面中这个唯一,要添加事件一般都用它。然后再看页面的JS代码:

可以看到有四段JS,把所有代码都写在了一行。。。。囧

前三段似乎没什么用。。。页面布局的,可能是。

其实写在一行也没啥难的,插个广告,FireFox27.0的代码速记里有美化代码,整理后就是这样的(漂亮多了):

现在搜索“hongmiBtn”,可是在代码里竟然搜不到。。。。

我们发现一开始定义了一个字符串数组_$[](在JS里面变量名是可以有$的,所以有些库的名字就是$),好吧,使用16进制写的。就像在C里可以用'A'表示A也可以用‘\x41’,所以这也不是什么难题,复制一下,当作字符串输出就好了。。。搞定。。。

我觉得小米之所以这样做是因为怕别人读代码(其实也不是什么难事),其次就是有些存了一些特殊字符,总是用转义不好看,用文本编辑器编辑好之后统一转为16进制比较方便

翻译好之后发现 _$[164]就是“hongmiBtn”。下面使用这个变量的值是 这句:

这句意思应该是把ID是hongmiBtn的对象赋给f,也就是刚才那个DIV标签,让后给这个对象内部HTML改写成c.buy。当然最后这两个是一句代码,意思是根据经过一系列判断确定给f内部HTML改写成什么值,不用细读buy就暴露了c.buy是购买代码。

可见c.buy的值就是_$[156]为:

呵呵,终于见到了“立即购买”,这句的意思就是点击“立即购买”后会执行Util.showBox('phone');它是什么呢?

一大串但是有用的并不多检测之后就是getStatus.requestHdGet()这个的定义是:

基本没用,就是调用了This.jsonInter(CONFIG.srcs.hdget, _$[117],true)

其中有三个参数,第一个是全局变量CONFIG

_$[9] 的值是字符串 然后加一个时间戳(这个变量是全局变量,因此其值是打开页面的时间) 第二个参数_$[117]是"hdget"
那么jsonInter函数的定义是


其实也没啥代码,就是给第一个参数又加了一个时间戳后,调用了createJs。createJs代码如下 :

重要的是两句,其中_$[55]的值是“script”就是说第一句给页面有添加了一段JS代码,它的地址是d.src=a;上面的分析之a= [photo-media] +时间戳1+时间戳2;其中var d。。。上面那就是把a中的两个{{。。}}替换掉。至于替换的是什么,应该是Showbox里面第二个if可以看出应该是产品类型和验证码。

懂URL结构的人都应该知道这个URL的中“?”前面是服务器地址,后面有三个变量product,fk和_,前两个的值刚才说过应该是产品类型和验证码,由变量名也可以印证。

至于返回的JS代码是什么又是怎么执行的我就不知道了,可惜没有打开网络分析看一下,不过据说是返回的JSON格式的数据,就是有关抢没抢到的,30秒后自动刷新,读取这个JSON的数据。或许因此那个函数叫做jsonInner吧,另外我似乎还看到了付款的代码。

结论

经过这么多步,其实就是用三个参数像服务器请求了一段JS代码,前两个不管(应该是型号和验证码,因为没看具体代码,或许验证码是在前几步验证),第三个变量或许应该特别注意。

第三个变量名叫_,是由打开页面的时间(精确到毫秒,没注意页面在时间到了之后会不会自动刷新,所以不知道这个值是最后一次手动刷新的还是到时间后自动刷新的时间)和按完“立即购买”后的时间组成的字符串(注意:这两个时间都是你电脑的本地时间),这是服务器唯一一个从本地获得的或许与抢购有关的变量,也许就关系到能不能抢到。 这两个时间由于是本地发送的,所以可以在发送的值可以手动控制,至于怎么样的值容易抢到这个要看服务器的代码吧。或许是两个值是过了12点且差越小越好(可能性很大,但是估计不能太小,否则服务器认为是不是手动输的验证码),或者是第一个值越早越好(没有读所有代码,所以第一个可能是值提前登录的早的好,不过可能性很小),或者是第二个值在过了12点之后里12点越近越好。
由于已经给出了JS购买代码,所以是可以提前使用JS提交,提交的通用方法就是在浏览器地址栏输入javascript: Util.showBox("phone")(区分大写小写),但是在没到抢购时间的时候提交上去服务器是不是认可你的提交就不知道了。上次抢华为X3,提前提交,那个服务器返回的就是时间未到,请更正系统时间之类的话。

还有一点儿问题是没有看页面倒计时的时间是从系统获得的还是从服务器获得的。X3的页面倒计时时间是从本地读取的。所以可以把表调快然后就可以点击购买了,但是服务器就返回了上面的话。

这是3月4号的抢购页面代码,明天的页面代码还不知道是什么,其实在页面内改个变量名一切就都变了。

以上就是我用所读到的信息能想到的,但不保证正确性

香农说,信息是减少不确定性的唯一因素,如果我多看一下代码,然后知道了第一个时间是抢购时间到了自动刷新的时间(假设),那个第一个时间就不可能是越早越好了。求两个时间差的可能性就更大了。

最后的最后,我应该是说祝我好运呢还是祝师妹好运呢?

小米抢购页面源码分析2014年03月04号相关推荐

  1. 小米抢购页面源码分析2014年03月11号

    这个是3月11号的源码分析,后来没有写18号的,因为18号抢到一个,而且自己还有脑残行为,虽然有重大发现,看25号的情况再说吧... By:小宗 3月11号又是抢小米的日子....(今天出去了一下,回 ...

  2. 小米抢购页面源码分析2014年03月18号

    有些时候一些直觉还是很有用的,或许人的直觉本就是经过长时间的学习具有了用现有信息推导结论的能力,只是你没有意识到你是怎么推导的而已,算是内隐记忆吧. By:小宗 这篇文章似乎是带着悲伤的心情写的,这几 ...

  3. 巡风扫描器--web页面源码分析

    1.view部分的结构 lib:主程序依赖的库文件包: static:静态文件库: templates:模板文件库: init.py : app对象创建以及数据库初始化的python文件; view. ...

  4. HTML5页面被运营商DNS劫持问题及解决方案,app中h5页面源码的获取

    App应用的html5页面经过运营商的移动网络(非wifi网络),被强制插入广告和手机管家的多余信息,在有些场景严重干扰用户的操作,也产生在美丽的页面上加入了不协调的悬浮层.并且这个手机管家类的悬浮层 ...

  5. QT通过QAxWidget嵌入IE浏览器并获取页面源码

    为什么 为了显示微信登录的二维码,引入了整套QtWebEngine,占用非常大的空间.微信登录二维码有自动刷新动作,这些定义在页面脚本中,所以不能直接自绘二维码方式实现,浏览器少不了. 主要原理 通过 ...

  6. selenium3 + python - page_source页面源码

    前言: 有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从源码中爬出想要的信息.selenium的page_source方法可以获取到页面源码. 本次以博客园为例,先爬取页面源码, ...

  7. html5软件下载页面源码

    简介: 高端大气响应式软件下载页面源码,适用于软件下载,可用于官网页面.喜欢的下载保存! 网盘下载地址: http://kekewl.org/WRfLuciEL330 图片:

  8. 一款好看新颖的404页面源码

    介绍: 一款好看新颖的404页面源码 网盘下载地址: http://kekewl.net/cBKSw324y3s0 图片:

  9. 带翻转特效的会员登录注册html页面源码

    大家好,今天给大家介绍一款,带翻转特效的会员登录注册html页面源码(图1).送给大家哦,获取方式在本文末尾. 图1 点击登录和注册切换时,带翻转特效(图2) 图2 源码完整,需要的朋友可以下载学习( ...

最新文章

  1. git stash和git stash pop
  2. 微酒店微信界面返回信息有html源码
  3. Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?
  4. python函数参数列表中的*与**
  5. 二叉树的广度优先遍历(层序遍历)
  6. ArrayList排序Sort()方法(转)
  7. java jre安装_JRE安装与配置图文教程
  8. 加密的PDF文件如何解密?教你使用手机就能解密的方法
  9. 怎样用计算机做ppt,电脑怎么做ppt(教你几个小技巧做出高大上的ppt)
  10. 落幕,致我的大学生活
  11. app系统软件开发外包的费用:开发app多少钱的费用?
  12. 下载哔哩哔哩网页上的视频
  13. 测试欢迎使用CSDN-markdown编辑器
  14. java语言编写计算器_第二次作业利用java语言编写计算器进行四则运算
  15. 分享Silverlight/WPF/Windows Phone一周学习导读(1月3日-1月8日)
  16. day02-Java基础语法以及IDLE的安装和使用
  17. 关于程序集成线上支付模块
  18. 电脑上的ofd格式文件如何打开呢_OFD文件怎么打开?如何将ofd转成PDF格式?
  19. 贵阳副市长刚写了一本区块链的书,趁热乎推荐给你!
  20. BCompare 右键菜单不显示的问题(完美解决办法)

热门文章

  1. 简单手势识别(特征点定位、Track+Detection、Dlib+Opencv_contrib)
  2. eclipse超常用快捷键
  3. pyspider mysql 配置_pyspider 部署文档
  4. SpringBoot——配置文件里的全局变量
  5. #python# 成语接龙(三)
  6. linux-RAID磁盘阵列、进程管理、日志管理、systemctl控制
  7. Servlet的线程安全问题
  8. 手机屏幕厂家信息软件_微软Surface Duo SwiftKey键盘更新 将允许键盘在两个屏幕上分割_华强北软件网_软件行情_软件新闻_软件评测_手机应用文章...
  9. xml做配置文件 php,使用 PHP 处理 XML 配置文件
  10. 树莓派 FM 发送机小电台背后的原理解析