Auto.js是一个不需要 Root 权限的,基于JavaScript开发的app自动化软件工具,使用这款软件工具,可以帮助我们在手机上完成一些自动化的操作,非常实用。
autojs可以干嘛?
- 基本操作,比如安装、卸载 、启动、停止APP,切换网络模式、自动打开网址等;
- app轰炸机,也就是自动不断的给某个人发消息;
- app自动收取能量;
- app自动签到;
- app自动刷金币;
- app自动养号;
再结合taskerv定时工具 ( 关注我的公众号,发送 taskerv, 可以自动免费获取 taskerv5.15软件 ),完全可以解放双手,完成app上的自动化操作;
auto的特性有哪些?
1.不需要root权限,可以通过android的无障碍设置,完成开发,适用性广;
2.不仅支持坐标和按图按色查找,是基于整整的androidview属性id等来定位控件,可以适配多种机型
3.基于javascript语言开发,简单快捷,同时也可以调用java代码
4.支持vscode调试,pc编写代码,模拟器运行等,方便开发
auto环境开发需要工具?
- autojs软件 4.1.1a Alpha2-armeabi-v7a-release,
因避免技术被过度使用,autojs作者已经下架4.1版本,当前是8.0或9.0版本避免用于主流软件
(关注我的公众号,回复autojs, 可以自动免费获取 autojs软件 4.1.1a Alpha2 和 打包插件)
2. vscode,安装autojs插件
(关注我的公众号,回复autojs, 可以自动获取 autojs软件 4.1.1a Alpha2 和 打包插件)
3. 下载主流任意一款模拟器:mumu模拟器/雷电/夜神
autojs查找控件的基本思路
- 1. depth-desc-id-classname等控件的常规的唯一属性
- 2. findone.parent().child(xx)等控件的父子依存顺序关系
- 3. 最后实在无法确定可用坐标法bounds,click(x,y)操作控件
autojs代码实践
实现app自动打卡,点击,按图查找等,有封装成函数可以直接拿来使用
//获取autojs版本信息
function get_autojs_info(){
var vername = app.autojs.versionName;
var varcode = app.autojs.versionCode;
var aupkname = getPackageName("Auto.js");
log("autjs版本:"+vername);
log("autjs版本号:"+varcode);
log("autjs pkname:"+aupkname); //org.autojs.autojs
var inlog = shell("pm path "+aupkname);
log("autojs路径:"+ inlog.result)
}
//关闭应用程序
function closeCurrentPackage() {
// 可以稍加修改,关闭指定app
let packageName = currentPackage();//当前app包名 com.xxx.xx
app.openAppSetting(packageName);
text(app.getAppName(packageName)).waitFor();
var cflag = className("android.widget.TextView").text("结束运行").findOne().parent().click()
toastLog("cflag:"+cflag)
var surefalg = className("android.widget.Button").text("确定").findOne().click()
toastLog("surefalg:"+surefalg)
if(surefalg){
log(app.getAppName(packageName) + "应用已被关闭");
}else{
log(app.getAppName(packageName) + "应用不能被正常关闭或不在后台运行");
}
customSleep(1)
back()
}
//区域找图点击
function find_pic_click(p){
temp1 = images.read(p)
img1 = captureScreen()
p1 = findImage(img1, temp1,
{
//region: [60, 200, device.width-60, 1423-200],
threshold:0.5
}
)
if(p1){
log("找到了"+p+":"+p1.x+":"+p1.y)
click(p1.x+temp1.getWidth()/2,p1.y+ temp1.getHeight()/2)
sleep(100)
return true;
}else{
log("没找到:"+p);
return false;
}
}
下面是一个完整的实现飞书自动打卡的autojs脚本,可以拿来即用:
auto.waitFor()
setScreenMetrics(1080, 1920);
//程序启动入口
Unlock()
main_feishu_qiantao();
closeCurrentPackage();
engines.myEngine().forceStop();
exit();
//解锁
function Unlock(){
if (device.isScreenOn()) {
return
}
//点亮屏幕
device.wakeUp();
swipe(device.width/2, device.height*1/7, device.width/2, device.height*7/8, 1000);
sleep(1000);
//滑动屏幕解锁
swipe(device.width/2, device.height*7/8, device.width/2, device.height*1/7, 1000);
//根据自己密码进行调整
// click(821, 883);sleep(500);
// click(544, 614);sleep(500);
// click(538, 878);sleep(500);
// click(810, 1131);sleep(500);
// click(558, 1414);sleep(500);
// click(542, 1150);sleep(500);
back()
back()
back()
home()
sleep(1000);
}
//飞书打卡
function main_feishu_qiantao(){
launchApp("飞书");
var kuakle_name = getPackageName("飞书")
log("飞书包名:"+kuakle_name)
text("消息").waitFor();
//点击工作台
if(id("app_center_tab").exists() && id("app_center_tab").findOne().click()){
log("点击-工作台,成功");
}else{
log("点击-工作台,失败");
}
//customSleep(2)
//text("工作台").waitFor();
// 请求截图
if(!requestScreenCapture()){
toastLog("请求截图失败");
exit();
}
//找到打卡并且点击
var x=0,y=0
try {
id("recycler").findOne().children().forEach(child=>{
var target = child.findOne(id("name"))
//log(target.text())
if(target.text() && target.text()=="打卡"){
if(x==0 && y==0){
x = target.bounds().centerX()
y = target.bounds().centerY()
throw Error()
}
log(target.bounds().centerX(), target.bounds().centerY());
}
})
}catch(error){
//log(error)
}
if(x>0 && y>0){
log("找到打卡成功",x,y)
click(x,y)
}else{
log("找到打卡失败");
}
//点击打卡&确认
// var daka_img="./打卡.png";
// find_pic_click(daka_img)
// if(click(666,343)){
// log("工作台-点击成功")
// }else{
// log("工作台-点击失败")
// }
customSleep(5)
var waqin_daka_img="./外勤打卡3.png";
find_pic_click(waqin_daka_img)
var waqin_daka_img="./外勤打卡3.png";
find_pic_click(waqin_daka_img)
customSleep(2)
}
//区域找图点击
function find_pic_click(p){
temp1 = images.read(p)
img1 = captureScreen()
p1 = findImage(img1, temp1,
{
//region: [60, 200, device.width-60, 1423-200],
threshold:0.5
}
)
if(p1){
log("找到了"+p+":"+p1.x+":"+p1.y)
click(p1.x+temp1.getWidth()/2,p1.y+ temp1.getHeight()/2)
sleep(100)
return true;
}else{
log("没找到:"+p);
return false;
}
}
//控件的click()无法点击, 点击控件的中心
function click_by_bounds(){
//获取这个控件
var widget = id("xxx").findOne();
//获取其中心位置并点击
click(widget.bounds().centerX(), widget.bounds().centerY());
//如果用root权限则用Tap
}
//关闭应用程序
function closeCurrentPackage() {
// 可以稍加修改,关闭指定app
let packageName = currentPackage();//com.quakr.browser
//log(packageName)
app.openAppSetting(packageName);
text(app.getAppName(packageName)).waitFor();
var cflag = className("android.widget.TextView").text("结束运行").findOne().parent().click()
log("结束运行?:"+cflag)
customSleep(2)
var surefalg = className("android.widget.Button").text("确定").findOne().click()
log("确认关闭:"+surefalg)
if(surefalg){
log(app.getAppName(packageName) + "应用已被关闭");
}else{
log(app.getAppName(packageName) + "应用不能被正常关闭或不在后台运行");
}
customSleep(1)
back()
home()
}
function customSleep(mtime){
sleep(mtime*1000);
}
运行步骤:
- android安装autojs4.0软件(不要用最新版本,最新版本已经屏蔽主流软件操作);2.给手机设置无障碍权限;3在autojs运行上面脚本;
autojs还可以支持http,websocket网络请求;文件File读写;多线程编程协作;UI可视化组件等,后面会继续出更多教程内容
资源:
autojs官方文档:https://pro.autojs.org/docs/#/zh-cn/
autojs开源项目:https://github.com/hyb1996/Auto.js
(关注我的公众号,回复 taskerv, 自动免费获取 taskerv5.15软件 )
(关注我的公众号,回复 autojs, 自动免费获取 autojs软件 4.1.1a Alpha2 和 打包插件)
欢迎关注我的微信公众号:Redboy洗碗君,一个喜欢分享编程技巧,工具软件,记录生活所思所考的洗碗君