Fork me on GitHub

AutoJs+mitmproxy App爬虫

AvLewa

1
这是崔斯特的第一百二十一篇原创文章

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在酷安中已经被下架了

3GXey8

非官方文档中有下载地址

使用

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

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

  1. 无障碍
  2. 悬浮窗
  3. 远程调试

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

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

基础操作

打开应用

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

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

1
2
3
4
5
6
7
➜ ~ 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}

点击按钮

打开悬浮窗的第三个按钮

lV5Mco

mwo1cW

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

hRDvgZ

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

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

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

1
2
3
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

3AD4iU

1
2
3
4
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

1
2
3
4
5
6
7
8
9
10
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