又是一年618,电商渠道又是惯例的 价格歧视 策略:考察抢券、各种凑单、报到、重视店铺、加购产品、看直播等。满打满算,可能终究付款的价格比618前还贵,2333,毕竟都是 活动前先提价。
比方,前些天杰哥想给家里物色个小冰箱,标的1799,领了各种券,就差个plus的1500-50,价格能够做到1550左右,想着能省一点是一点,先加购物车,明早定个9:59的闹钟抢下券,抢到直接下单一波带走。然后我发现我想多了,当我抢到券,再翻开产品页,我整个人傻了:
6啊,直接提价到1899,并且还要预定,得过两天晚上8点才干抢,你猜我最后多少钱下单的?1650,所以整这些有的没的,最后我还多花了100块钱…
不过说回来,阿狗的活动奖赏,比阿猫良心多了,归于多劳多得类型,当年阿猫搞组队PK互抢红包的厌恶玩法还历历在目。关于阿狗活动的玩法,其实都是相同的,便是换个主题,活动使命的自动化方案,之前就写过了几篇文章了:
- 《节约”阳寿”——某电商新年炸年兽自动化》 → Airtest自动化测验东西 + 第三方OCR
- 《节约”阳寿”——某电商618活动自动化》 → 图片处理 + 相似度匹配 + 第三方OCR + Chrome Inspect
- 《破大防!这个开源库,竟能让APP日常使命自动化变得如此简略》 → 中文OCR库chineseocr_lite
上述方案,都需求手机插着电脑跑脚本,上上周不是整活封装了一个AccessibilityService库么 → 《简略封装AccessibilityService写个库,助力Android自动化》,本节就用这个库来轻松完成自动化。
0x1、翻开APP进入活动页
这一步的惯例完成思路:先取得 方针APP的包名 和 进口Activity,然后调用 startActivity() 完成跳转。
① 取得 APP的包名和进口Activity 的3种技巧
- 从APK文件下手 → 包名和进口Activity都会在 AndroidManifest.xml 配置文件中声明,直接找到这个文件就好~
直接解压apk文件 是 不可的哈!!!你翻开只会看到这个:
最简略方便的办法:把APK拖到Android Studio里双击翻开,搜 package=
就能够找到包名了:
接着搜 android.intent.category.LAUNCHER
就能够找到进口Activity啦:
没有装置Android Studio的话,也能够用其它反编译东西获取此文件(如:apktool)
- 运用adb指令获取:
手机接电脑,翻开APP的瞬间,履行下述指令:
adb shell dumpsys activity top | grep ACTIVITY
运转结果如下:
圈着的部分:运用包名 / 运用进口Activity,而全限定类命(完好的Activity)便是前后两部分拼接而已~
- 运用CpFastAccessibility取得
自定义无障碍服务类时 (需继承FastAccessibilityService),重写 noAnalyzeCallBack()
直接打印 EventWrapper
参数:
运转颁发无障碍后,翻开电商APP:
不难看出这个 MainActivity
便是APP的进口Activity啦。是不是超简略?那这里是怎么完成的呢?简述下原理:
- 1、无障碍配置文件设置 监听一切运用 → android:packageNames=”@null”
- 2、重写
onAccessibilityEvent()
,取出event中的关键信息丢EventWrapper实例,然后经过回调往外丢:
上面重写了 noAnalyzeCallBack()
,自然能收到~
② 翻开方针APP
经过上面取得的包名和进口Activity就能够准确的翻开方针App了,但我想告诉你,其实 只需求一个包名,Android为咱们提供了一个API:PackageManager.getLaunchIntentForPackage(packageName),语法就不翻开讲了,感兴趣的自己搜关键字,直接给出封装的调用代码,除了惯例判空,还加入了反常兜底:
调用方式很简略,并且会回来一个跳转成功与否的值~
Tips:由于 Android 11 的软件包可见性影响,有装置APP,可是调 getLaunchIntentForPackage()仍是会回来null,需求修改下 AndroidManifest.xml,下述办法2选1:
<!-- 办法1:添加查询一切的运用的权限 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<!-- 办法2:添加queries标签,声明与哪些包名的运用交互 -->
<queries>
<package android:name="com.facebook.katana" />
<package android:name="com.tencent.mm" />
</queries>
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
③ 隐式发动Activity
在发动APP后,怎么进入活动页?惯例思路:找到进口节点 → 触发点击,但在这个电商APP里完全不需求这样做,能够经过 URL Scheme(页面内跳转协议) 来隐式发动活动页,封装下东西办法:
然后怎么取得这个url呢?
- ① 查找获取:有些人会共享出来,能够参阅 《URL Scheme 查询攻略》 说到的几个站点;
- ② 运用共享URL,电脑浏览器翻开,F12抓包:不过现在很多电商都不支持共享链接了,只要共享口令;
- ③ 写Xposed插件阻拦:
Activity.startActivity()
→ 本质上仍是调用Activity.startActivityForResult()
→ 终究调用Instrumentation.execStartActivity()
:
所以Hook下这个办法,然后把Intent的值打印出来就能够啦,限于篇幅就不翻开讲啦。写个简略Hook示例:
感兴趣的能够自己试试,接着写代码调用下跳转App和页面的办法:
运转后看看作用:
好的,正常进入活动页面~
0x2、定位结点
接着就到定位结点,触发交互了,由于咱们在无障碍服务配置文件里声明的 android:accessibilityFlags 包含了 flagRequestEnhancedWebAccessibility,理论上也是能拿到网页节点的。库里封装了一个打印一切页面节点的办法:
在 noAnalyzeCallBack()
里调用下:
然后能够看到控制台输出的节点树信息:
假如WebView里的节点没显现或者显现不全,能够尝试切换到 tbs内核 运转:
- 给客服发送 debugtbs.qq.com,点击翻开链接;
- 挑选 装置线上内核,装置完后会自动重启;
- 重启后 挑选DebugX5,不显现 请先装置内核 说明切换成功;
- 假如不想,把APP杀掉,重新发动,重复上述操作;
简略写下做使命的样例代码:
然后是使命判定,两个思路:
- 使命履行前,获取”去完成”节点列表,然后获取使命描绘的节点列表,遍历比较y轴相差像素点少于50,树立关联联系;
- 使命履行后,对页面中使命相关的节点进行判别,比方:滑动浏览xx可得、当即入会,当即开卡、喜欢等等。
0x3、小结
今早兴致勃勃来到工位,翻开电脑预备完善下脚本,才发现活动TM现已结束了,所以本节只讲解了思路,没提供完好可用的代码,甚至连运转的作用图都整不出来,尴尬…
不过,在实践开发中,发现自己写的库有很多缺乏的当地,比方:
- 自动休眠1000ms有点呆,不支持轮询查找等待控件加载,便是那种waitFor();
- 打印一切页面节点,能够整一个悬浮框来调用;
- 多次查找结点,回调嵌套,不行优雅;
- 等等…
当然,后续肯定是要渐渐完善,有空就会写点,有问题的小伙伴欢迎谈论区留言,也能够在库房提issues~