JavaScript 自动化软件:AutoX.js

时间:2024-11-17 07:29:05
            <div id="content_views" class="htmledit_views" deep="6">
                <p></p> 

官网文档:http://doc.autoxjs.com/#/documentation
autojs 教程、demo 集合:https://github.com/wiatingpub/autojs

autojs app 自带的教程,看完就差不多了

关键字:安卓自动化、手游辅助

1、官网文档

Auto.js 简介

Auto.js 本身是一个 app,但是可以用来开发脚本,开发的脚本还可以打包成 apk 进行安装。

autojs 有什么优点?为什么推荐?

  • 无需 root 而是基于无障碍服务。为啥强调无需 root,因为 root 刷机本身是存在风险的,无需 root 就代表着远离风险。剩下的就是需要一台安卓手机,然后懂点 js 就可以了。
  • 上手简单,通过学习 Auto.js 内置的教程,就能写出很多有趣的脚本。这是因为 Auto.js 虽然依托于 JS 语言,却做了很多封装。
  • 支持打包,可以将脚本打包成 apk 文件,这一点对不爱折腾的小伙伴来说,简直是福音。

Auto.js 由 hyb1996 于 2017/01/27 初次发布,于 2020/03/13 停止维护,最终版本名称为 4.1.1 Alpha2,构建版本号为 461。autojs 这么屌为什么会被下线,因为 Auto.js 被大面积的用于灰产,被某些资本警告,导致该工具无法对某些应用进行操作 ( 例如:微信、支付宝、抖音 等 )。4.1 版本是免费版的最后一个版本,可以在所有 app 上进行操作。后来作者推出收费版的  Auto.js Pro,虽说增加了一些功能,但是屏蔽了很多主流应用,属于阉割版。

  • 4.1版本 功能与 pro 几乎无差别,下载地址:https://www.wuyunai.com/docs/
  • Autox.js 是在原 4.1版本 基础上 fork 而来,可操作所有软件,并拥有大量 autojs pro 的功能:https://github.com/kkevsekk1/AutoX

基于 Auto.js 二次开发的开源项目 (仅部分列举):

项目名称 应用名称 开发者 开发时间
Auto.js Auto.js M TonyJiangWJ 2019/11/21
AutoX Autox.js / Autox.js v6 kkevsekk1 2020/07/24
AutoJs6 AutoJs6 SuperMonster003 2021/12/01

其他类似软件

  • 一触即发:http://www.yicuba.com/index.html
    蓝奏网盘:https://bgg.lanzoui.com/b02bsrsah
  • 点击助手Pro:https://www.ghxi.com/djzs.html
  • Hamibot:类似 autojs 的自动化工具,可以通过浏览器远程控制。适用于安卓系统的自动化工具,能全自动操控任意 APP。hamibot 需要注册账号:https://hamibot.com/
            Hamibot 连接手机:https://www.i3zh.com/22556.html
  • 冰狐智能辅助 (类似 Autojs,比 autojs 简单,需要注册账号):https://aznfz.com/
  • Ctrl.js 开发文档:https://ctrljs.ikaiwei.com/ctrljsapi/#/
    Ctrl.js ( 类似auto.js ):http://www.feiyunjs.com/2266.html
  • EasyClick 和Auto.js区别:http://www.feiyunjs.com/2456.html
    EasyClick 开发文档:http://ecdoc.laoleng.vip/docs/

AutoX.js 的功能

  •  AutoX.js 项目工程化:结合 webpack vscode 插件,开发、编译、打包、部署、混淆、加密一体化 文档资料
  •  vscode 插件右键,自动提示操作等 下载地址
  •  vscode 自动补全、方法注释等 文档资料
  •  修复众多 bug,升级到 5.0.1 ,合并打包插件,升级配置文件等功能
  •  建设论坛, 提供 交流社区
  • 支持 WebSocket

安装 AutoX.js

  • 手机安装 AutoX.js 应用
  • 开启手机无障碍服务,目的是为了让脚本能执行。
  • 开启悬浮框(为了查看控件信息)

配置 开发 环境

