今天民生信用卡搞了个活动,N天前就开始推广,自己也准备参与一下,从宣传来,还是比较诱人的。下面的地址是活动的官方说明,以及一个简单的页面抓图。
http://creditcard.cmbc.com.cn/HtmlFile/10th616/index.html
参与后,发现自己太天真了,被人当傻瓜一样涮了。慢慢看我的分析结果吧。
一、服务器方面的问题(小坑,大坑在下面)
首先在活动刚刚一开始(上午9点的第一场),服务器就出现了反应迟钝的现象,多次刷新后才能进入。
这样大的活动,也可以理解,毕竟他们不是专门的电商平台,没有强大的服务器集群来支撑,只要服务器不倒,可以使用,慢点儿也忍了。
但不幸的是,这种”慢”也没有支撑多久,服务器很快就down了(前端的web服务器正常,但后端的应用服务器down了)。
看我手机的时间,才9:05,也就是活动才开始5分钟,而且偶并没有成功进入摇奖的界面呢,唉。我在想,这得多少人啊?难道比双11还多?
在503的陪伴下,也成功进入过几次摇奖界面,但自己已经不是为了摇奖了,而是转回了自己的本行,分析起代码来,这个稍后细说。
第二场开始时,运维人员明显是做了些事情:
这真是个坑爹的解决方案,在web服务器上增加了503的错误页面,从这之后,一直到最后一场结束,就再也没有成功进入过摇奖页面了。(即使进入了,也会由于某个js没有加载,无法正常使用)
这次的活动是做在了微信公众平台上,结果可想而知,整个民生信用卡的微信公众平台都瘫掉了:
菜单中除了外网(或是其它服务器)的URL还可以打开外,其它的自动回复、站内链接不是不响应,就是503了。
二、代码分析(进入主题啰)
以下的内容是我今天最想描述的,也是让自己很生气的原因。
下图是自己唯一一次成功参与摇奖时抓的图,看看这奖品数量,你不心动?
之后总是无法进入了(为什么要退出来?哈哈,抓包),但看看以下代码,我是真想知道是谁开发的(谁设计的)。
此图只是想说明:虽然只有两层页面,但你知道我抓个包多不容易吗?这服务器,太……
(费话太多,进入主题吧)
GET /bjbankMobile/shake/goLottery HTTP/1.1
这个是摇奖的页面URL,主要的JS代码也在这个页面上。
此段代码是在处理显示”剩余奖品数量”,此处的timeNode变量应该是后台代码生产的(只是我希望是这样,否则坑的就不只是爹了)。
(因为代码比较多,所以偶只是截了其中的一小部分,关键的代码来进行说明的)
其它场次时的剩余奖品处理的显示方法是一样的,都是通过getQuantityTotal方法来处理的,你是否也发现了什么?一个剩余数量的方法,为啥要传时间呢?继续看……
仔细看看,再仔细看看,是不是我看错了?我是反复确认了几遍,不敢相信剩余数量是这样计算出来的,而且从表面看,计算的还比较像真的,一直在减少。
再继续分析,下面是摇奖的事件处理(虽然偶没写过,但看样子可以猜个差不多)。
Shake这个方法是此次活动的核心,终于快找到根了。
此处要注意那个isBMD的变量,不了解这是个什么变量。
当前的这个页面,只刷新成功了几次,其中的isBMD一直是0,不确定什么样的人可以被加入白名单之中,自己看样子是不符合此条件了。
还有那个chushu变量值是在变化的,几个页面上看到过3个不同值:100、147、10000,看样子是个随机的。
自己不再白名单之中,就只好”被随机”(random方法)了。
偶的数学学得不好,看了段代码都有些晕,到底是有多少的概率在”本地坑爹”(不提交服务器,骗用户以为是没有抽到奖)呢?
偶写了个小页面来测试下(这点代码不解释):
执行来看看:
好吧,好吧,我摇10000次,它给我真实提交了一次,也就是说,你手机摇坏了,其实也就提交了那么几次,而且无法判断后台是不是真的进行了抽奖。
最后再把真实提交的代码粘贴一下吧(人家也不是完全不提交,只是你需要经过9×9=81难而已):
(此处又出现了这个isBMD的参数,它是做什么的呢?)
其实分析到这里,想弄个刷奖的小程序也不是太大的问题了,但这样的服务器环境,再加上这样的前台代码,你还有心思弄刷奖的工具吗?
结论:偶要退掉民生信用卡,我不再相信它了。