AutoJs+mitmproxy App爬虫

AutoJs

介绍

官方文档:https://hyb1996.github.io/AutoJs-Docs/#/

Github:https://github.com/hyb1996/Auto.js

官方论坛:https://www.autojs.org/

非官方文档:https://easydoc.xyz/doc/25791054/uw2FUUiw/3bEzXb4y

AutoJs是一款不需要Root权限的JavaScript自动化软件,简单来说就是手机上的“脚本精灵”。

现在官方已经不在提供下载途径了,具体原因可以去这里参观:貌似Auto.js在酷安中已经被下架了

AutoJs+mitmproxy App爬虫_第1张图片

非官方文档中有下载地址

在我看来AutoJs与Appium相比更好用,不仅仅是速度,在启动应用方便,AutoJS会保持App登录状态,但是Appium不会。

使用

推荐使用AutoJsPro,本教程基于AutoJsPro

下载安装之后,需要打开几个权限:

  1. 无障碍

  2. 悬浮窗

  3. 远程调试

环境配置参考:https://easydoc.xyz/doc/25791054/uw2FUUiw/F30Lmx8U

远程链接参考:Auto.js Pro如何连接VS Code插件

基础操作

打开应用

//启动APP
if (currentPackage() != "com.chaoxing.mobile") {
    toast("即将打开超星!");
    //直接打开学习通
    app.launchApp("学习通");
} else {
    toast("已经在学习通中,即将开始进行下一步操作!");
};

获取当前activity方法,支付为例,com.zhihu.android就是currentPackage

➜  ~ adb shell dumpsys window | grep mCurrent
    mCurrentAppOrientation=SCREEN_ORIENTATION_PORTRAIT
      mCurrentRotation=ROTATION_0
        mCurrentUserId=0
      mCurrentUserId=0
    mCurrent=[0,72][1080,1920]
  mCurrentFocus=Window{38aea79 u0 com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity}

点击按钮

打开悬浮窗的第三个按钮

AutoJs+mitmproxy App爬虫_第2张图片



AutoJs+mitmproxy App爬虫_第3张图片


比如我们现在点击发现按钮,会有弹窗,点击生成代码,如下图

AutoJs+mitmproxy App爬虫_第4张图片


就有代码了,可以直接拷贝到电脑中,所以如果你是在手机上编辑,会要命的。一定要把VSCode环境安装好。

如果你发现某个按钮是可以找到的,但是执行了id("hello").findOne().click()后,并没有点击动作,你可以试试这种方法,需要安卓7以上才行

如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:

var b = desc("打开侧拉菜单").findOne().bounds();
click(b.centerX(), b.centerY());
// 如果使用root权限,则用 Tap(b.centerX(), b.centerY());

有一些APP的组件,它们的id、text、desc等节点值是空值。className值又不是页面上唯一的。
还有的组件id是动态变化的。可以尝试下面几种方法:

  • 寻找父组件。如果该组件的父组件,或者爷组件存在固定的id、text、desc,就先定位到父组件,然后使用find()函数遍历父组件的子组件。最后通过className、depth、组件的索引等来判断是否为指定的组件。

  • 寻找子组件。如果该组件的子组件,或者孙组件存在固定的id、text、desc,就先定位到子组件,然后使用parent()函数获取父组件对象。最后通过className、depth、组件的索引等来判断是否为指定的组件。

  • 寻找兄弟组件。如果该组件的兄弟组件存在固定的id、text、desc,就先定位到兄弟组件,然后使用parent()函数获取父组件对象。接下来使用find()函数遍历父组件的子组件。最后通过className、depth、组件的索引等来判断是否为指定的组件。

mitmproxy

使用AutoJs自动化操作后,是可以让手机自动化了,但是怎么抓取数据呢,这里使用mitmproxy是最快的。

环境配置

安装:pip3 install mitmproxy

终端输入 mitmproxy

AutoJs+mitmproxy App爬虫_第5张图片


➜  ~ cd ~/.mitmproxy
➜  .mitmproxy ls
config.yaml           mitmproxy-ca-cert.pem mitmproxy-dhparam.pem
mitmproxy-ca-cert.cer mitmproxy-ca.p12
mitmproxy-ca-cert.p12 mitmproxy-ca.pem

可以在如下位置找到证书,然后安装。

手机在wifi处配置完成后打开mitm.it,下载安装信任证书即可。

数据获取

编写脚本script.py

import json
import os

from mitmproxy.http import flow

def response(flow: flow):
    print(flow.request.url, flow.response.text)

if __name__ == '__main__':
    os.system("mitmdump -s script.py")

安卓7问题

出于网络安全的角度考虑,默认情况下,面向 Android 7.0 的应用开始只信任系统提供的证书(system),且不再信任用户添加的证书(user)。

为了解决这个问题,需要Xposed+JustTrustMe去解决,否则网络不同。所以手机必须root。

详细教程,参考已root的安卓+XPosed+JustTrustMe破解ssl pinning

实战项目

参考使用Auto.js软件制作的脚本合辑,有大量实战丰富的项目,阅读原文即可

你可能感兴趣的:(AutoJs+mitmproxy App爬虫)