官网

https://pro.autojs.org/docs/#/zh-cn/

什么是 auto.js

通过无障碍操作手机实现自动化功能

运行环境搭建

  • 插件安装

搜索 hyb1996 打开 vscode 的开发模式

  • 连接到手机

start server 然后 run

实例代码

// while(!click('扫一扫')); // 一直循环点击
// longClick("微信运动") ; // 长按
sleep(299)

// scrollUp(); // 向下滚动, 以最大滚动区域开始
// scrollDown(); // 向上滚动, 以最大滚动区域开始
// setText(0, '你好'); // 直接替换
// input(0, '你好'); // 往后输入
// text("微信")
// textStartsWith("微")
// text("微信").click();
// click('发送')
// className('android.wid.dfd').findOne().scrollUp(); // 获取到列表, 并且翻页
// className('android.wid.dfd').findOne().children(); // 获取到列表的子控件, 返回的集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

自动开启无障碍

importClass("android.content.pm.PackageManager");
importClass("android.provider.Settings");
const myPackageName = context.getPackageName();
if (!auto.rootInActiveWindow) {
    if (checkPermission("android.permission.WRITE_SECURE_SETTINGS")) {
        openAccessibility();
    } else {
        if ($shell.checkAccess("adb")) {
            shell("pm grant " + myPackageName + " android.permission.WRITE_SECURE_SETTINGS", {
                adb: true,
            });
            toastLog("adb授权成功");
            openAccessibility();
        } else {
            if ($shell.checkAccess("root")) {
                shell("pm grant " + myPackageName + " android.permission.WRITE_SECURE_SETTINGS", {
                    root: true,
                });
                toastLog("root授权成功");
                openAccessibility();
            } else {
                console.info("\n也可使用WRITE_SECURE_SETTINGS权限开启无障碍服务\n授权代码已复制,使用adb激活");
                setClip("adb shell pm grant " + myPackageName + " android.permission.WRITE_SECURE_SETTINGS");
                app.startActivity({
                    action: "android.settings.ACCESSIBILITY_SETTINGS",
                });
            }
        }
    }
}
function openAccessibility() {
    let mServices = ":" + myPackageName + "/com.stardust.autojs.core.accessibility.AccessibilityService";
    let enabledServices = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES).replace(new RegExp(mServices, "g"), "");
    Settings.Secure.putString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "");
    //Settings.Secure.putString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServices);
    Settings.Secure.putString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServices + mServices);
}http://192.168.162.69:8080

function checkPermission(permission) {
    pm = context.getPackageManager();
    return PackageManager.PERMISSION_GRANTED == pm.checkPermission(permission, context.getPackageName().toString());
}
setTimeout(()=>{
    log(auto.service)
},500)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

4.11 如果不能打包, 请安装打包插件

D:\视频\auto.js入门到实战视频教程\一Auto.js基础入门教程\【课件】Autojs脚本开发 基础入门\apk\4.1.1

用模拟器可以 root

共享文件夹, 雷电模拟器安装以及配置 6 集

autojs 链接方案

直接通过同一个网络下面的 ip 进行链接

click(文字)

longClick("微信")

滚动控件

向上滚动

setText 是重新设置

input 是后面追加

uiselector 可以链式调用

选择文字

通过 autojs 的层级进行查看, 选择到唯一的控件

对于没有文字的时候, 就通过 desc 或者其他的 uiselector 来进行选择

调试输出的话直接使用 log 就行

parent.parent, 直到找到可以点击的父控件 尝试下循环调, 直到找到可以点击的父控件

通过 text 找到, 然后里面有一个 bounds 拿到坐标信息, 再用 click 去点击

  • 整理以文件开头 textStartsWith

textStartsWith("飞蚂蚁")

1 设置分辨率一样 2 press x, y, 长按的毫秒数 3 s wipe( x1, y1, X2, y2) gestures)))

// "ui";

// ui.layout( // // )

//

// home()

// sleep(1000); // click("微信");

// sleep(1000); // longClick("华研外语") // sleep(1000); // click("不再关注") // sleep(1000); // click("不再关注")

// while(!click("意尔康")) { // scrollDown() // } // toast("找到了")

// home(); // sleep(1500) // toast("返回首页了") // className("android.widget.TextView").findOne().click();

