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


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
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社区 版权所有