钉钉自动打卡脚本开发日记,新手小白0基础试水,求勿喷

公司开始钉钉打卡,上下班各一次,因为家住很远,路上不可预料情况太多,导致经常缺卡,妈蛋万恶的领导规定三次缺卡之后50块钱一次。。。。。。。

偶然一次在bilibili网上看见Autojs演示,豁然开朗,居然手机还可以这样玩,立马想到可以利用旧手机+autojs来设置钉钉自动帮我打卡

我准备把我开发的过程放上来,一是有不足之处请高手支招,二是帮助有同样需求的朋友解决烦恼

PS:本人编程小白,0基础,出现常识性的问题请指点,求勿喷。

----------------------================分割线==================----------------------

需求:

1.工作日每天打卡两次,上午在8:45之前,下午在17.30之后

2.如果遇到特殊情况(出差,公出办事,请假)要能停止运行打卡程序

---------------------=============以下为代码发布===============---------------------
钉钉自动打卡脚本 2018-12-01
使用环境:双手机,备用手机root,登录微信小号放在公司
实现功能:自动打卡,能在打卡界面截图用微信小号发送到大号
上班打卡.js 2018-12-01
下班打卡.js 2018-12-01

钉钉自动打卡脚本 2018-12-03
新增自动登录钉钉脚本
搭档软件智能触发器配置图
登录钉钉.js 2018-12-03
0_1543828562472_441443e0-5879-41df-a034-62993f0d0cc8-image.png

钉钉自动打卡脚本 2018-12-11
整合代码,自己设定上下班时间,根据时间自动判断打卡
自适应打卡.js 2018-12-11

最后由 icescat 编辑

首先硬件准备:一台旧手机meizu Pro6s,安卓7.1系统放在公司打卡,已Root。本人大部分时间还是在公司,能保证手机一般不会没电关机。
在bilibili上学习 笔青居大大的视频,并配置好PC端编程环境。
https://space.bilibili.com/21486893?from=search&seid=9905099060044528320

最后由 icescat 编辑

PC和手机端都装好程序并配置好环境之后开始试水:
第一部我准备先写正常流程下打开钉钉直到打卡界面的操作。(以下我写的都是经过测试能运行的代码,跑不顺的我就不放上来了。)

       //启动钉钉
launch("com.alibaba.android.rimet");
//等待钉钉启动
desc("工作").waitFor();
desc("工作").findOne().click();
//打开打卡界面
text("考勤打卡").waitFor();
text("考勤打卡").findOne().parent().parent().click();
//等待打卡界面加载
descContains("已进入").waitFor();

测试了几次均能完美进入,然后第二部,开始打卡。
打卡分两步,先看早上打卡,早上我们公司设置的极速打卡,打开软件就会自动打,我观察了一下,极速打卡完成后打卡界面会出来个【极速打卡】的标志,我就定位这个标志,如果出现这个就视为打卡完成,退出软件。

        //启动钉钉
launch("com.alibaba.android.rimet");
//等待钉钉启动
desc("工作").waitFor();
desc("工作").findOne().click();
//打开打卡界面
text("考勤打卡").waitFor();
text("考勤打卡").findOne().parent().parent().click();
//等到极速打卡按钮
desc("极速打卡").waitFor();
home();

写程序的时候边写边想才发现会有可能出现很多异常情况,比如断网,卡界面,gps信号漂移无法定位等,忽然觉得脑子一团胡¥……&*(),想了半天,决定先不考虑异常情况,把正常情况下的操作写完再慢慢完善。。。。。。
继续:早上打卡写完了,再写一个下班打卡。下班打卡不是极速打卡,需要手动点击打卡按钮,经过试验写完了代码:

//启动钉钉
launch("com.alibaba.android.rimet");
//等待钉钉启动
desc("工作").waitFor();
desc("工作").findOne().click();
//打开打卡界面
text("考勤打卡").waitFor();
text("考勤打卡").findOne().parent().parent().click();
//等待打卡界面加载
descContains("已进入").waitFor();
//获取打卡按钮
desc("下班打卡").waitFor();
desc("下班打卡").findOne().click();
home();

对了我这只是固定地点打卡,不适用于外勤打卡的朋友哦!

想了一下,如果定时打卡的话,人事那边月末导出数据看见我每天上下班都是固定时间,精确到秒那也太假了。。。。。汗,还好想到了,去网上搜到了个延时脚本,加上去.......

//五分钟内随机打卡    
var randomTime = Math.random() * 300 * 1000;
toast((randomTime / 1000).toFixed(2) + '秒后打卡');
setTimeout(() => {
    punchClock();
}, randomTime);

//打卡
function punchClock() {
    sleep(200);
    //启动钉钉
    launch("com.alibaba.android.rimet");
    //等待钉钉启动
    desc("工作").waitFor();
    desc("工作").findOne().click();
    //打开打卡界面
    text("考勤打卡").waitFor();
    text("考勤打卡").findOne().parent().parent().click();
    //等到极速打卡按钮
    desc("极速打卡").waitFor();
    home();
}

这样我每天定时启动任务,但是打卡时间都不一致,我真是太聪明了!喵哈哈哈!

最后由 icescat 编辑

刚才测试了一下,代码在黑屏状态跑不下去,停在钉钉启动后的第一个界面。想了个办法,在启动钉钉之前先解锁屏幕。因为我的备用手机里面没有重要资料,锁在抽屉我就不设密码了,亮屏直接进系统,要亮屏解锁的朋友自己找找论坛别的代码把。。。。。

//五分钟内随机打卡
var randomTime = Math.random() * 300 * 1000;
console.log('打卡计时开始' + (randomTime / 1000).toFixed(2) + '秒后打卡');
toast('打卡计时开始' + (randomTime / 1000).toFixed(2) + '秒后打卡');
setTimeout(() => {
    console.log('开始打卡');
    unlock();
    console.log('点亮屏幕');
    punchClock();
    console.log('打卡结束');
}, randomTime);