// log(className('android.widget.TextView').find())

// let data = className("android.widget.TextView").text("文件管理").findOne().bounds() // toast("执行了")

// let res = className('android.view.View').text("中国建设银行").findOne(100).click();

// id("hg4").className("android.view.View").text("中国建设银行").findOne().parent().click()

// click("育苗通") // longClick("我的印象笔记") // sleep(300) // click('不再关注'); // sleep(300) // click('不再关注');

// let bounds = textStartsWith("飞蚂").findOne().bounds(); // click(bounds.centerX(), bounds.centerY());

// setText("")

// scrollDown() // let res = className('android.widget.LinearLayout').id("com.tencent.mm:id/bth").find() // res.forEach(item=>{ // item.click(); // sleep(2000); // back(); // sleep(2000); // })

// let res = className('android.widget.TextView').id("com.tencent.mm:id/hg4").find() // res.forEach(item=>{ // click(item.text()); // sleep(2000); // back(); // sleep(2000); // })

// .get(

// 写一个自动延迟操作的方法 function s(fn) { sleep(200); fn(); return this; }

// // 寻找微信 // home();

// sleep(200)

// click("微信")

// scrollDown();

// let res = className('android.widget.TextView').id("com.tencent.mm:id/hg4").find() // res.forEach(item=>{ // click(item.text()); // sleep(2000); // back(); // sleep(2000); // })

// for(var i = 0; i<100; i++){ // let res = className("android.widget.LinearLayout").find().get(30).longClick(); // sleep(1500); // click("不再关注"); // sleep(1500); // click("不再关注"); // sleep(1500); // }

/** 删除公众号 */

// while(true){ // let res = className("android.widget.TextView").id("com.tencent.mm:id/aip").find() // res.forEach(item=>{ // var text = item.text() // longClick(text) // sleep(200); // click("不再关注"); // sleep(300); // click("不再关注"); // sleep(1500); // }) // }

// 判断颜色相似 // colors.isSimilar('#000', '#001')

// var img = images.read('./1.jpg'); // // 回收 // img.recycle();

// // 截屏 // var img = captureScreen();

// 读取文件的路径是在脚本里面 // var img = images.read('./1.jpg');

// 读取网络图片 // var img = images.load("https://3.png") // // 保存图片 // img.saveTo('/sdcard/1.png'); // // 复制图片 // images.copy(img); // 获取宽度 // img.getWidth(); // 获取图片在100, 100的颜色 // let c = image.pixel(100, 100) // colors.toString(c)

// click("立即开始")

// if(!requestScreenCapture()){ // toast("获取截图权限失败") // }

// var screen = images.captureScreen();

// var img = images.clip(screen, 0, 0, 1000, 1000); // img.saveTo('/sdcard/脚本/1.jpg')

// 封装截取图片的函数

// function getImg(x1, y1, x2, y2) { // if(!requestScreenCapture()){ // toast("获取截图权限失败") // } // var screen = images.captureScreen(); // var img = images.clip(screen, x1, y1, x2-x1, y2-y1); // img.saveTo('/sdcard/脚本/1.jpg') // img.recycle(); // }

// // 自动获取截图授权 function autoCapture() { threads.start(function () { while (true) { if (text("立即开始").findOnce()) { text("立即开始").findOnce().click(); break; } else { sleep(300); } } });

if (!requestScreenCapture()) { toast("获取截图权限失败"); } } // requestScreenCapture(); // var screen = images.captureScreen(); // var img = images.clip(screen, 0, 0, 100, 100); // img.saveTo('/sdcard/脚本/1.jpg')

// // 找色

// while(true){ // var img = captureScreen(); // var point = findColor(img, "#f00", { // region:[], // 开始xy, 宽高 // threshold: 4 // 容差 // }) // }

// 等待有微信字样 // text("微信").waitFor(); // sleep(1000); // requestScreenCapture(); // var screen = images.captureScreen(); // var color = screen.pixel(100, 100);

// // 根据颜色找点 // var point = findColorEquals(img, '#f00');

// 多点查找

// // 第一个点的颜色, 相对于第一个点加宽度和高度后的颜色 // images.findMultiColors(img, '#f00', [[10, 30, '#f00'], [20, 50, '#fff']] ) // 找到之后返回的是第一个点的坐标

