刚搜东西看到了[Android] 钉钉自动登录(daka)工具,免root,支持安卓这篇文章 ,然后看到了下面这个评论,并且评论里问题很多
我就分享一个我用的脚本吧,原理是一样的,我觉得我的脚本基本可以解决上面的问题
不过我这个前提是加入电池优化白名单,开启无障碍,开启应用自启 加个前台服务更稳定!
说明一下:
我的这个脚本不是一直亮屏的(我的这个手机没密码,直接亮屏就进系统了)
定时打开屏幕,自动打开钉钉(设置了极速打开),发送打卡结果到企业微信(关联微信会直接在微信接受消息)
可以设置随机时间 并不是总是一样的时间打卡
如果退出登录了会自动登录
后来又给领导写了带数字密码开锁的
手机偶尔抽风没打卡,害得我又跑公司打个卡,索性又写了个1分钟检查的脚本,每分钟就检查一次我是不是设置的立即打卡,如果设置了,就再调用一次打卡程序再次打卡
下面是我用的代码(自己写的比较乱)
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | //脚本执行时保持屏幕常亮,默认5分钟 var keepScreenOnMinutes = 5; //随机休眠时间段 var randomSleepMinutes = 3; //进入打卡流程 punchTheClock(); function punchTheClock() { //唤醒手机 device.wakeUp(); sleep(2 * 1000); //判断屏幕是否唤醒成功 if (!device.isScreenOn()) { console.error( "屏幕未唤醒,退出脚本" ); exit(); } //脚本执行时保持屏幕常亮 5分钟 device.keepScreenOn(keepScreenOnMinutes * 60 * 1000); //随机休眠 var sleep_time = random(0, randomSleepMinutes * 60 * 1000); sleep(sleep_time); //打开钉钉 console.log( "打开钉钉" ); launchApp( "钉钉" ); sleep(3 * 1000); //判断是否已登录 if (id( "tv_welcome_name" ).exists()) { console.error( "钉钉未登录" ); //启动自动登录 reLogin(); } //自动打卡通知 if (click( "我知道了" )) { console.log( "自动打卡成功" ); } //点击忽略更新(如果有) if (click( "暂不更新" )) { console.log( "点击暂不更新" ); } sleep(5 * 1000); //点击工作台 console.log( "点击工作台" ); clickMessage( "工作台" ); sleep(1 * 1000); //点击考勤进入打卡页面 console.log( "点击考勤打卡" ); clickMessage( "考勤打卡" ); sleep(2 * 1000); //判断是否休息日 if (className( "android.view.View" ).text( "今日休息" ).exists()) { console.log( "今日休息" ); back(); launchApp( "Auto.js" ); exit(); } //需要手动点击打卡按钮的 可以添加在这里 //点击 查看打卡结果 console.log( "查看打卡结果" ); var x = className( "android.view.View" ).textContains( "已打卡" ).find(); if (x.length == 0){ x = className( "android.view.View" ).textContains( "打卡时间" ).find(); } var send_msg = "未打卡成功" ; if (x.length > 0) { send_msg = x[x.length-1].text(); } console.log( "打卡结果:" , send_msg); //发送结果到微信 sendWeiChat(getdate() + " " + send_msg); //返回控制台(避免下次启动出错) back(); //返回主页 home(); sleep(1000); //打开autojs launchApp( "Auto.js" ); //关闭屏幕常亮 console.log( "关闭屏幕常亮" ); device.cancelKeepingAwake(); console.log( "打卡完成" ); exit(); } function reLogin() { sleep(2 * 1000); //启动自动登录 if (id( "cb_privacy" ).exists()) { //勾选协议 id( "cb_privacy" ).click(); id( "et_pwd_login" ).setText( "xxxxxxx" ); clickMessage( "登录" ); console.log( "登录成功" ); sleep(1 * 1000); } } //判断网络情况,如果没有网络,结束脚本运行 function internetCheck() { var url = "m.baidu.com" ; var res = http.get(url); if (res.statusCode != 200) { console.error( "网络不可用" ); exit(); } } //判断GPS是否可用,如果不可用,结束脚本运行 function gpsCheck() { importClass(android.location.LocationManager); importClass(android.content.Context); var locationManager = context.getSystemService(Context.LOCATION_SERVICE); if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { console.error( "GPS不可用,无法打卡" ); exit(); } } //根据控件文字点击,如果点击失败,则说明打卡流程无法正常进行,结束脚本运行 function clickMessage(message) { var n = 3; var logo = false ; while (n--) { if (click(message)) { logo = true ; break ; } sleep(1 * 1000); } if (logo == false ) { console.error( "点击" + message + "出错" ); exit(); } } //向企业微信发送信息 function sendWeiChat(send_data) { var corpid = "xxxxx" ; //企业id 自己改 var corpsecret = "xxxxx" ; //企业应用secret 自己改 var HEADERS = { "Content-Type" : "application/json ;charset=utf-8" }; var r = http.get( "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret, { headers: HEADERS, } ); var js = r.body.json(); var token = js.access_token; var data = { touser: "@all" , msgtype: "text" , agentid: 1000003, //应用id 自己改 text: { content: send_data }, safe: 0, enable_id_trans: 0, enable_duplicate_check: 0, duplicate_check_interval: 1800, }; var wechaturl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token; http.postJson(wechaturl, data, { headers: HEADERS }); } function getdate() { fdate = new Date(); year = fdate.getFullYear(); month = fdate.getMonth(); day = fdate.getDate(); return year + "-" + month + "-" + day; } |
下面是带锁屏密码的(不同手机需要调整一下滑动的轨迹)
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | //脚本执行时保持屏幕常亮,默认5分钟 var keepScreenOnMinutes = 5; //随机休眠时间段 var randomSleepMinutes = 1; //进入打卡流程 punchTheClock(); function punchTheClock() { //唤醒手机 device.wakeUp(); sleep(2 * 1000); //判断屏幕是否唤醒成功 if (!device.isScreenOn()) { console.error( "屏幕未唤醒,解锁手机" ); exit(); } else { unlock(); } //脚本执行时保持屏幕常亮 5分钟 device.keepScreenOn(keepScreenOnMinutes * 60 * 1000); //随机休眠 var sleep_time = random(0, randomSleepMinutes * 60 * 1000); sleep(sleep_time); //打开钉钉 console.log( "打开钉钉" ); launchApp( "钉钉" ); sleep(3 * 1000); //判断是否已登录 if (id( "tv_welcome_name" ).exists()) { console.error( "钉钉未登录" ); //启动自动登录 reLogin(); } //自动打卡通知 if (click( "我知道了" )) { console.log( "自动打卡成功" ); } //点击忽略更新(如果有) if (click( "暂不更新" )) { console.log( "点击暂不更新" ); } sleep(5 * 1000); //点击工作台 console.log( "点击工作台" ); clickMessage( "工作台" ); sleep(1 * 1000); //点击考勤进入打卡页面 console.log( "点击考勤打卡" ); clickMessage( "考勤打卡" ); sleep(5 * 1000); //判断是否休息日 if (className( "android.view.View" ).text( "今日休息" ).exists()) { console.log( "今日休息" ); back(); launchApp( "Auto.js" ); exit(); } //点击 查看打卡结果 console.log( "查看打卡结果" ); var x = className( "android.view.View" ).textContains( "已打卡" ).find(); var send_msg = "未打卡成功" ; if (x.length > 1) { send_msg = x[1].text(); } else if (x.length > 0) { send_msg = x[0].text(); } console.log( "打卡结果:" , send_msg); //发送结果到微信 sendWeiChat(getdate() + " " + send_msg); //返回控制台(避免下次启动出错) back(); //返回主页 home(); sleep(1000); //打开autojs launchApp( "Auto.js" ); //关闭屏幕常亮 console.log( "关闭屏幕常亮" ); device.cancelKeepingAwake(); console.log( "打卡完成" ); exit(); } function reLogin() { sleep(2 * 1000); //启动自动登录 if (id( "cb_privacy" ).exists()) { //勾选协议 id( "cb_privacy" ).click(); id( "et_pwd_login" ).setText( "0000" ); //登录密码 clickMessage( "登录" ); console.log( "登录成功" ); sleep(1 * 1000); } } //判断网络情况,如果没有网络,结束脚本运行 function internetCheck() { var url = "m.baidu.com" ; var res = http.get(url); if (res.statusCode != 200) { console.error( "网络不可用" ); exit(); } } //判断GPS是否可用,如果不可用,结束脚本运行 function gpsCheck() { importClass(android.location.LocationManager); importClass(android.content.Context); var locationManager = context.getSystemService(Context.LOCATION_SERVICE); if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { console.error( "GPS不可用,无法打卡" ); exit(); } } //根据控件文字点击,如果点击失败,则说明打卡流程无法正常进行,结束脚本运行 function clickMessage(message) { var n = 3; var logo = false ; while (n--) { if (click(message)) { logo = true ; break ; } sleep(1 * 1000); } if (logo == false ) { console.error( "点击" + message + "出错" ); exit(); } } //向企业微信发送信息 function sendWeiChat(send_data) { var corpid = "xxxx" ; //企业id 自己改 var corpsecret = "xxxx" ; //企业应用secret 自己改 var HEADERS = { "Content-Type" : "application/json ;charset=utf-8" }; var r = http.get( "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret, { headers: HEADERS, } ); var js = r.body.json(); var token = js.access_token; var data = { touser: "@all" , msgtype: "text" , agentid: 1000005, //应用id text: { content: send_data }, safe: 0, enable_id_trans: 0, enable_duplicate_check: 0, duplicate_check_interval: 1800, }; var wechaturl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token; http.postJson(wechaturl, data, { headers: HEADERS }); } function getdate() { fdate = new Date(); year = fdate.getFullYear(); month = fdate.getMonth(); day = fdate.getDate(); return year + "-" + month + "-" + day; } // 解锁屏幕 function unlock() { device.wakeUp(); if (isDeviceLocked()){ sleep(500); swipe(400, 1800, 800, 230, 1000); //上滑轨迹 自己调整 sleep(500); var password = "1100" ; //这里输入你手机的密码 for ( var i = 0; i < password.length; i++) { var p = text(password[i].toString()).findOne().bounds(); click(p.centerX(), p.centerY()); sleep(100); } } } //判断是否有屏幕锁 function isDeviceLocked() { importClass(android.app.KeyguardManager); importClass(android.content.Context); var km = context.getSystemService(Context.KEYGUARD_SERVICE); return km.isKeyguardLocked(); } |
这是我1分钟定时查询是否需要重新打卡的脚本(这个就是写了个接口,用redis存了一个字段值,1就再次打卡)
1 2 3 4 5 6 7 8 9 | var res = http.get( "http://xxx.xxx.xx/api?key=Piz.liu_dk" ); if (res.body.string()== "1" ){ console.log( "立即打卡" ) http.get( "http://xxx.xxx.xx/set?key=Piz.liu_dk&value=0" ); var dk = require( "定时打卡.js" ); dk.punchTheClock(); } else { console.log( "不打卡" ); } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | function clickDK() { var n = 3; var logo = false ; while (n--) { if (click( "上班打卡" ) || click( "下班打卡" )) { logo = true ; sleep(2 * 1000); break ; } sleep(1 * 1000); } if (logo == false ) { console.error( "点击打卡出错" ); exit(); } } |
因为没有自己写定时任务(也是怕自己打包的程序权限没开够,被杀掉进程所以用了autojs自带的,这样稳定一点)
不会用的小伙伴看下面的图
使用步骤
百度下载autojs(4.x版本是免费的)
1.打开相关权限
2.在页面添加脚本,复制修改后的脚本保存
3.在脚本列表右边的三点里面有更多里面有定时任务 设定要打卡的时间就行了
如果不需要打开通知企业微信的,可以注释掉 // sendWeiChat(getdate() + " " + send_msg); 这一行
4.设置完成可以在"管理"(pro在那个图二那个里面)可以看到是否添加成功
5.需要自己修改的地方 我已经在代码后面写了自己改的备注
6.完成之后,在脚本列表运行一下,看看是否正常