app下载地址 https://github.com/SuperMonster003/AutoJs6/releases
文档地址 https://docs.autojs6.com/#/
vscode 安装 autojs6 扩展
ctrl + shift + p 输入Autojs6 选择
[连接]- 服务端模式 (Server)|局域网 (LAN)AutoJs6 作为客户端连接至 VSCode 服务端 (使用 IP 地址)
cmd 查看ip命令 ipconfig
手机打开下载app菜单打开无障碍服务、浮动按钮、客户端模式输入电脑局域网内ip
vscode 右上角运行脚本
// "auto收集" https://github.com/xiaorui16888/AutoJsCode
// https://github.com/wiatingpub/autojs/tree/master
// 1. 提示消息 (toast)
// 显示一个短暂的提示消息在屏幕底部
toast('操作成功'); // 普通提示
toastLog('调试信息: 正在执行步骤1'); // 同时会将消息记录到日志
// performUpSwipe() // 上拉
// performDownSwipe() // 下拉
// scrollToTop()
// console.show();
// var r = http.get("www.baidu.com", {
// headers: {
// 'Accept-Language': 'zh-cn,zh;q=0.5',
// }
// });
// log("code = " + r.statusCode);
// log("html = " + r.body.string()); // res.body.json();
// var url = "https://login.taobao.com/member/login.jhtml";
// var username = "你的用户名";
// var password = "你的密码";
// var res = http.post(url, {
// "TPL_username": username,
// "TPL_password": password
// });
// var html = res.body.string();
// if(html.contains("页面跳转中")){
// toast("登录成功");
// }else{
// toast("登录失败");
// }
// auto.waitFor(); //等待获取无障碍辅助权限
text("通讯录").waitFor(); // 等待文字获取
launchPackage("com.tencent.mm")
app.launchApp("腾讯视频")
const isTxlClicked = safeClick(
id("icon_tv").className("android.widget.TextView").text("通讯录"),
);
if (isTxlClicked) {
toast("通讯录点击成功");
} else {
toast("通讯录点击失败");
}
exit()
/**
* 通用点击方法(解决clickable: false的元素)
* @param {Object} selector - 元素选择器(如 text("通讯录"), id("icon").text("首页") 等)
* @param {number} [timeout=2000] - 查找元素超时时间(毫秒)
* @param {number} [pressTime=100] - 按压时长(毫秒,模拟真实点击)
* @returns {boolean} - 是否点击成功
*/
function safeClick(selector, timeout = 2000, pressTime = 100) {
try {
// 1. 查找元素
const element = selector.findOne(timeout);
if (!element) {
console.log("未找到目标元素");
return false;
}
// 2. 获取元素坐标范围
const bounds = element.bounds();
if (!bounds) {
console.log("无法获取元素坐标");
return false;
}
// 3. 计算中心点坐标
//const x = bounds.left + (bounds.right - bounds.left) / 2;
//const y = bounds.top + (bounds.bottom - bounds.top) / 2;
//console.log(`计算点击坐标:(${x}, ${y})`);
// 4. 执行按压点击(比普通click更可靠)
//press(x, y, pressTime);
press(bounds.centerX(), bounds.centerY(), pressTime);
sleep(500); // 等待点击响应
return true;
} catch (error) {
console.log("点击失败:", error.message);
return false;
}
}
// 2. 滑动操作 (swipe)
// 从起始坐标滑动到结束坐标,指定滑动时间(毫秒)
// 参数: 起始x, 起始y, 结束x, 结束y, 时长(ms)
swipe(500, 1500, 500, 500, 800); // 从下往上滑动(例如:滚动页面)
swipe(800, 1000, 200, 1000, 600); // 从右往左滑动(例如:切换页面)
// 3. 点击操作 (click)
// 点击指定坐标位置
click(300, 500); // 点击屏幕上(300,500)的位置
click(device.width / 2, device.height / 2); // 点击屏幕中心
// 4. 长按操作 (longClick)
// 长按指定坐标位置
longClick(400, 600); // 长按(400,600)位置(例如:弹出上下文菜单)
// 5. 按压操作 (press)
// 按压指定坐标并保持一段时间
// 参数: x坐标, y坐标, 按压时长(ms)
press(200, 300, 1000); // 在(200,300)位置按压1秒
// 6. 通过控件属性查找并操作
// 根据类名和描述查找按钮并点击
className("android.widget.Button").desc("发现").findOne().click();
// 其他常见的控件查找方式
className("android.widget.EditText").text("请输入用户名").findOne().setText("test"); // 输入文本
className("android.widget.CheckBox").checked(false).findOne().click(); // 勾选复选框
id("com.example:id/loginBtn").findOne().click(); // 通过控件ID查找
// 7. 系统操作
back(); // 模拟按下返回键
home(); // 回到主页
recentApps(); // 打开最近应用列表
// 8. 滚动操作
scrollDown(); // 向下滚动
scrollUp(); // 向上滚动
scrollLeft(); // 向左滚动
scrollRight(); // 向右滚动
// 9. 屏幕相关操作
log("屏幕宽度: " + device.width); // 获取屏幕宽度
log("屏幕高度: " + device.height); // 获取屏幕高度
screenshot("/sdcard/screenshot.png"); // 截取屏幕并保存
// 10. 延时操作
sleep(1000); // 暂停1秒(1000毫秒),等待界面响应
// 11. 条件等待
// 等待控件出现,最多等待10秒
var button = className("android.widget.Button").text("确定").waitFor();
if(button){
button.click();
}
// 12. 循环操作示例
for(var i = 0; i < 5; i++){
click(500, 500); // 连续点击5次
sleep(500); // 每次间隔0.5秒
}
/**
* 生成随机数(用于添加操作随机性,模拟人手操作)
* @param {number} min - 最小值
* @param {number} max - 最大值
* @returns {number} 范围内的随机整数
*/
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
/**
* 计算正切值(用于计算滑动轨迹角度)
* @param {number} angle - 角度(度)
* @returns {number} 角度对应的正切值
*/
function calculateTangent(angle) {
// 将角度转换为弧度后计算正切值
return Math.tan(angle * Math.PI / 180);
}
/**
* 执行上滑操作(模拟人手的曲线滑动轨迹)
* 特点:滑动路径呈曲线,带有随机偏移,更接近真实用户操作
*/
function performUpSwipe() {
// 初始化滑动轨迹数组,第一个元素为滑动总时长(毫秒)
var swipePath = [300];
// 计算起始点坐标(屏幕底部区域,横向中间位置)
var startX = device.width / 2;
var startY = device.height / 4 * 3; // 屏幕底部3/4高度位置
// 给起始点添加随机偏移(-30到30像素),模拟人手不精准性
startX = startX + getRandomNumber(-30, 30);
startY = startY + getRandomNumber(-30, 30);
// 初始化角度和坐标增量
var angle = 0; // 初始角度(度)
var xIncrement = 0; // X轴增量
var yIncrement = 0; // Y轴增量
// 生成滑动轨迹点(共30个点)
for (let i = 0; i < 30; i++) {
// 根据当前角度计算Y轴增量(基于正切值)
yIncrement = xIncrement * calculateTangent(angle);
yIncrement = Math.floor(yIncrement); // 取整
// 若计算出的终点超出屏幕顶部,则终止轨迹生成
if ((startY - yIncrement) < 0) {
break;
}
// 计算当前轨迹点坐标并添加到路径数组
var currentPoint = [startX + xIncrement, startY - yIncrement];
swipePath.push(currentPoint);
// 累加X轴增量(每次增加5像素)
xIncrement += 5;
// 累加角度(每次增加3度,使轨迹呈曲线变化)
angle += 3;
}
// 打印轨迹信息(调试用)
log("滑动轨迹点:", swipePath);
// 执行手势滑动(使用apply调用gesture函数,传入轨迹数组)
gesture.apply(null, swipePath);
}
/**
* 执行下拉操作(模拟人手自然下拉轨迹)
* 特点:从屏幕中上部开始,轨迹呈曲线向下延伸,带有随机偏移
*/
function performDownSwipe() {
// 滑动轨迹数组,第一个元素为总时长(毫秒)
// 300ms为完成整个下拉动作的时间,可根据需要调整
var swipePath = [300];
// 计算起始点坐标(屏幕中上部区域)
var startX = device.width / 2; // 横向中间位置
var startY = device.height / 4; // 纵向1/4高度位置(中上部)
// 添加随机偏移(-30到30像素),避免机械性操作
startX = startX + getRandomNumber(-30, 30);
startY = startY + getRandomNumber(-30, 30);
// 初始化轨迹参数
var angle = 0; // 初始角度(度)
var xIncrement = 0; // X轴增量
var yIncrement = 0; // Y轴增量
// 生成滑动轨迹点(最多30个点)
for (let i = 0; i < 30; i++) {
// 根据角度计算Y轴增量(向下为正方向)
yIncrement = xIncrement * calculateTangent(angle);
yIncrement = Math.floor(yIncrement);
// 防止滑动超出屏幕底部
if ((startY + yIncrement) > device.height) {
break;
}
// 计算当前轨迹点并添加到路径
var currentPoint = [startX + xIncrement, startY + yIncrement];
swipePath.push(currentPoint);
// 逐步增加X轴偏移和角度,形成曲线轨迹
xIncrement += 5; // X轴每次增加5像素
angle += 3; // 角度每次增加3度,使轨迹向下弯曲
}
// 打印轨迹信息(调试用)
log("下拉轨迹点:", swipePath);
// 执行下拉手势
gesture.apply(null, swipePath);
}