// 识别图片的位置是什么颜色

// var like = id("").finOne(); // sleep(100); // var x = like.bounds().centerX(); // var y = like.bounds().centerY();

// var img = captureScreen(); // if(images.detectsColor(img, '#dedede', x, y)){ // toast("没有点过赞") // }

// // 测试多点找色 // // 自动截图权限 // autoCapture();

// var img = captureScreen(); // let res = images.findMultiColors(img, '#ffff0000', [ [1, 0, '#ffff0000']] ) // // let color = img.pixel(117, 537)

// // console.log(images.toString(img.pixel(117, 537)))

// 打开app // app.launchApp("微信")

// 查看包名, 可以通过每个页面的控件, 选择包名即可

// 获取包名 // app.getPackageName("微信")

// // 查看文件 // app.viewFile('/sdcard/脚本/1.jpg'); // // 打开可以编辑的文件 // app.editFile('/sdcard/脚本/1.jpg'); // 卸载应用 // app.uninstall("com.tencent.mm")

// sleep(1000) // home() // sleep(1000) // home()

// 打开应用的设置页面, 里面可以卸载, 强行停止,清理内存等操作 // app.openAppSetting("com.tencent.mm") // app.openAppSetting(app.getPackageName("微信"))

// 打开路径 // app.openUrl("http://www.baidu.com")

// // 发送邮箱 // app.sendEmail([{ // email: '958112850@qq.com', // subject: 'test', // 主题 // text: "111"// 内容 // }])

// // 悬浮窗

// var w = floaty.window( // // ) // setInterval(()=>{}, 1000) // w.close() // 关闭

// // 修改

// ui.run(function(){ // // w.上id // w.text.setText("文本") // }) // w.exitOnClose(); //悬浮框关闭, 停止脚本 // w.setAdjustEnabled(true); // 设置是否可以调整 // w.setPosition(x,y) // 设置位置

// shift + f5 停止脚本

// setSize(-1 , -1) // 占满全屏

// ui输入框

//

// exit() // 停止脚本

// 获取当前包名 // var packageName = currentPackage();

// var activity = currentActivity(); // 获取当前页面的标识 // 可以直接通过activity跳转到想要跳转的页面

// waitForActivity("activity标识") // 判断是否到了某一个页面

// sleep(1000) // var activity = currentActivity(); // 获取当前页面的标识 // waitForActivity("com.tencent.mm.ui.LauncherUI", 500); // toast("daole")

// waitForPackage("包名")

// 设置剪切板的内容 // setClip(text)

// 获取剪切板内容 // getClip()

// 粘贴 // paste(); // 控件的粘贴 // id("com.tendf").findOne().paste();

// 返回 0-1之间的小数 // random() // random(0, 100); // 返回0到100之间的随机数

// 随机点击桌面上面的图标

// let icons = className("android.widget.TextView").find(); // let randIndex = random(0, 10); // let icon = icons.get(randIndex).bounds() // click(icon.centerX(), icon.centerY());

// // 156 自习室 // home(); // sleep(200); // app.launchApp("微信");

// // 等待微信弹出 // text("微信").waitFor();

// click("发现"); // sleep(1000); // click("小程序"); // // sleep(1000); // toast('0000') // click("两知自习室"); // click("选择门店");

// click("开始")

// var res = text("学习无忧") // className("android.widget.RelativeLayout").findOne().click() // toast('1111') // text("充值").waitFor(); // toast("jinru") // let x = text("已过期").findOne(100).bounds().centerX(); // var text = text("已过期") // if(text("已过期")) { // click('已过期') // }

// var activity = currentActivity(); // 获取当前页面的标识

// 开启或者关闭指针 // 开启或者关闭指针 // app.launch("com.android.settings") // text("设置").waitFor(); // sleep(300) // swipe(200, 1500, 200, 500, 2) // text("系统设置").waitFor(); // sleep(300) // click("系统设置") // sleep(400) // // text("简体中文").waitFor(); // swipe(200, 1500, 200, 500, 2) // sleep(300) // click("开发者选项") // sleep(500) // // 滑动获取到元素后停止 // swipe(200, 1500, 200, 480, 20) // text("指针位置").waitFor(); // longClick(525, 1430); // click("指针位置")

