热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

一年一度的光棍节又快到了,天猫早已迫不及待放出双11优惠券认领页面,用户可以在该页面领取心怡店家的优惠券,不过存在手慢会被抢完的情况。然后是在群里看到了这样的一段代码,说是把它粘贴到控制面板上执行就能

一年一度的光棍节又快到了,天猫早已迫不及待放出双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


推荐阅读
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • 本文探讨了在一个使用Mongoid框架的项目中,如何处理当HABTM(has_and_belongs_to_many)关系中的逆向关联设置为nil时,子对象无法正确持久化的问题。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
author-avatar
LC--Vincent
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有