AutoX.js 使用 JavaScript 作为脚本语言,目前使用 Rhino 1.7.13 作为脚本引擎,支持 ES5 与部分 ES6 特性。

  • 学习 AutoX.js 的 API 之前,建议先学习 JavaScript 的基本语法。
  • 如果想要在电脑上开发 AutoX.js,可以使用 VSCode 以及 AutoX.js 插件
  • 如果想要使用 TypeScript 来开发,目前有开发者公布了一个 相关工具
IDEA

在安卓手机上安装 Auto.js app

在 IDEA 安装插件 autojsx.WIFI。地址:https://github.com/zimoyin/Autojsx.WIFI

在 Pycharm 连接到 Auto.js app 的插件服务器,确保设备和 IDEA 之间的双向通信

使用 IDEA 推荐使用专业版,在 IDEA 的插件中心找到,搜索名称为 Autojsx.WIFI
创建项目,有两种方式,分别为 SDK项目项目组

  • 在 Autojsx 项目内右键项目可以创建子项目。它会创建一个 autojs 原生编写方式项目。在 SDK和项目组都可以使用。
    子项目的文件结构:
            resources:插件的资源
            lib:存放开发时的sdk用于api提示,其他js也可以放在这里,但是不要放进sdk文件夹
            src: 存储js代码
    他们在运行和上传项目时会打包到一起,如果你在src想引起其他两个文件夹的资源,请指定路径为根路径(./test.text)而不是带着文件夹名称路径(./resources/test.text)
  • 关于控制台,位置在 IDEA 新UI的左侧,旧 UI 的下侧。
  • 如何运行项目。
    点击右上角运行按钮(新UI在run菜单下) 或者 右键你打开的脚本 或者 在Autojs菜单里面找运行项目 或者 控制台中单击运行项目。运行项目前你需要打开服务器,如果没有打开当你点击运行的时候会默认打开,默认端口为 9317 是Autojsx 的默认端口,如果你没填那么就是这个
    通过 Tool -> Autojs -> 修改端口/修改IP 可以更改
  • 如何上传运行: 右键文件夹、右键你打开的脚本、在Autojs菜单里面找保存

VSCode

Auto.js-Autox.js-VSCodeExt:https://marketplace.visualstudio.com/items?itemName=aaroncheng.auto-js-vsce-fixed

这里直接使用 VSCode 和 AutoX.js 插件进行开发。安装好 VSCode 和 AutoX.js 插件后,VSCode 打开 命令面板 ( Ctrl + shift + p ),输入 autoxjs 即可看到 插件支持的命令

找到 start server 点击即可启动服务。然后手机上打开悬浮窗并连接电脑。至此环境配置成功,现在就可以在 vscode 上编写并运行,手机就会相应执行脚本。也可以直接在手机的 Auto.js 应用中直接码代码,不过那酸爽谁用谁知道。。。

示例脚本:

示例:


 
 
  1. // 购物车按钮的id
  2. const carId = id( 'com.yaya.zone:id/rl_car_layout');
  3. // 控制台与手机弹窗输出 toastLog autox.js 全局函数,请查看官方文档
  4. //控件是否存在
  5. toastLog( '控件是否存在:'+carId. exists())
  6. //搜索到唯一元素并点击
  7. carId. findOnce(). click()

使用如下代码可以直接跳转到APP内的某个页面


 
 
  1. // 这样启动没有广告,有点android开发经验,贼爽
  2. app. startActivity({
  3. action: "android.intent.action.VIEW",
  4. className: "com.yaya.zone.home.HomeActivity",
  5. packageName: "com.yaya.zone",
  6. });

className 与 packageName 查看方法:MT管理器 -> 左上角菜单->Activity记录

Node.js(第二代API)对比 Rhino(第一代API)的优势是:

  • Node.js引擎的JavaScript执行性能是Rhino的100倍以上
  • 使用Node.js引擎的代码加密强度高,目前不能被还原
  • Node.js支持ES2021以上语言标准,Rhino仅支持ES5和部分ES6特性
  • Node.js引擎本身的Bug基本很少,而Rhino引擎的模块系统、语言实现本身有不少Bug
  • Node.js对应的第二代API设计较好、更加标准
  • 可以使用第三方npm包
  • Node.js的网络资料较多

