Autojs签到

最近学校每天都要求打卡,上午下午各打一次;我觉得本来就封校了,一直就在学校,风险不大,就没放在心上,结果好几次没打,最后直接给我扣分了(很烦);我想一劳永逸的解决这个问题,于是准备写个自动脚本,让他自己打

刚开始的方案是准备直接调小程序接口的(我们打卡是在微信小程序上打的),准备每次打卡的时候,去抓发送打卡信息的包,然后看一看对应数据格式,自己封一个包上去,每天定时发送,当作打卡;但是做起来就发现了问题,wx的加密解密格式我都不了解,而且认证用户也是个问题;后面再重新想办法,才想到可以直接在手机上运行脚本,定时执行就行了

安装环境

  • AutoJs 我用的4.1版本的,现在有三个版本,不同版本有区别

  • scrcpy 连接手机和电脑端的中介,好用的开源软件

  • vscode 需要安装对应插件,商店搜索hyb1996安装就行

然后就是连接手机和电脑了,手机需要打开开发者模式,开启usb调试,开启AutoJs的无障碍服务和悬浮窗,打开scrcpy投屏,vscode打开服务端,然后autojs连接电脑,4.1版本需要查看pc端的ip,然后手机连接,连接后就能在线调试了

js基本语法

autojs是通过javascript编写的语法,就简单介绍下语法

变量

js变量通过var来声明

1
2
3
4
5
6
7
8
9
10
11
var a=1
var b='sss'
var c=a+b
var d = "8" + 3 + 5;
var e = 3+ 5 + "8"+3+5;
console.log(c)
//1sss
console.log(d)
//835
console.log(e)
//8835

可以在一条语句中声明许多变量

1
var a=1, b='sss', c=a+b
数据类型

js有多种数据类型,包括数值、字符串值、数组、对象

JavaScript 拥有动态类型,一个变量的类型取决于他被赋什么值,没赋值默认undefined

1
2
3
4
var a = 7;                             // 数字
var a = "helllo"; // 字符串
var a = ["helllo", "world"]; // 数组
var a = {firstName:"helllo", lastName:"world"}; // 对象由键值对*name*:*value*构成,逗号分隔

typeof 运算符返回变量或表达式的类型

语句里判断,循环和c差不多,数组,函数都类似

添加数组元素要调push函数

代码

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
var width = device.width;
var height = device.height;
var pwd = [x, x, x, x];//解锁数字密码
var x, y, z;//(x,y)处的颜色与z颜色比较
auto(); // 自动打开无障碍服务
unlock();
ScrPermission();//拿到截图权限
sleep(3e3);
closeApp();//这个时候不知道手机状态,清掉所有后台
app.launchApp("微信");
sleep(8e3);
open();
write();

function unlock() {
if (!device.isScreenOn()) {//息屏状态将屏幕唤醒
device.wakeUp();//唤醒设备
sleep(1000); // 等待屏幕亮起
//miui锁屏滑动不能唤出密码输入 通过下拉通知栏点击时间进入密码解锁
swipe(500, 30, 500, 1000, 300);
sleep(5e2);
//点击时间
click(100, 120);
//解锁
desc(pwd[0]).findOne().click();
desc(pwd[1]).findOne().click();
desc(pwd[2]).findOne().click();
desc(pwd[3]).findOne().click();
//等待解锁完成,返回并退出
back();
}
}
function closeApp() {
home();
swipe(500, 2230, 500, 300, 1000);//上滑
sleep(5e2);
click(540, 2072);
}

function write() {
click("选择体温");
className("android.view.View").text("选择体温").findOne().click();
sleep(5e2);
click(738, 2112);
sleep(5e2);

swipe(device.width / 2, 1000, device.width / 2, 500, 500);
sleep(2e3);

//判断健康状况和检测时间是否填写
toast("健康状况");
if (!pipei(123, 424, "#ff14be12")) {
click(123, 424);
};
sleep(5e2);

toast("检测时间");
if (!pipei(123, 1314, "#ff14be12")) {
click(123, 1314);
};
sleep(5e2);

toast("定位");
click(655, 1880);
sleep(4e3);

toast("提交");
click(536, 2155);
sleep(5e2);
click(764,1302);//确认
}

function pipei(x, y, z) {
// var c = images.pixel(captureScreen(), x, y);
//检测在点(x, y)处是否有颜色z (模糊比较)
var isDetected = images.detectsColor(captureScreen(), z, x, y);
return isDetected;
}
function ScrPermission() {
//新建一个线程,同意截图权限
threads.start(function () {
toast("新建线程");
sleep(3e3);
click(785, 2119);
})
if (!requestScreenCapture()) {
toast("请求截图失败");
exit();
}
}

function open() {
toast("我在校园");
click(370, 370);
sleep(4e3);

toast("学生端");
click(360, 2174);//学生端
sleep(6e3);

toast("日检测日报");
click(151, 1454);//日检测日报
sleep(5e3);

var time = new Date().getHours();
if (time < 12) {
toast("晨检");
click(538, 679);
} else {
toast("午检");
click(526, 1000);
}
}

流程

如果处于锁屏状态,首先解锁

然后清理后台(主要是清理微信状态)

然后打开微信(在调app.launchApp("微信")语句时,要注意有root权限,否则可能出现打不开的情况)

然后获取截图权限(这里会遇到问题,请求时候会弹出允许页面,这是程序会阻断,解决办法是新建一个线程,让新线程来点击允许)

然后就是逐个点击计划的位置,期间做了个判断,取出本机时间,判断到底是晨检还是午检,多选框是通过检测关键点的颜色是否匹配实现的

因为autojs对微信进行了部分屏蔽,没法通过id,desc,text等来选择控件,我实现时,一般点击操作都采用了相对位置,所以,以上代码基本不可移植

最后,把脚本加入每日任务,就完成了