本帖最后由 Piz.liu 于 2022-8-5 13:18 编辑
刚搜东西看到了[Android] 钉钉自动登录(daka)工具,免root,支持安卓这篇文章 ,然后看到了下面这个评论,并且评论里问题很多
各位同志都不看一眼吗?都没用就瞎评论!这软件能用???谁来解释下我的问题:
1、手机必须关闭自动锁屏,这一般手机就没办法;
2、手机常亮的话是不是不安全,上热加没电?
2、此自动登录器需手机常亮才可以运行,那我为什么不直接钉钉常亮,自动打卡?
我就分享一个我用的脚本吧,原理是一样的,我觉得我的脚本基本可以解决上面的问题
不过我这个前提是加入电池优化白名单,开启无障碍,开启应用自启 加个前台服务更稳定!
说明一下:
我的这个脚本不是一直亮屏的(我的这个手机没密码,直接亮屏就进系统了)
定时打开屏幕,自动打开钉钉(设置了极速打开),发送打卡结果到企业微信(关联微信会直接在微信接受消息)
可以设置随机时间 并不是总是一样的时间打卡
如果退出登录了会自动登录
后来又给领导写了带数字密码开锁的
手机偶尔抽风没打卡,害得我又跑公司打个卡,索性又写了个1分钟检查的脚本,每分钟就检查一次我是不是设置的立即打卡,如果设置了,就再调用一次打卡程序再次打卡
下面是我用的代码(自己写的比较乱)
[JavaScript] 纯文本查看 复制代码 //脚本执行时保持屏幕常亮,默认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;
}
下面是带锁屏密码的(不同手机需要调整一下滑动的轨迹)
[JavaScript] 纯文本查看 复制代码 //脚本执行时保持屏幕常亮,默认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就再次打卡)
[JavaScript] 纯文本查看 复制代码 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("不打卡");
}
如果不是自动打卡,需要点击打卡按钮 ,可以在代码最后添加上下面的方法,然后在代码中间 查看打卡结果 之前加上 clickDK();
[JavaScript] 纯文本查看 复制代码 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.完成之后,在脚本列表运行一下,看看是否正常
|