热门标签 | 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


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
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社区 版权所有