帮我写个脚本,每天 8 点开始,当连接 WiFi 名为 freewifi 的时候自动打开企业微信,转换公司,然后进入工作台找到打卡界面,进行打卡

HAMI_2760369644 · 2 天前

回答

Hamibot AI
1
· 2 天前

以下是为你编写的 Hamibot 自动化打卡脚本。脚本已针对 Rhino 1.7.15 引擎进行兼容处理,包含时间判断、WiFi 校验、应用启动与 UI 自动化交互逻辑。

// 文档地址 https://docs.hamibot.com/
"auto";
auto.waitFor();
console.show();

var TARGET_WIFI = "freewifi";
var TARGET_HOUR = 8;
var isDoneToday = false;

// 获取当前连接的 WiFi 名称
function getWifiName() {
    var name = device.getWifiName();
    return name ? name.trim() : "";
}

// 判断是否到达目标时间(8:00 及之后)
function isTargetTime() {
    var now = new Date();
    return now.getHours() === TARGET_HOUR && now.getMinutes() >= 0;
}

// 启动企业微信
function openWeCom() {
    launch("com.tencent.wework");
    sleep(5000); // 等待应用冷启动
}

// 切换公司(需根据实际界面调整选择器)
function switchCompany(companyName) {
    // 企业微信切换入口通常在首页顶部或“我”页面
    var companyBtn = textContains(companyName).findOne(3000);
    if (companyBtn) {
        companyBtn.click();
        sleep(1500);
        return true;
    }
    console.warn("未找到公司切换入口,请使用布局分析工具获取准确选择器");
    return false;
}

// 导航至打卡界面并执行打卡
function navigateAndClockIn() {
    // 1. 进入工作台
    var workbench = text("工作台").findOne(5000);
    if (workbench) {
        workbench.click();
        sleep(2000);
    } else {
        console.warn("未找到工作台按钮");
        return false;
    }

    // 2. 进入打卡模块
    var clockInEntry = text("打卡").findOne(5000);
    if (clockInEntry) {
        clockInEntry.click();
        sleep(2000);
    } else {
        console.warn("未找到打卡入口");
        return false;
    }

    // 3. 点击打卡按钮(通常为“上班打卡”或“确认打卡”)
    var doClockIn = textContains("打卡").findOne(5000);
    if (doClockIn) {
        doClockIn.click();
        console.log("已触发打卡操作");
        return true;
    }
    console.warn("未找到打卡执行按钮");
    return false;
}

// 主循环
function main() {
    console.log("脚本已启动,等待触发条件...");
    while (true) {
        var currentWifi = getWifiName();
        var timeMatch = isTargetTime();

        if (timeMatch && currentWifi === TARGET_WIFI && !isDoneToday) {
            console.log("条件满足:时间 " + TARGET_HOUR + ":00 且连接 WiFi " + TARGET_WIFI);
            openWeCom();
            sleep(2000);

            // 如需切换公司,取消下方注释并替换实际公司名称
            // switchCompany("你的目标公司名称");

            if (navigateAndClockIn()) {
                isDoneToday = true;
                console.log("今日打卡流程执行完毕");
            } else {
                console.error("打卡流程中断,请检查界面元素或网络状态");
            }
        }

        // 每日 23:59 重置执行标记,确保次日可再次触发
        var now = new Date();
        if (now.getHours() === 23 && now.getMinutes() >= 59) {
            isDoneToday = false;
        }

        sleep(30000); // 每 30 秒轮询一次状态
    }
}

main();

核心逻辑说明

  1. 触发条件:脚本通过 while 循环每 30 秒检查一次当前时间与 WiFi 名称。当时间到达 8:00 且 WiFi 为 freewifi 时触发流程。
  2. 防重复执行:使用 isDoneToday 标记确保同一天内仅执行一次。每日 23:59 自动重置标记。
  3. UI 交互:采用 text()textContains() 进行元素匹配,配合 findOne(timeout) 避免阻塞。所有点击操作后均加入 sleep() 等待页面渲染。
  4. 引擎兼容:已严格使用 var 声明变量,未使用箭头函数、默认参数等 Rhino 1.7.15 不支持的语法。

部署与调试步骤

  1. 在 Hamibot 控制台创建新脚本,将上述代码完整粘贴。
  2. 在目标 Android 设备上安装 Hamibot 客户端,授予 无障碍服务悬浮窗权限
  3. 首次运行前,使用 Hamibot 的 布局分析工具 抓取企业微信实际界面元素:
    • 确认“工作台”、“打卡”、“公司切换”按钮的 textiddesc 属性。
    • 若企业微信版本更新导致文本变化,需同步修改脚本中的 text("xxx") 参数。
  4. 在控制台设置脚本为 常驻运行定时启动(建议设置为每日 7:55 启动,预留网络与页面加载时间)。

关键注意事项

  • WiFi 名称匹配device.getWifiName() 返回的值可能包含前后空格或大小写差异,脚本已做 trim() 处理。若仍不匹配,可在控制台打印 currentWifi 实际值进行核对。
  • 企业微信 UI 差异:不同企业配置的工作台布局可能不同。若“打卡”入口被折叠或改名,需改用 id()className() 定位,或通过滑动 scrollForward() 查找。
  • 权限与后台保活:Android 系统可能限制后台脚本运行。请在设备设置中将 Hamibot 加入电池优化白名单,并锁定后台任务。
  • 异常处理:脚本已包含基础日志输出。若打卡失败,请查看 Hamibot 控制台日志,定位具体中断步骤并调整对应 sleep() 时长或选择器。

如需针对特定企业微信版本优化选择器,或需要添加打卡结果截图上传、失败重试机制,可提供具体界面结构,我将为你补充对应逻辑。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实