// 封装通过文字, 获取下标, 点击文字 function clickText(string) { let element = textContains(string).findOne(100); if (element) { // 获取到了 let x = element.bounds().centerX(); let y = element.bounds().centerY(); click(x, y); sleep(300); } else { toast("未获取到" + string); } }

// auto.waitFor()

// home() // sleep(200) // app.launchApp("156微信") // sleep(1000) // text("微信").waitFor(); // sleep(1000) // swipe(500,300,500,1300,200) // sleep(1000) // click("两知") // sleep(10000) // clickText("进入预约") // sleep(300); // clickText("订 座"); // sleep(300); // clickText("2022"); // sleep(2000); // swipe(576, 2073, 576, 2073-1000, 300) // sleep(500) // swipe(576 + 200, 2073, 576 + 200, 2073-1600, 300) // sleep(100); // swipe(576 + 200, 2073, 576 + 200, 2073+480, 300) // sleep(100) // click(984, 1662); // sleep(2000) // clickText("请选择结束时间") // sleep(2000) // swipe(576 + 200, 2073, 576 + 200, 2073-1600, 300) // sleep(100) // click(984, 1662); // sleep(1000) // click("下一步")

// autoCapture(); // var img = images.captureScreen(); // let c = images.pixel(img, 543, 520) // // let position = images.findMultiColors(img, '#bababa', [[40, 0, '#bababa'], [0, 2, '#bababa']] , { // // threshold: 50 // // })

// -----------------打开场所码 start--------------------------- // function clickText(string) { // let element = textContains(string).findOne(100); // if (element) { // // 获取到了 // let x = element.bounds().centerX(); // let y = element.bounds().centerY(); // click(x, y); // sleep(300); // } else { // toast("未获取到" + string); // } // }

// app.launchApp("微信"); // text("通讯录").waitFor(); // swipe(400, 400, 400, 1500, 200); // text("重庆健康出行一码通").waitFor(); // clickText("重庆健康");

// text("我的渝康码").waitFor(); // sleep(300) // // 判断是否登录 // clickText("场所码"); // sleep(300); // let 登录 = text("去登录").findOne(300); // if (登录) { // clickText("去登录"); // text("请先登录账号").waitFor(); // let 登录按钮 = className("android.widget.Button").text("登录").findOne(300); // click(登录按钮.bounds().centerX(), 登录按钮.bounds().centerY()); // text("允许").waitFor(); // clickText("允许"); // text("场所码").waitFor(); // toast("找到了") // sleep(300) // clickText("场所码"); // } // -----------------打开场所码 end---------------------------

// -----------------usb网络共享 start--------------------------- // 打开设置 // app.launch("com.android.settings") // text("设置").waitFor(); // clickText("连接与共享"); // sleep(300) // clickText("USB 网络共享");

// autoCapture(); // var img = captureScreen(); // var point = findColor(img, "#2455af", { // region:[39, 900,1000, 1000 ], // 开始xy, 宽高 // threshold: 14 // 容差, 得填, 不然不好找色 // })

// -----------------usb网络共享 end---------------------------

// -----------------拼多多差评评论 start---------------------------

// while(true) { // let 评论 = text("评论"); // // let bouns = 评论.findOne(300).bounds() // // console.log("bouns", bouns) // if (评论) { // click("评论"); // // clickText("评论") // sleep(2000); // setText("质量不好;开关坏了, 为啥要评论那么多, 就是之前买过, 出了问题找店家, 店家态度恶劣, 没别的意思") // sleep(300); // click("发送") // sleep(800); // click(738, 300); // swipe(200, 1500, 200, 500, 200) // sleep(800) // } else { // sleep(10) // } // }

// -----------------拼多多差评评论 end---------------------------

//启用触摸监听 // events.observeTouch(); // //注册触摸监听器 // events.onTouch(function (p) { // console.log("p", p); // //触摸事件发生时, 打印出触摸的点的坐标 // log(p.x + ", " + p.y); // });

// 打开场所码
app.launchApp("微信");
sleep(500);
swipe(400, 400, 400, 1500, 200);
sleep(300)
let 重庆健康 = textContains("重庆健").bounds()
click(重庆健康.centerX(), 重庆健康.centerY())
sleep(1500);
click("场所码扫描")

1
2
3
4
5
6
7
8
9
10