标签 节假日识别 下的文章

最近公司需要晚上企微打卡作为加班证据。于是乎就想着实现一个自动化企业微信打卡功能解放下班时间。

需求清单

  • 自动跳过节假日和调休打卡

  • 拒绝死板,在指定时间段内的随机时间打卡

  • 手机能自动亮屏、上滑、解开图案锁


实践:

实践步骤:安卓机 → AI (生成脚本) → Hamibot(远程)

  1. 一台闲置安卓(我以 Android 16 / 系统 ColorOS16 为例)。

  2. 手机下载安装 Hamibot。Web 端注册配对,获取远程控制权限。

  1. 脚本编写,

脚本逻辑

  1. 调用 API 查今天是不是法定节假日 / 调休。

  2. 打卡时间随机延迟 0-5 分钟。

  3. 执行模拟上滑与手势路径(图案解锁)。

  4. 靠坐标解锁,靠文字识别自动点击(工作台 → 打卡 → 上班 / 下班打卡)。

脚本如下,佬友们可自定义修改第二、三步骤。目前的脚本逻辑是设置的 5 分钟随机时间,息屏下需绘制图案解锁。

/*
 * 名称:企业微信自动打卡(智能节假日版)
 * 功能:跳过节假日/周末 + 识别调休 + 随机延迟 + 强力解锁 + 自动打卡
 */

auto.waitFor();
var width = device.width;
var height = device.height;

// ================= 配置区 =================

// 1. 随机延迟时间 (分钟)
var maxDelayMinutes = 5; 

// 2. 您的定制解锁坐标 (a -> b -> c -> d)
var unlockPoints = [
    [302, 1429], 
    [628, 1421], 
    [636, 1746], 
    [274, 1766] 
];

var punchText = "上班打卡"; 
// =========================================

function main() {
    console.show(); 
    log("脚本已启动,正在检查节假日...");

    // --- 第一步:检查是否为节假日 ---
    // 如果是假期或周末(且非调休),直接退出脚本
    if (isHolidayOrWeekend()) {
        log("今天是节假日或周末,无需打卡");
        log("脚本自动退出");
        sleep(3000);
        exit();
        return;
    }

    // --- 第二步:随机延迟 (模拟真人) ---
    var delayTime = random(0, maxDelayMinutes * 60 * 1000); 
    log("今天是工作日,准备打卡");
    log("随机延迟: " + (delayTime / 1000).toFixed(1) + " 秒");
    
    sleep(delayTime);
    log(">>> 延迟结束,开始行动");

    // --- 第三步:执行解锁流程 ---
    smartUnlock();

    // --- 第四步:打开企业微信 ---
    log("打开企业微信...");
    launchApp("企业微信");
    sleep(6000); 
    waitForPackage("com.tencent.wework");

    // --- 第五步:寻找工作台 ---
    var workbench = null;
    for (var i = 0; i < 5; i++) {
        workbench = text("工作台").findOne(2000);
        if (workbench) break;
    }
    if (workbench) {
        clickElement(workbench);
        sleep(3000);
    }

    // --- 第六步:进入打卡应用 ---
    log("寻找打卡图标...");
    var checkInApp = text("打卡").findOne(5000);
    if (checkInApp) {
        clickElement(checkInApp);
        log("进入打卡页面,等待加载...");
        sleep(8000); 
    }

    // --- 第七步:执行打卡点击 ---
    log("寻找按钮: " + punchText);
    var punchBtn = text(punchText).findOne(3000);
    if (!punchBtn) punchBtn = descContains("打卡").findOne(2000);

    if (punchBtn) {
        clickElement(punchBtn);
        toast("✅ 打卡指令已执行");
        log("打卡成功!");
    } else {
        log("未识别到文字,执行坐标盲点兜底...");
        click(width / 2, height * 0.65); 
    }
    
    log("脚本运行结束");
    sleep(3000);
}

// === 新增:节假日检查函数 ===
function isHolidayOrWeekend() {
    // 获取今天的日期格式 YYYY-MM-DD
    var date = new Date();
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    month = month < 10 ? '0' + month : month;
    day = day < 10 ? '0' + day : day;
    var dateStr = year + '-' + month + '-' + day;
    
    var apiUrl = "http://timor.tech/api/holiday/info/" + dateStr;
    log("正在查询日期: " + dateStr);
    
    try {
        // --- 关键修改点:添加 User-Agent 伪装 ---
        var res = http.get(apiUrl, {
            headers: {
                "User-Agent": "Mozilla/5.0 (Linux; Android 10; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36",
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
            }
        });
        // -------------------------------------
        if (res.statusCode == 200) {
            var json = res.body.json();
            // API 返回值 type 类型:
            // 0: 工作日, 1: 周末, 2: 节日, 3: 调休(要上班)
            var type = json.type.type;
            var name = json.type.name;
            
            if (type == 0) {
                log("API判定: 普通工作日");
                return false; // 不跳过
            } else if (type == 1) {
                log("API判定: 周末 (" + name + ")");
                return true;  // 跳过
            } else if (type == 2) {
                log("API判定: 节假日 (" + name + ")");
                return true;  // 跳过
            } else if (type == 3) {
                log("API判定: 调休工作日 (" + name + ")");
                return false; // 不跳过 (这是关键!周日调休上班)
            }
        } else {
            log("API 请求失败,状态码: " + res.statusCode);
        }
    } catch (e) {
        log("网络请求异常: " + e);
        log("⚠️ 为了防止漏打卡,网络错误时默认视为工作日");
    }
    
    // 如果网络失败,默认返回 false (即视为工作日,确保安全)
    // return false;
}

// === 智能解锁函数 ===
function smartUnlock() {
    if (!device.isScreenOn()) {
        log("屏幕熄灭,开始解锁...");
        device.wakeUp();
        sleep(2000); 
        
        log("执行上滑...");
        gesture(300, [width / 2, height * 0.8], [width / 2, height * 0.1]);
        sleep(1500); 
        
        log("绘制图案...");
        gesture.apply(null, [2000].concat(unlockPoints));
        sleep(3000); 
    }
}

function clickElement(uiobj) {
    if (uiobj) {
        if (uiobj.clickable()) {
            uiobj.click();
        } else {
            var p = uiobj.parent();
            if (p && p.clickable()) {
                p.click();
            } else {
                click(uiobj.bounds().centerX(), uiobj.bounds().centerY());
            }
        }
    }
}

main();
  1. Hamibot 配置脚本 + 定时任务。

实践效果
(解锁那段被录制软件屏蔽成了黑屏)

实现企业微信全自动 “无感知” 打卡5

常见问题

  • 强烈建议使用闲置机,隐私第一,且不打扰到日常机的使用。

  • hamibot 偶尔被误杀后台需要重新开启无障碍。

  • hamibot 开启的权限有哪些?

这是我运行整套流程给 app 开的权限,比较关注软件权限问题的佬友可以参考。




📌 转载信息
原作者:
ssm_123
转载时间:
2026/1/4 12:23:46