//解锁
function unlock() {
    //是否需要亮屏
    if (!device.isScreenOn()) {
        //点亮屏幕
        device.wakeUp();
    }
    //回到桌面
    home();
}

//上班打卡
function punchClock() {
    sleep(200);
    //启动钉钉
    launch("com.alibaba.android.rimet");
    //等待钉钉启动
    desc("工作").waitFor();
    desc("工作").findOne().click();
    //打开打卡界面
    text("考勤打卡").waitFor();
    text("考勤打卡").findOne().parent().parent().click();
    //等到极速打卡按钮
    desc("极速打卡").waitFor();
    home();
}

这样上下班打卡基本上不出意外的情况下就OK了,两个脚本各自设置一个时间运行就OK。

忽然想起来,他打卡有没有成功我人不在的时候压根不知道啊…………下午去研究一下

想到一个方案,每当完成打卡操作的时候,截图,用微信小号把截图发送到我的大号,这样就可以知道Js什么时候打卡了,有没有打卡成功,有没有卡机(规定的时间没有发送图片)。接下来就来完善这个功能把😁

研究了好久,有几个问题很奇怪。
一是autojs内截图的文件在微信对话框打开相册找不到(喵喵喵???),不过去系统文件夹里可以找到,可以打开,可以分享。真是奇怪。
二是系统文件夹里用悬浮窗分析布局,分析出来的结果都是显示clickable=false子控件父控件都是这个值我也是懵逼,好在这个文件夹只会有这个文件,进入文件夹这个截图文件在屏幕上的位置是固定的,最后没办法我只能写成点击固定坐标了。
0_1543648547948_8b96f548-db60-46e8-b3b8-e10823863423-image.png

    //截图开始
    if (!requestScreenCapture()) {
        toast("请求截图失败");
        exit();
    }
    var img = captureScreen();
    images.saveImage(img, "/sdcard/Pictures/1.png");
    toast("截图成功");
    home();
    sleep(1000)
    //启动文件管理器找到刚才生成的图片文件
    launch("com.meizu.filemanager");
    textStartsWith("Pictures").waitFor();
    textStartsWith("Pictures").findOne().parent().click();
    //妈蛋这个文件的id,desc,text几个参数有值的都无法直接点击,父元素也无法点击,很费解,不过还好文件都是覆盖同一个,所以位置都是固定的,先来个固定点点击来解决把。
    sleep(400);
    click(180, 440);
    //开始用分享功能发送给微信
    desc("分享").waitFor();
    desc("分享").findOne().click();
    text("微信好友").waitFor();
    text("微信好友").findOne().parent().click();
    text("喵").waitFor();
    text("喵").findOne().parent().parent().parent().parent().click();
    text("发送").waitFor();
    text("发送").findOne().click();
    sleep(5000)
    home();
最后由 icescat 编辑

新问题出现了😿 😿 😿
刚才反复测试的时候出现的问题。。。。。可能是时间间隔不长,重复运行脚本的时候出现了打开app时app停留在上次使用时候的最后一个界面,这样的话我写的脚本就因为找不到控件假死了。。。。想了个办法,每次跑完脚本最后把钉钉和文件管理器进程kill掉。等我研究一下。

大佬能不能来一下,出来个奇怪的悬浮框!!!???
我参照教程AUTO.js文档运行了这段话

    var result = shell("am force-stop com.alibaba.android.rimet", true);
    log(result);
    console.show();
    if(result.code == 0){
      toast("执行成功");
    }else{
      toast("执行失败!请到控制台查看错误信息");
    }

确实关闭了钉钉程序,也返回了“执行成功”,但是桌面出来个这玩意
0_1543648326216_dde6ffb3-389b-4d8d-b426-52367cd6682b-image.png

这个浮动层里面是啥玩意?

我懂了,去掉

    console.show();

就可以了
现在我可以开始写关闭钉钉和文件管理器了:

var result1 = shell("am force-stop com.alibaba.android.rimet", true);
if(result1.code == 0){
  toast("钉钉退出成功");
}else{
  toast("钉钉退出失败");
}
sleep(400)
var result2 = shell("am force-stop com.meizu.filemanager", true);
if(result2.code == 0){
    toast("文件管理器退出成功");
  }else{
    toast("文件管理器退出失败");
  }

加到打卡代码后面就OK了

检查了几次,上下班基本OK, 现在将代码挂到1楼,欢迎大家来检查指导!

暂时休息一下,下周开始研究特殊情况如何远程停止打卡。

最后由 icescat 编辑

@admin钉钉自动打卡脚本开发日记,新手小白0基础试水,求勿喷 中说:

厉害==

大神你别这么说,我这写的都是跟浅的代码,没啥太多技术含量,边写边发现好多问题,到时候还要向你请教🤝

@dcrclub钉钉自动打卡脚本开发日记,新手小白0基础试水,求勿喷 中说:

好复杂啊

复杂个毛线,你们这群大神轮番调侃我☹

借着周末测试了一下脚本,结果周一上班没给我打卡🙀 ,回来公司一看,js定时有点问题,莫名其妙的没有启动。可能是我社了定时开关机,JS没有启动。上网了解了一下,有个叫智能触发器(MacroDroid)的玩意跟autojs配合会比较好,花了时间研究了一下,也还简单,设置图贴上
0_1543804343156_72396a86-be6f-43f5-bfb6-7479d3eccef1-image.png

下班打卡也差不多,时间修改一下就行

  • 59
    帖子
  • 10495
    浏览

与 Auto.js 的连接断开,我们正在尝试重连,请耐心等待