又是一年618,电商渠道又是惯例的 价格歧视 策略:考察抢券、各种凑单、报到、重视店铺、加购产品、看直播等。满打满算,可能终究付款的价格比618前还贵,2333,毕竟都是 活动前先提价

用CpFastAccessibility轻松实现 → 某电商618

比方,前些天杰哥想给家里物色个小冰箱,标的1799,领了各种券,就差个plus的1500-50,价格能够做到1550左右,想着能省一点是一点,先加购物车,明早定个9:59的闹钟抢下券,抢到直接下单一波带走。然后我发现我想多了,当我抢到券,再翻开产品页,我整个人傻了:

用CpFastAccessibility轻松实现 → 某电商618

6啊,直接提价到1899,并且还要预定,得过两天晚上8点才干抢,你猜我最后多少钱下单的?1650,所以整这些有的没的,最后我还多花了100块钱…

用CpFastAccessibility轻松实现 → 某电商618

不过说回来,阿狗的活动奖赏,比阿猫良心多了,归于多劳多得类型,当年阿猫搞组队PK互抢红包的厌恶玩法还历历在目。关于阿狗活动的玩法,其实都是相同的,便是换个主题,活动使命的自动化方案,之前就写过了几篇文章了:

  • 《节约”阳寿”——某电商新年炸年兽自动化》 → Airtest自动化测验东西 + 第三方OCR
  • 《节约”阳寿”——某电商618活动自动化》 → 图片处理 + 相似度匹配 + 第三方OCR + Chrome Inspect
  • 《破大防!这个开源库,竟能让APP日常使命自动化变得如此简略》 → 中文OCR库chineseocr_lite

上述方案,都需求手机插着电脑跑脚本,上上周不是整活封装了一个AccessibilityService库么 → 《简略封装AccessibilityService写个库,助力Android自动化》,本节就用这个库来轻松完成自动化。

用CpFastAccessibility轻松实现 → 某电商618


0x1、翻开APP进入活动页

这一步的惯例完成思路:先取得 方针APP的包名进口Activity,然后调用 startActivity() 完成跳转。

① 取得 APP的包名和进口Activity 的3种技巧

  1. 从APK文件下手 → 包名和进口Activity都会在 AndroidManifest.xml 配置文件中声明,直接找到这个文件就好~

直接解压apk文件不可的哈!!!你翻开只会看到这个:

用CpFastAccessibility轻松实现 → 某电商618

最简略方便的办法:把APK拖到Android Studio里双击翻开,搜 package= 就能够找到包名了:

用CpFastAccessibility轻松实现 → 某电商618

接着搜 android.intent.category.LAUNCHER 就能够找到进口Activity啦:

用CpFastAccessibility轻松实现 → 某电商618

没有装置Android Studio的话,也能够用其它反编译东西获取此文件(如:apktool)


  1. 运用adb指令获取

手机接电脑,翻开APP的瞬间,履行下述指令:

adb shell dumpsys activity top | grep ACTIVITY

运转结果如下:

用CpFastAccessibility轻松实现 → 某电商618

圈着的部分:运用包名 / 运用进口Activity,而全限定类命(完好的Activity)便是前后两部分拼接而已~


  1. 运用CpFastAccessibility取得

自定义无障碍服务类时 (需继承FastAccessibilityService),重写 noAnalyzeCallBack() 直接打印 EventWrapper 参数:

用CpFastAccessibility轻松实现 → 某电商618

运转颁发无障碍后,翻开电商APP:

用CpFastAccessibility轻松实现 → 某电商618

不难看出这个 MainActivity 便是APP的进口Activity啦。是不是超简略?那这里是怎么完成的呢?简述下原理:

  • 1、无障碍配置文件设置 监听一切运用 → android:packageNames=”@null”

用CpFastAccessibility轻松实现 → 某电商618

  • 2、重写 onAccessibilityEvent(),取出event中的关键信息丢EventWrapper实例,然后经过回调往外丢:

