AutoxJS脚本保姆级教程

目录

引言

准备工作

脚本开发

邮件提示(不使用邮件推送的可以跳过这步)

节假日判断(不需要判断节假日的可以跳过)

问题及技巧归总

JS语法错误:软件更新

按钮或组件无法找到

使用定时器等待组件出现

root环境下才能用shell的root模式

主线程堵塞问题

全局日志记录

巧用id或text

Tasker和AutoXjs自启问题

效果展示

写在最后

注意:该脚本请勿用于商用,侵删

相关代码


引言

2021年的时候分享了一个自动化脚本的文章,介绍了使用Tasker+Autojs实现自动化操作。现在公司更换了新的考勤软件,脚本也做了许多期迭代,所以更新了一版脚本分享的文章,并记录一些遇到的问题

准备工作

同这篇文章:

  • 目标App换成北sen
  • 电脑+VSCode
  • 安卓模拟器推荐个资源网站雷电模拟器 v4.0.83 / v5.0.60 绿色版 / 雷电模拟器9 v9.0.50.0 绿色版-六音
  • AutoX.js
  • Tasker,中文站,原网站

脚本开发

开发调试的过程可以参照这篇文章

这里直接贴出脚本

/** @Author: Hunter* @Date: 2023-07-10 17:46:35* @LastEditTime: 2023-07-18 14:56:28* @LastEditors: Hunter* @Description:* @FilePath: \北sen\main.js* 可以输入预定的版权声明、个性签名、空行等*/
var appName = "北森iTalent", //app名packageName = getPackageName(appName), //包名roundTimer = 60 * 1000, //超时定时器间隔60秒randomTimer = parseInt(Math.random() * 5 * 60 * 1000), //随机定时器0-5分钟(精确到毫秒)maxRetryCount = 3, //重试打卡次数useEmail = true, // 是否发送邮件useDate = true, // 是否检查节假日cardMenuBtn = () => id("mIVBottomCenter").findOne().bounds(), //打卡界面菜单cardViewBtn = () => text("签到").findOne().bounds(), //打卡界面按钮positionBtn = () => id("tv_sign_company_status").text("办公地点"), //定位成功按钮cardTakeBtn = () => id("rlt_sign_click").findOne(); //打卡按钮
let logs = ``;
// 日志记录
const __log = function () {logs += `${new Date()}:${JSON.stringify(arguments)}`;toast(JSON.stringify(arguments));console.trace.apply(null, arguments);
};
const getLog = () => logs;
const mailApi = "https://api.emailjs.com/api/v1.0/email/send", //邮箱请求地址mailConfig = {user_id: "user_xxxxxxxxxxxxxxxxxxxxxxhj",service_id: "sexxxxxxxmk",template_id: "templxxxxxxxxxxmn",accessToken: "8xxxxxxxxxxxxxxxxxxxxxxxxxxx9",template_params: {title: "自动打卡通知",content: `打卡成功日志:${getLog()}`,email: "xxxxxxxxx@qq.com",// 接收消息的邮箱},}, //邮箱配置,需要去emailjs官网申请api,每月免费200次dateApi = "http://api.tianapi.com/jiejiari/index", //节假日接口dateConfig = {key: "9dxxxxxxxxxxxxxxxxxx93",date: formatDate(new Date()),}; //在天行数据申请节假日api(每天免费查询100次):https://www.tianapi.com/
__log("随机延迟时间:", randomTimer);
if (useDate) {// 检查是否开启节假日检测checkDateIsWork(dateConfig, function (res) {if (res.newslist[0].isnotwork) {sendEmail(setNewMessage("今天是法定节假日,无需打卡"));exitApp(true);return;}exitApp(false);setTimeout(init, randomTimer);});
} else {exitApp(false);setTimeout(init, randomTimer);
}function init() {if (!!maxRetryCount) {__log("剩余重试次数" + maxRetryCount);timeOutMsg();maxRetryCount--;startProgram();return;}exitApp(true);
}
//开启应用
function startProgram() {__log("launchApp:" + appName, launchApp(appName)); //打开appwaitForPackage(packageName); //等待app打开__log("launchAppSuccess", packageName);openCardView();
}
//首页--->打卡页
function openCardView() {var cardMenuButton = cardMenuBtn();__log("打卡界面菜单",click(cardMenuButton.centerX(), cardMenuButton.centerY()));var cardButton = cardViewBtn();__log("进入打卡界面", click(cardButton.centerX(), cardButton.centerY() - 10));takeCard();
}
//打卡
function takeCard() {__log("等待定位");positionBtn().waitFor();__log("定位成功");__log("点击打卡按钮", cardTakeBtn().click());sendSuccEmail();exitApp(true);
}
// 打卡成功发邮件
function sendSuccEmail() {const _mailConfig = mailConfig;_mailConfig.template_params.content += getLog();__log("发送邮件", sendEmail(_mailConfig));
}
//退出程序
function exitApp(exitJs, fn) {shell("am force-stop " + packageName, true);fn && fn();exitJs && exit();
}// 程序超时处理
function timeOutMsg() {threads.start(function () {//在新线程执行的代码setTimeout(function () {sendEmail(setNewMessage("自动打卡超时,正在重试"));exitApp(false, init);}, roundTimer);});
}
// 发送邮件api
function sendEmail(params) {if (useEmail) {var res = http.post(mailApi, params || mailConfig, {contentType: "application/json",});return res;}
}
// 节假日api请求
function checkDateIsWork(params, fn) {var res = http.post(dateApi, params || dateConfig).body.json();if (res.code === 200) {fn(res);return;}__log(res);sendEmail(setNewMessage(res.msg));
}
// 修改默认邮件提示信息
function setNewMessage(msg) {var _mailConfig = simpleCloneObj(mailConfig, {contentType: "application/json",});_mailConfig.template_params.content = `${msg + new Date()}日志:${getLog()}`;return _mailConfig;
}//日期格式转换 YYYY-MM-DD
function formatDate(date) {var y = date.getFullYear();var m = date.getMonth() + 1;m = m < 10 ? "0" + m : m;var d = date.getDate();d = d < 10 ? "0" + d : d;return y + "-" + m + "-" + d;
}// 简单的深复制
function simpleCloneObj(target) {return typeof target === "object" && JSON.parse(JSON.stringify(target));
}

邮件提示(不使用邮件推送的可以跳过这步

在代码中可以配置邮件通知的选项,或者使用useEmail来控制是否发送邮件,此外还可以参照这篇文章,使用自己的邮件推送服务

这里以emailjs为例,每个月可以调用200次。

首先绑定自己的邮件服务

接着同样参照这篇文章,配置一下邮箱的选项用于邮件推送

然后是邮件模板的配置,代码中的template_params请求参数与模板配置对应

最后是emailjs的一些id

  • service_id

  • template_id

  • user_id和accessToken

 

将这些配置项放在代码中就可以使用了

节假日判断(不需要判断节假日的可以跳过

为了计算当前日期是否是节假日,我调用了一个天行的公共api,当然也可以通过将代码中的useDate设置为false关闭该功能

注册并实名后搜索节假日

点击开通,每天免费使用100次

问题及技巧归总

在上一版本脚本迭代中遇到了以下问题以及autoxjs中的一些使用技巧,供参考

JS语法错误:软件更新

旧版本的autojs或AutoXJS可能会提示语法错误,有可能是使用了过于超前的JS语法,建议更新app版本比如字符串模板 ` ${} ` ,const 等

按钮或组件无法找到

按钮无法找到的问题出现在北sen软件中,在*人薪事中可以使用id或者text的方式找到并点击组件,但是升级安卓高版本的系统后,组件的clickable为false,可能会出现找不到组件的问题,那就只能通过例如:text("签到").findOne().bounds() 的方式来获取组件的范围,然后通过类似:click(cardButton.centerX(), cardButton.centerY()) 的方式对屏幕进行动态定位点击事件,具体可以参考上面代码中的openCardView函数的两个点击事件

使用定时器等待组件出现

使用setinterval来轮询查询页面组件的clickable是否为true,由于有时使用官方的waitfor失效,所以想到了这个方式,这种方式虽然可以解决问题,不到万不得已不推荐使用,会导致性能差

root环境下才能用shell的root模式

模拟器中需要开启root,手机也需要root才能使用root模式执行sh

主线程堵塞问题

我在脚本后续迭代中加入了主线程超时处理,超过一分钟我就会重启脚本和软件,具体参考timeOutMsg函数

全局日志记录

好的程序必定离不开日志监控及问题定位排查,在__log函数中我封装了全局的日志处理,每步操作都会记录日志信息

巧用id或text

有许多组件没有id选项,所以就只能使用text或者parent等方式取获取组件

Tasker和AutoXjs自启问题

自启问题比较棘手,我使用tasker每天定时启动autojs防止脚本执行,那么如何保证tasker自启呢?使用autojs实现的,说起来很怪,有时会偶发autojs启动了但是却无法接受tasker发的系统广播,此时重启一下autojs就可以解决,具体脚本如下

// 自启tesker,防止开机被kill
var appName = "Tasker", //app名packageName = getPackageName(appName); //包名
startProgram();
//开启应用
function startProgram() {toast("launchApp:" + appName);console.log("launchApp:" + appName, launchApp(appName)); //打开appwaitForPackage(packageName); //等待app打开console.log("launchAppSuccess", packageName);toast("launchAppSuccess", packageName);exit();
}

效果展示

讲完了这么多,我们参考这个将脚本放在AutoXJS中演示一下

写在最后

本篇文章对以前的自动化脚本的迭代更新做了个梳理,有许多步骤在之前的文章中有,建议先过一遍,除此之外,文章总结了一些在脚本迭代过程中遇到的问题和解决技巧。其中涉及到的问题包括JS语法错误、按钮或组件无法找到、使用定时器等待组件出现、root环境下才能用shell的root模式以及主线程堵塞问题等。同时,文章提供了一些技巧,如巧用id或text获取组件、全局日志记录和Tasker与AutoX.js自启问题的解决方案。

注意:该脚本请勿用于商用,侵删

以上就是文章全部内容了,如果觉得文章不错的话,还请三连支持一下,谢谢!

相关代码

myCode: 基于js的一些小案例或者项目 - Gitee.com

邮件推送服务: 基于 TS+Node+nodemailer 实现一个开箱即用的 Node 邮件推送服务,需要获取邮箱的授权码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/66137.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据平台中元数据库—MySQL的异常故障解决

本文的主要目标是解决大数据平台中元数据库MySQL的异常故障。通过分析应用响应缓慢的问题&#xff0c;找到了集群组件HIVE和元数据库MySQL的原因。通过日志分析、工具检测和专家指导等一系列方法&#xff0c; 最终确定问题的根源是大数据集群中租户的不规范使用所导致&#xff…

深度学习关键要素:数据集汇总与分享

引言 在深度学习的应用中&#xff0c;数据被认为是最重要的因素之一。因此&#xff0c;选择一个好的数据集对于深度学习的成功至关重要。在选择数据集时&#xff0c;不仅需要关注数据量的大小、多样性以及质量&#xff0c;还要考虑数据集是否代表了所研究问题的真实情况。本文…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时&#xff0c;所有建筑物形成的外部轮廓。…

面试总结-webpack/git

说说你对webpack的理解 webpack 是一个静态模块打包器&#xff0c;整个打包过程就像是一条生产线&#xff0c;把资源从入口放进去&#xff0c;经过一系列的加工&#xff08;loader&#xff09;&#xff0c;最终转换成我们想要的结果&#xff0c;整个加工过程还会有监控&#x…

云计算——存储虚拟化功能

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前期回顾 前言 一.存储虚拟化功能 1.精简磁盘和空间回收 2.快照 &#xff08;1&a…

0基础学C#笔记08:插入排序法

文章目录 前言一、过程简单描述&#xff1a;二、代码总结 前言 我们在玩打牌的时候&#xff0c;你是怎么整理那些牌的呢&#xff1f;一种简单的方法就是一张一张的来&#xff0c;将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候&#xff0c;为了…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响&#xff0c;这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁&#xff0c;从而使性能下降。为此&#xff0c;可以采取以下几种方式来减缓这种影响&#xff1a; 1. 限制索引的大小&#xff1a;可以…

Android 视频播放器dkplayer

gihub地址&#xff1a; https://github.com/Doikki/DKVideoPlayer GitHub - Doikki/DKVideoPlayer: Android Video Player. 安卓视频播放器&#xff0c;封装MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并实现预加载&#xff0c;列表播放&#xff0c;悬浮播放&#xff0c;广…

定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

下面画出等效电路图 可以知道单片机内必然有一个电阻RX&#xff0c;为了简化分析&#xff0c;我们假设他是线性电阻&#xff08;不带电容&#xff0c;电感的支路&#xff09; 还有一个基础知识&#xff1a; 电容器的充电放电曲线&#xff1a; 还需要知道电容电压的变化是连续…

Android Jetpack Compose 中的分页与缓存展示

Android Jetpack Compose 中的分页与缓存展示 在几乎任何类型的移动项目中&#xff0c;移动开发人员在某个时候都会处理分页数据。如果数据列表太大&#xff0c;无法一次从服务器检索完毕&#xff0c;这就是必需的。因此&#xff0c;我们的后端同事为我们提供了一个端点&#…

11、Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow Pytorch版本

Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow-GPU版本 一、确定版本关系二、安装过程1.安装显卡驱动2、安装CUDA3、安装cudnn4、安装TensorFlow5、安装pytorch 三、卸载 一、确定版本关系 TensorFlow Pytorch推出cuda和cudnn的版本&#xff0c;cuda版本推出驱动可选版本…

【不限于联想Y9000P电脑关盖再打开时黑屏的解决办法】

不限于联想Y9000P电脑关盖再打开时黑屏的解决办法 问题的前言问题的出现问题拟解决 问题的前言 事情发生在昨天&#xff0c;更新了Win11系统后&#xff1a; 最惹人注目的三处地方就是&#xff1a; 1.可以查看时间的秒数了&#xff1b; 2.右键展示的内容变窄了&#xff1b; 3.按…