ROG大队成员的必备素养
哈蒙的小迷弟 Lv1

写在前面

不务正业了快两星期,经过各种碰壁、受教、调试……最后终于完成了抢购程序的编写和个人博客的搭建。刚开始想要写抢购程序的动机很简单:新一代的游戏本要来了。之前暑假时1秒抢光R7000p的景象仍历历在目,所以就想着利用自己的爱好为抢购助个力。编写的过程中,出错的瞬间是frustrating的,但是测通的时候也是很喜悦的lol.

按照以前的习惯,编写完之后我肯定是直接push到GitHub上就完事了。然而在wlb群里日常灌水的时候,和一位ms的前辈进行了番技术交流。前辈的一句话让我这个刚上道的菜鸡深刻意识到了写个人博客的重要性。所以接下来的两天又是一番折腾:建仓库,挑主题,甚至还花了8块9注册了个自己的域名。值得一提的是,在网站快要做完正式上线的时候突然404了,也让我意识到了及时备份是个多么好的习惯。

现在再来回顾这疯狂摸鱼的两周,难道真的是“不务正业”吗?也不一定。这两周里我的睡眠其实算不上充裕,但是却不觉得疲倦。相反,我越来越认识到coding是我生命中不可或缺的一部分(而且学会的JS、Markdown等等也都是实打实的知识)。或许这就是所谓的以中有足乐者,不知口体之奉不若人也吧。


闲话说完了,该开始进入正题啦。

上文中说到,这次的动机主要是想自己写一个脚本助力抢购新电脑。因为不光是显卡,主板、内存、CPU各种缺货,加上还有各路黄牛虎视眈眈,光靠手速是肯定不行的。在搜集相关信息之后,初步找到了两种解决策略:

 1. 通过Selenium操控浏览器模拟正常购买操作。
 2. 通过编写JavaScript脚本,然后交由浏览器去解决。

由于之前对于JavaScript处于一个完全未知的状态,所以刚开始时我采用了第一种策略,通过Selenium来进行京东/淘宝购物车的清空。但出于未知的原因,京东购物车的全选框无法通过Selenium的 find_element() 索引到(此处也寻求各路大佬指点,是否是因为我的打开方式不对所以才没有索引到呢?)。后来在wlb群里奶黄包大佬的指引下,我开始走上了学习JS的道路。不过好在此次任务对于JS的要求不高,经过一波2小时速成即可成功过渡至JS编程。

不得不承认,在对网页进行元素级操作时,JS具有其先天的优势(其中体会最深的就是不需要scroll into view就可对索引到的元素进行一系列操作了)。不过毕竟A coin has two sides,JS也是如此。无论是直接在控制台中运行还是在控制台内暂存为snippet再一次性执行,其作用域仅限于当前网页。当域名发生跳转/重定向时,之前未执行完的代码即会终止。而对于京东和淘宝这两个平台来说,购物车界面与订单提交界面的域名是不一样的。这样一来就为抢购的全自动化造成了阻碍:我们肯定希望能在刚跳转至订单提交页面的时候,脚本就能直接为我们提交订单。

那么,该如何达到上面的一个效果呢?在这一步我困扰了很久,多亏在一位学弟的指点之下,我才通过Chrome扩展解决了最后一道难题 (参考链接)。上一段中提到,在控制台中键入JS执行时,所对应的代码将只在当前二级域名网站下可用。而将.js文件包装成Chrome扩展之后,即可通过在目标站点启用扩展来实现在多个网站执行同一段代码的功能。进一步,如果更改扩展在不同站点的启用规则,使其在特定站点自动启用,则可以实现从购物车结算到提交订单的全自动实现。

当然,学会了JS之后,配合上Selenium进行一波混合编程就能结合两者的优点发挥出更大的作用了。在对Apple官网进行全自动抢购的时候这一点尤为突出:若对京东/淘宝的JS代码进行修改,通过纯粹JS的方式来实现,进行至倒数第二步选择付款方式时,需要等待 onclick="" 事件完成。而对于一个现成的网站来说,想要知道 onclick 事件及其完成后的返回值是比较困难的(好吧我摊牌了,其实主要还是懒得学习lol);而在单纯使用Selenium时,由于Apple官网的下单页面中很多都比较长,而Selenium又要求所有操作的对象必须要在可视范围内,因此就必须加入下拉或是缩放的操作。而恰巧这两个操作在Firefox上都无法成功运行,因此我便想到了Selenium的 execute_script() 方法。在无法使用 find_element() 同时对同步性又要求较高时,可考虑使用Selenium+JavaScript混合编程的方式,这样既能利用Selenium优秀的API,同时又可以借助JavaScript找到Selenium无法索引到的元素。

最后把我的repo贴出来供大家参考一下😂:https://github.com/taylover2016/Goods_Killing 若有不妥之处还请大家批评指正。

最最后,十分感谢此次开发过程当中每一个帮助过我的人。谢谢奶黄包大佬、LK大佬和wlb群里的其他hxd,谢谢NS学弟。谢谢来自V2EX的Showfom大佬提供的免费图床(真的太感动了5555),也谢谢网上众多的博文作者(尤其是编写茅台抢购脚本的那位大佬,我的JS脚本框架受到了很大的启发)。当然还要感谢淘宝、京东、苹果、联想和华为,如果没有无限次免费取消订单的话我已经欠债20万了lol

希望室友能抢到Mate 40,也希望自己能帮所长抢到一款ROG。

Update:刚刚室友发vx说他已经手动抢到Mate 40 Pro了,哦那没事了。