- 软件准备
- 技术理论
- 安装教程
- 推荐工作模式
- 注意事项
- 附录代码
软件准备
auto.js或者 auto.js pro版。auto.js目前官方已经停止更新,pro版本需要收费。大家可以试试GitHub上的民间团队维护的autoX.js. 也欢迎尝试收费的pro版本,毕竟会比较稳定。weixin打卡的xiao程序以“嘉办事”为例。
技术理论
通过Javascript脚本,实现模拟点击。对于熄屏解锁,不同手机型号屏幕像素不一样,因此无法做到通用适配。大家可以自行编写代码实现。
安装教程
1.只需要安装完auto.js软件,打开该软件。会提示你打卡无障碍权限,请授予其无障碍权限以及悬浮窗权限(此步骤不多做解释)。
2.新建脚本,把代码复制进去。
3.保存,设置定时任务(每天固定打卡)
具体如下:
按照上面步骤,保存后,在主界面上点击三角形就会立马运行。点击旁边的三个点可以设置定时任务,定时设置为每天十一点,这个时间段大部分人手机处于亮屏状态。
推荐工作模式
不建议用上面的定时方式,因为不同机型后台管理机制有所差异,会结束auto.js的进程。建议使用创建快捷方式的模式。如上面最后一张图的 “定时任务”下面就是创建桌面快捷方式。如果创建失败,请在系统设置里面给予auto.js创建快捷方式权限。创建快捷方式后,只需要点击桌面图标,就能够自动运行。
注意事项
1.该脚本模拟的是weixin首页下拉点击小程序进入。因此首页下拉小程序必须要有“嘉办事”否则执行失败。
2.为保证正常运行请授予auto.js软件自启、后台常驻、省电忽略、无障碍等权限。
3.若没开启无障碍,运行脚本时会自动跳转无障碍选项。
4.打卡成功后,会自动截图。截图会保存在手机存储的根目录。文件名是“自动打卡(查看日期)”,可以通过截图的日期详细信息判断打卡是否成功。若无截图,说明打卡出现问题。第二次打卡截图会覆盖第一次打卡的图片,无论你打卡多少次,都只会仅有一张截图。查看截图的日期,就可以知道有没有打成功。
5.请勿将运行本脚本与打卡成功进行等价,最后打卡成功与否一定要看有没有截图!!没有截图则需要以及重新手动打卡一遍。
6.本脚本只是方便用户,成功率因机型而异。切勿成为与生活委员、班长、学委、老师等争论依据。
7.如果给予了无障碍权限后运行脚本还是跳转到无障碍的设置界面,此时可以尝试手动结束auto.js进程,然后重新打开 auto.js,在里面重新启用无障碍模式。如果不行,多试几遍即可。(部分机型可能会出现该问题.)
附录代码
auto.waitFor();
if (!device.isScreenOn()) {
device.wakeUp();
sleep(2000);
swipe((device.width) * 3 / 4, (device.height) * 3 / 4, (device.width) * 2 / 4, (device.height) * 2 / 4, 1000);
var i;
for (i = 0; i < 4; i++) {
sleep(500);
click(541, 2139.0);
}
console.log("自动解锁成功!");
sleep(2000);
}
//上面是息屏自动解锁,可根据实际情况自行调整
console.show();
console.setSize(447, 502);
console.setPosition(300, 1350);
console.log("开始 ^_^");
var appName = "微信";
launchApp(appName);
text("微信").waitFor();//等待加载发现页面.text('微信')
console.log("进入首页");
var widget = className("TextView").depth(13).findOne();
click(widget.bounds().centerX(),widget.bounds().centerY());
console.log("操作成功,正在进入下一步(1/5)");
sleep(1000);
console.log("下滑小程序界面....");
while(text('最近').exists()==false){
swipe((device.width)/4,(device.height)/4,(device.width)*3/4,(device.height)*3/4,1000);};//判断滑到最顶端
swipe((device.width)/4,(device.height)/4,(device.width)*3/4,(device.height)*3/4,1000);//继续滑动
console.log("已滑动进入首页小程序");
text("最近").waitFor();
var widget1 = text('嘉办事').findOne();
click(widget1.bounds().centerX(),widget1.bounds().centerY());
console.log("操作成功,正在进入下一步(2/5)");
console.log("进入打卡小程序...");
sleep(2000);
text("日常健康").waitFor();
var target2= text('日常健康').findOne();
click(target2.bounds().centerX(),target2.bounds().centerY());
console.log("操作成功,请确保网络畅通(3/5)");
sleep(2000);
text("直接提交").waitFor();
var target3= text('直接提交').findOne();
click(target3.bounds().centerX(),target3.bounds().centerY());
console.log("提交成功,结束(4/5)");
sleep(3000);
threads.start(function (){undefined
var beginBtn;
if (beginBtn = classNameContains('Button').textContains('允许').findOne(2000)) {undefined
beginBtn.click();
}});
// 此处findOne(2000)是为了限制查找时间,如果留空,找不到就会一直找。
console.log("开始截图");
if(!requestScreenCapture()){undefined
toast("请求截图失败");
exit();
};
sleep(3000);
captureScreen("/storage/emulated/0/截图保存(查看日期)" + ".jpg");
console.log("截图成功!(5/5)");
sleep(3000);
var target4= id('com.tencent.mm:id/fi').findOne();
click(target4.bounds().centerX(),target4.bounds().centerY());
console.log("正在进行结束操作,请稍等..");
var target5= className("android.widget.ImageButton").indexInParent(2).findOne();
click(target5.bounds().centerX(),target5.bounds().centerY());
//关闭按钮
console.log("再见 ~^_^~");
sleep(3000);
console.hide();//隐藏控制台;
exit();