做了款安卓软件,能将对 API 的调用转化为对手机的操作,软件自身提供 restful API

2021-03-06 23:24:42 +08:00
 Austin2035

做 APP 爬虫时,我们通常使用 APP 抓包的方法来来获得接口路径,进而请求数据。遇到复杂的签名,可能还需要做安卓逆向来破解。

当然,我们也可以选择使用 Appium + mitmdump 来进行爬取。mitmdump 没问题,很稳定,挂着即可。但是 Appium 过于笨重,操作缓慢,开发不便,稳定性欠佳。而 Airtest 看起来也是个不错的选择,事实上确实如此。可是,我就爬个 APP,Airtest 是不是太重了?

那么,有没有一款软件,运行在安卓,通过接收 restful API 请求,进而转化为对设备的操作呢?而且它不依赖 ADB,甚至不需要 root 权限。答案是有的,它就是 Hermit,一切操作均在安卓端完成,对外只提供一个 API 。

Hermit,是一款用于安卓自动化测试的安卓软件,安装包仅有 2.8MB 。具有一系列的操作能力,譬如,通过无障碍 /root 的方式,点击,滑动、设置与读取剪切板信息(支持中文)等操作,同样,它也自带了一个布局分析器,类似 Android Studio 的 LayoutInspector,可以分析界面层次和范围、获取界面上的控件信息,进而方便点击、滑动等操作。

由于 Hermit 只提供 API,所以我们可以用喜欢的语言直接调用 API,通过发送 GET 、POST 之类的请求来控制手机。

我们可以基于 Hermit 的 API 来制作一个 python 模块,导入模块后直接调用函数,即可操作手机。而这个模块我已经做好,并将其取名为 pyhermit,如果您喜欢 Java,您可以封装一个库并叫做 Jermit 等。以此类推,可以有 Germit 、Cermit 等等。

它有哪些优点?

  1. 开源,体积小,轻量级

  2. 支持通过 root 与无障碍两种方式操控手机。

  3. 支持所有主流语言控制手机,二次开发方便。

  4. 自带界面分析工具,开发自动化测试,轻轻松松。

  5. 能通过次序来点击具有相同属性的一组控件,例如屏幕中出现多个关注按钮的时候。

基于无障碍的功能

  1. 坐标点击
  2. 坐标滑动
  3. 根据控件 id 的点击(如有多个相同 id,可根据次序点击)
  4. 根据控件 text 的点击(同上,可根据次序点击)
  5. 根据控件 content-desc 的点击
  6. 查看屏幕截图
  7. 模拟输入功能(支持中文)
  8. 九大全局功能(返回、按下 home 键、最近任务、显示通知、快速设置、长按电源键、分屏、锁屏、截屏)
  9. 实时获取界面控件详细信息

基于 Root 的功能

  1. 坐标点击
  2. 坐标滑动
  3. 屏幕截图
  4. 申请并判断 root 权限
  5. 发送任意 keyevent
  6. 长按坐标
  7. 根据包名启动 APP

获取设备信息能力

  1. 获取、设置剪切板内容(支持中文)
  2. 设备屏幕长宽
  3. CPU 最大、最小、实时频率
  4. CPU 名
  5. 内存总量、可用量
  6. 存储总量、可用量
  7. 所有安装的包名
  8. 设备语言、系统版本号、手机型号、手机厂商

之前在社区发过第一版,但是还不太成熟,第二版相较于第一版有了很大的提升,感兴趣的朋友可以玩玩。

文档地址: https://www.lookcos.cn/docs/hermit
Github: https://github.com/LookCos/hermit

2185 次点击
所在节点    程序员
14 条回复
Origami404
2021-03-07 09:58:05 +08:00
看起来很好用,已 star 。等有空了好好研究一下
Austin2035
2021-03-07 10:00:00 +08:00
@Origami404 感谢支持,可随时联系我,共同交流技术。
gladuo
2021-03-07 11:30:59 +08:00
很有意思很轻量
ilotuo
2021-03-07 12:41:34 +08:00
一直很好奇灰产(薅羊毛之类) 大佬们用的是什么脚本. airtest 应该最容易实现, 但是 airtest 出来之前就有这些灰产, 那他们用啥最快实现?
Austin2035
2021-03-07 13:12:18 +08:00
@gladuo 是的 的确挺轻量
Austin2035
2021-03-07 13:12:41 +08:00
@ilotuo 可能是 auto.js 之类,亦或者是用抓包,提交请求这种方式。
teawithlife
2021-03-07 14:27:13 +08:00
试用了一下,挺不错
/image/screen 接口没测试成功
返回 Failed resolution of: Landroid/accessibilityservice/AccessibilityService$TakeScreenshotCallback;
/viewer 调用了上面的接口,所以也没法用

另外 /action 接口的文档写的不是很清楚, /action/1 这样是不对的,需要 /action/back 才对,我是翻了 python 的代码才找到用法的
teawithlife
2021-03-07 14:28:47 +08:00
建议文档中写一些 curl 调用的示例,这样测试起来也方便
Austin2035
2021-03-07 17:06:21 +08:00
@teawithlife 非常感谢你的反馈,我会改进一下的
devliu1
2021-03-07 23:11:58 +08:00
@lookcos server 里各种 Map.put 建议改进一下
Austin2035
2021-03-08 11:12:40 +08:00
@devliu1 谢谢建议,本人 Java 新手,见谅
unco020511
2021-03-08 11:23:21 +08:00
看了下文档已 start,作者是个二本在校生,不错不错
Austin2035
2021-03-08 11:44:29 +08:00
@unco020511 哈哈,感谢支持。
wzw
2021-11-27 07:32:02 +08:00
@lookcos 操作 微信 会不会被封

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX