天猫双十一狂抢优惠券?机智的程序猿这么玩

一年一度的光棍节又快到了,天猫早已迫不及待放出双11优惠券认领页面,用户可以在该页面领取心怡店家的优惠券,不过存在手慢会被抢完的情况。

然后是在群里看到了这样的一段代码,说是把它粘贴到控制面板上执行就能自动帮你领掉页面上的优惠券,我瞧了下没有啥漏洞代码段就试了试,好家伙还真的生效了:

(function(window, document, undefined) {
    var interval = 800;
    var closeDelay = 200;
    var index = 0;
    var couponLinks;
    var getCoupon = function() {
        if (index >= couponLinks.length) {
            console.log("领取完毕");
            return;
        }
        var coponLink = couponLinks[index];
        coponLink.click(); index++;
        console.log("领取 第" + index + " 张");
        setTimeout(getCoupon, interval);
        setTimeout(function() {
            var close = document.querySelector('.mui-dialog-close');
            if (close != null) close.click();
        }, closeDelay);
    };
    var _scrollTop = 0;
    var _scrollStep = document.documentElement.clientHeight;
    var _maxScrollTop = document.body.clientHeight - document.documentElement.clientHeight;
    var autoScrollDown = setInterval(function() {
        _scrollTop += _scrollStep;
        if (_scrollTop > _maxScrollTop) {
            clearInterval(autoScrollDown);
            couponLinks = document.querySelectorAll('.mui-act-item-yhqbtn');
            console.log("总共:" + couponLinks.length + "条张优惠券待领取...");
            getCoupon();
        } else {
            document.body.scrollTop = _scrollTop;
        }
    }, 500);
}) (window, document);

如上图所示,脚本会先每500毫秒就分屏滚动下页面,让页面的懒加载都生效并加载出所有可领取优惠券的区域,这里对应的是 autoScrollDown 方法:

        var autoScrollDown = setInterval(function () {
            _scrollTop += _scrollStep;
            if (_scrollTop > _maxScrollTop) { //到底了就找出全部领取按钮
                clearInterval(autoScrollDown);
                couponLinks = document.querySelectorAll('.mui-act-item-yhqbtn');
                console.log("总共:" + couponLinks.length + "条张优惠券待领取...");
                getCoupon();
            } else {
                document.body.scrollTop = _scrollTop; //还没到底就滚屏
            }
        }, 500);

然后是通过 getCoupon 方法来遍历上述获得的全部领券按钮,并做点击触发:

    var getCoupon = function() {
        if (index >= couponLinks.length) {  //领完了就不再执行定时器了
            console.log("领取完毕");
            return;
        }
        var coponLink = couponLinks[index];
        coponLink.click(); index++;   //遍历优惠券按钮并触发点击事件
        console.log("领取 第" + index + " 张");
        setTimeout(getCoupon, interval);
        setTimeout(function() {  //200毫秒后触发关闭按钮
            var close = document.querySelector('.mui-dialog-close');
            if (close != null) close.click();
        }, closeDelay);
    };

这位机智的作者在点击领券的200毫秒之后也点击了提示浮层的关闭按钮:

然后继续调用 getCoupon 来点击剩余的优惠券领取按钮,直到领完为止。

这位程序猿的机智真是可歌可泣,一个页面的优惠券每次访问的时候我们都可以调用这段代码轻松地遍历一次领取,然后再刷新页面,再调用脚本再领一遍,然后再刷新页面。。。。

。。。咦不对,机智的程序猿可是不会允许需要手动去刷新页面的事情发生的!

于是我把它封装到 chrome 插件中(点我下载)。

解压后在 chrome://extensions/ 的左上角点击“加载已解压的扩展程序”按钮,然后选择解压后的文件夹即可:

这时候我们再访问领券页面,就不单单是自动领券了,在领完之后还会自动刷新页面!

好了,该玩的都玩了,那么这算不算天猫的一个bug呢?

我觉得应该不算,常规敏感操作,大公司都会做防刷机制处理(用户的请求间隔不允许小于X秒),但在领券这块淘宝没搞这块功能,相信淘宝也没太操心这块(仔细想想也没啥敏感数据,但有些优惠券是限量的,用工具刷的确有黄牛嫌疑,吃亏了其他用户)。

二来其实页面上所展示优惠券对应的店家或产品,不一定能找到一个你喜欢、想购买的东西,如果因为拿到优惠券就硬生生去购买东西,那是你被淘宝玩了~

三来用户的优惠券其实是有上限的,我挂了一下午刷到了 255 张优惠券,再刷就会提示上限已满不能再领取,这其实也是一种变相防刷的策略(不过真心没找到几张心怡产品的优惠券。。。)

虽然通过插件抢券对于闷宅类的程序猿们来说可能然并卵,不过这种手法自然可以运用到其它的活动上,举一反三,一来方便自己干事,二来自己做产品的时候也会在脑海里想一下自己的产品是否经得起技术用户这么刷~

共勉~

donate

posted @ 2015-10-15 19:49  vajoy  阅读(13340)  评论(28编辑  收藏  举报
Copyright © 2014 - 2022 VaJoy Studio