Node.js(第二代API)对比 Rhino(第一代API)的劣势是:

  • Node.js对应的第二代API上手门槛较高,需要对Promise、异步有一定了解,尤其对新手来说
  • 第二代API的文档阅读较难,并且目前正在完善中
  • Rhino和第一代API的社区的源码、资料、示例较多
  • 第一代API使用上比较方便

如何 选择 引擎

  • 如果你是没有编程基础的新手,并且不想深入学习编程,代码能跑就行,不追求可维护性、可读性,不追求最新语言标准,能容忍引擎、API设计本身有不符合标准的地方和bug,那么可以使用Rhino引擎和第一代API,上手较快。无需特别配置,代码默认都以该引擎执行。
  • 如果追求性能和深入了解,则使用 Node.js 引擎和第二代API,对Rhino引擎和第一代API了解即可。

引擎的选择并非绝对,可以一边使用Rhino引擎一边使用Node.js引擎,或者在学习一段时间后再看另一个引擎/API。

打包成 apk

使用 autox.js 打包成 app,打包的软件报毒,这个问题是因为打包后的app用了 autojs 作为包名,需要用MT管理器把apk 的xml中的autojs字符串换成任意其他值就可以了。

autojs 打包的软件报毒:https://zhuanlan.zhihu.com/p/425140138

权限 设置

示例:申请截图代码


 
 
  1. if (! requestScreenCapture()) {
  2. toastLog( "请求截图权限 失败");
  3. } else {
  4. toastLog( "请求截图权限 成功");
  5. }
'
运行
运行

执行以上代码后, 正常应该弹出一个框, 让用户选择是否允许截图。但是有的时候, 不会弹出这个界面,这个时候就要去 设置-->应用管理-->AutoJsPro-->权限管理-->后台弹出界面-->允许

悬浮窗权限。

判断是否有悬浮窗权限的代码

floaty.checkPermission();

返回一个布尔值, true就是有权限, false就是没有权限

如果app没有悬浮窗权限,提示用户,然后跳转悬浮窗权限设置界面, 方便用户勾选

跳转悬浮窗权限设置界面代码


 
 
  1. app. startActivity({
  2. packageName: "com.android.settings",
  3. className: "com.android.settings.Settings$AppDrawOverlaySettingsActivity",
  4. data: "package:" + context. getPackageName(),
  5. });

后台自启权限,跳转启动管理页面的代码


 
 
  1. let intent = new Intent();
  2. intent. addFlags( Intent. FLAG_ACTIVITY_NEW_TASK);
  3. let pkg = "com.huawei.systemmanager";
  4. let cls = "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity";
  5. let componentName = new android. content. ComponentName(pkg, cls);
  6. intent. setComponent(componentName);
  7. context. startActivity(intent);

常见问题

如何定时运行脚本

  • 点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

定时任务如何获取外部参数

  • 如果一个脚本是用intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。

如何把图片和脚本一起打包,或者打包多个脚本

  • 如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。
    点击Auto.js的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。
    例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

如何使打包的应用不显示主界面

  • 需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:
    "launchConfig": {
        "hideLogs": true
    }
    例如:
    {
      "name": "项目名称",
      "versionName": "1.0.0",
      "versionCode": 1,
      "packageName": "org.autojs.example",
      "main": "main.js",
      "launchConfig": {
          "hideLogs": true
      }
    }
    "launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
    参见项目与项目配置。

Auto.js自带的模块和函数中没有的功能如何实现

由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。调用 Android 和 Java 的 API 参见 Work with Java

例如:旋转图片的Android代码为:


 
 
  1. import android.graphics.Bitmap;
  2. import android.graphics.Matrix;
  3. public static Bitmap rotate (final Bitmap src,
  4. final int degrees,
  5. final float px,
  6. final float py) {
  7. if (degrees == 0) return src;
  8. Matrix matrix = new Matrix();
  9. matrix.setRotate(degrees, px, py);
  10. Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
  11. return ret;
  12. }

