广州又双叒叕开大明星(陈奕迅)的演唱会了!
起因: 之前张学友的演唱会,我找了五六个人帮我一起抢,我提前去蹲位等着,一顿猛点,结果,下单详情页还没进到,就直接没票了!t喵的,那些人抢票的人手速居然如此之快!比我这单身贵族手速还快,这不科学,不,我不信!他们一定用了什么奇奇怪怪的方式抢。好好好,都这么玩是吧,摊牌了,爷是前端切图仔,所以,代码我也是会一点的!所以我先写了一个大麦的脚本,听说猫眼更好抢,最后我也写了一个猫眼的!结果:还!是!抢!不!到! 因为:下单的时候直接给我提示:服务器人数过多!!!不过抢一些不热门的倒是抢到过,离谱,这些都不想看。
所以这次主要分享写autoxjs脚本时踩到的坑,源码就不放了,毕竟这玩意是很刑的!
技术选型
对于这些奇奇怪怪软件的制作,当然是要绕不过大名鼎鼎的appium、airtest,没错,这两个玩意我都没用到(因为我手机T喵的连不上,就很奇怪),除了这两个玩意,作为前端,我当然是对JS更加熟悉一些,所以我选择使用auto.js 。
不过由于一些原因,autojs居然不!能!用!了!要给钱!我这种穷鬼,这不是要我命?还要我自己去找破解版,本打算放弃了,突然发现,居然有平替版autoxjs!
所以,最终我选择了使用autoxjs!
抢票流程
其实流程很简单,总结一下:就是抢票下单!
- 倒计时结束后开始抢。
- 选择场次!
- 选择票档。
- 选择购买数量。
- 选择观影人。
- 下单!
踩坑
- 一些必要的UI也是少不了的,不过最后我没做,因为UI和我写的脚本代码有BUG,会导致脚本APP直接崩溃!原因:脚本里面有很多递归导致的。 当从UI中点击开始脚本按钮后,会直接崩溃,我猜测可能是线程之间的问题,因为如果是单纯执行脚本不通过UI点击按钮的方式,直接运行的方式是一点问题都没有的。可以使用控制台来代替!里面也有输入框!但是在执行脚本后一定要关闭这个控制台弹窗,因为它是在最顶层!
- 可能会有人问为什么不用提供的waitFor方法,为什么要用递归循环的方式?因为用了waitFor之后也不能确保你能找到你要的控件,需要一遍一遍的去找,那些APP的开发人员也不是不知道有连点器的这玩意的,所以一些防连点器的方式也会有的,加一些滑块校验啥的(我也用opencv写过坏快校验的方式,就是轮廓检测的方式,但是通用性几乎无,最好还是用AI才行)。
- 在查找控件的时候,我就碰到很多问题:
- 找到的控件集合,循环打印发现都是重复的控件:循环要用forEach,map这些方法,如果用for循环就会出现这个问题!我也不知道为啥。
- 使用ID选择器找不到控件:APP的控件id可能是动态生成的,还有就是页面没有加载出来,还有就是层级太深找不到,解决很简单:用类选择器+层次选择器(最重要)+ID选择器(不是动态生成的id才能用)。
- 找不到控件:这个找不到控件和上面的有些区别,这个是在页面加载完成后,控件也出来了,但是你就是获取不到!我估计是因为APP会提前渲染一个类似的节点网络,让节点分析器分析的是这个错误的节点(应该就是XML),如果在页面完全渲染之前不执行任何脚本的话,就不会有这个问题!解决方式:如果你在找不到控件但是页面已经完全渲染后,然后点一下特定区域,就会发现又能找到特定的控件了,所以在找控件前可以模拟点击一些特定地方。
运行结果
放一张打包后的运行效果图和部分代码(非核心)图,代码就不开源了,不经代码还是挺刑的!主要分享踩坑经验。