用CpFastAccessibility轻松实现 → 某电商618

上面重写了 noAnalyzeCallBack(),自然能收到~


② 翻开方针APP

经过上面取得的包名和进口Activity就能够准确的翻开方针App了,但我想告诉你,其实 只需求一个包名,Android为咱们提供了一个API:PackageManager.getLaunchIntentForPackage(packageName),语法就不翻开讲了,感兴趣的自己搜关键字,直接给出封装的调用代码,除了惯例判空,还加入了反常兜底:

用CpFastAccessibility轻松实现 → 某电商618

调用方式很简略,并且会回来一个跳转成功与否的值~

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(页面内跳转协议) 来隐式发动活动页,封装下东西办法:

用CpFastAccessibility轻松实现 → 某电商618

然后怎么取得这个url呢?

  • 查找获取:有些人会共享出来,能够参阅 《URL Scheme 查询攻略》 说到的几个站点;
  • 运用共享URL,电脑浏览器翻开,F12抓包:不过现在很多电商都不支持共享链接了,只要共享口令;
  • 写Xposed插件阻拦Activity.startActivity() → 本质上仍是调用 Activity.startActivityForResult() → 终究调用 Instrumentation.execStartActivity()

用CpFastAccessibility轻松实现 → 某电商618

所以Hook下这个办法,然后把Intent的值打印出来就能够啦,限于篇幅就不翻开讲啦。写个简略Hook示例:

用CpFastAccessibility轻松实现 → 某电商618

感兴趣的能够自己试试,接着写代码调用下跳转App和页面的办法:

用CpFastAccessibility轻松实现 → 某电商618

运转后看看作用:

用CpFastAccessibility轻松实现 → 某电商618

好的,正常进入活动页面~


0x2、定位结点

接着就到定位结点,触发交互了,由于咱们在无障碍服务配置文件里声明的 android:accessibilityFlags 包含了 flagRequestEnhancedWebAccessibility,理论上也是能拿到网页节点的。库里封装了一个打印一切页面节点的办法:

用CpFastAccessibility轻松实现 → 某电商618

noAnalyzeCallBack() 里调用下:

用CpFastAccessibility轻松实现 → 某电商618

然后能够看到控制台输出的节点树信息:

用CpFastAccessibility轻松实现 → 某电商618

假如WebView里的节点没显现或者显现不全,能够尝试切换到 tbs内核 运转:

  • 给客服发送 debugtbs.qq.com,点击翻开链接;
  • 挑选 装置线上内核,装置完后会自动重启;
  • 重启后 挑选DebugX5,不显现 请先装置内核 说明切换成功;
  • 假如不想,把APP杀掉,重新发动,重复上述操作;

简略写下做使命的样例代码:

用CpFastAccessibility轻松实现 → 某电商618

然后是使命判定,两个思路:

  • 使命履行前,获取”去完成”节点列表,然后获取使命描绘的节点列表,遍历比较y轴相差像素点少于50,树立关联联系;
  • 使命履行后,对页面中使命相关的节点进行判别,比方:滑动浏览xx可得、当即入会,当即开卡、喜欢等等。

0x3、小结

今早兴致勃勃来到工位,翻开电脑预备完善下脚本,才发现活动TM现已结束了,所以本节只讲解了思路,没提供完好可用的代码,甚至连运转的作用图都整不出来,尴尬…

用CpFastAccessibility轻松实现 → 某电商618

不过,在实践开发中,发现自己写的库有很多缺乏的当地,比方:

  • 自动休眠1000ms有点呆,不支持轮询查找等待控件加载,便是那种waitFor();
  • 打印一切页面节点,能够整一个悬浮框来调用;
  • 多次查找结点,回调嵌套,不行优雅;
  • 等等…

当然,后续肯定是要渐渐完善,有空就会写点,有问题的小伙伴欢迎谈论区留言,也能够在库房提issues~