转换为JavaScript的代码后为:


 
 
  1. importClass(android. graphics. Bitmap);
  2. importClass(android. graphics. Matrix);
  3. function rotate( src, degrees, px, py){
  4. if (degrees == 0) return src;
  5. var matrix = new Matrix();
  6. matrix. setRotate(degrees, px, py);
  7. var ret = Bitmap. createBitmap(src, 0, 0, src. getWidth(), src. getHeight(), matrix, true);
  8. return ret;
  9. }

autojs 常用功能整理

https://github.com/snailuncle/autojsCommonFunctions/blob/master/autojsCommonFunctions.js


 
 
  1. // //导入模块
  2. // function 导入常用函数模块(){
  3. // var url='https://raw.githubusercontent.com/snailuncle/autojsCommonFunctions/master/autojsCommonFunctions.js'
  4. // var r = http.get(url)
  5. // log("code = " + r.statusCode);
  6. // var html=r.body.bytes()
  7. // files.write('./autojsCommonFunctions.js','')
  8. // files.writeBytes('./autojsCommonFunctions.js',html)
  9. // var common=require('./autojsCommonFunctions.js')
  10. // return common
  11. // }
  12. // var common=导入常用函数模块()
  13. // log(common)
  14. // for(let i=0;i<33;i++){
  15. // common.闪光弹('fire in the hole')
  16. // }
  17. let func_list = [
  18. '点击控件',
  19. '铃声',
  20. '启动app',
  21. '停止app',
  22. '卸载app',
  23. '卸载app没root',
  24. '清除app数据',
  25. '启动最新安装的app',
  26. '停止最新安装的app',
  27. '卸载最新安装的app',
  28. '清除最新安装的app数据',
  29. '静默安装app',
  30. '获取app图标',
  31. '控制app联网',
  32. '获取手机上所有的app名字',
  33. '点击输入框弹出输入法',
  34. '使所有输入框点击时都能弹出输入法',
  35. '失去焦点',
  36. '是否root',
  37. '获取指定应用的版本号',
  38. '打开qq群名片',
  39. '打开qq名片',
  40. 'qq强制聊天',
  41. '字节变为gbk中文',
  42. '最新安装的app',
  43. '文件修改时间',
  44. '文件大小',
  45. '字符串变字节',
  46. '日期加N天',
  47. 'md5',
  48. '是横屏还是竖屏',
  49. '截图',
  50. '随机字符',
  51. '获取时间',
  52. '调整手机音量',
  53. '微信扫一扫',
  54. '公共字符串',
  55. '网络',
  56. '安卓intent源码',
  57. '获取手机ip地理位置',
  58. '替换系统文件',
  59. '编辑距离',
  60. '数组交集',
  61. '提取包含关键字的app',
  62. '获取页面所有文字',
  63. '悬浮控制',
  64. '闪光弹',
  65. '打开开发者选项',
  66. '气泡',
  67. '随机字符串',
  68. 'wifi状态',
  69. '开关飞行模式',
  70. '上滑',
  71. '获取deflate网页内容',
  72. '获取gzip网页内容',
  73. '发送通知',
  74. '去除通知',
  75. 'clickAttr',
  76. 'pressAttr',
  77. '获取拼音',
  78. '画出控件区域',
  79. '获取多开分身右侧字母区域控件',
  80. '画矩形',
  81. '画点',
  82. 'strip', // 去除头尾空格
  83. '大数组包含小数组',
  84. 'getObjType',
  85. 'deepCopy', // 深拷贝
  86. '反色',
  87. 'bmob上传文件',
  88. 'bmob下载文件',
  89. '过微信QQ滑块',
  90. '确保有jar文件',
  91. '获取QQ收藏内容',
  92. '获取多开分身右侧字母区域指定字母的位置',
  93. '模拟真人滑动',
  94. '画手势',
  95. ]

示例:领取淘宝喵币

打开淘宝 ---> 点击领喵币按钮

为了编写脚本简单,淘宝预先打开喵铺主页


 
 
  1. auto. waitFor()
  2. let app_name = "微信";
  3. launchApp(app_name);
  4. sleep( 10000);
  5. // 根据 "文字信息" 寻找按钮, 并点击
  6. let btn_1 = text( "用短信验证码登录"). findOnce();

相关文章