需要创建针对企业微信的脚本,需求如下:
在每个工作日上午7:30、下午14:00进行上班打卡;
在每个工作日中午12:10、下午17:40进行下班打卡。
回答
// 文档地址 https://docs.hamibot.com/
// 企业微信自动打卡脚本(Rhino 1.7.15 兼容版本)
var PACKAGE_NAME = "com.tencent.wework";
function isWorkday() {
var day = new Date().getDay();
return day >= 1 && day <= 5;
}
function getClockTypeByTime() {
var now = new Date();
var h = now.getHours();
var m = now.getMinutes();
var timeStr = (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m);
if (timeStr >= "07:25" && timeStr <= "07:35") return "上班";
if (timeStr >= "12:05" && timeStr <= "12:15") return "下班";
if (timeStr >= "13:55" && timeStr <= "14:05") return "上班";
if (timeStr >= "17:35" && timeStr <= "17:45") return "下班";
return null;
}
function navigateToClockPage() {
app.launchPackage(PACKAGE_NAME);
waitForPackage(PACKAGE_NAME, 500);
sleep(2000);
var workbench = text("工作台").findOne(5000);
if (workbench) {
workbench.click();
sleep(1500);
} else {
log("未找到工作台入口");
return false;
}
var clockEntry = text("打卡").findOne(5000);
if (clockEntry) {
clockEntry.click();
sleep(2000);
return true;
} else {
log("未找到打卡应用入口");
return false;
}
}
function doClock(type) {
log("准备执行" + type + "打卡");
if (!navigateToClockPage()) {
hamibot.exit();
}
var btn = textContains(type + "打卡").findOne(6000);
if (!btn) {
btn = descContains(type + "打卡").findOne(3000);
}
if (btn) {
var b = btn.bounds();
click(b.centerX(), b.centerY());
log("已点击打卡按钮");
sleep(2000);
var successTip = textContains("打卡成功").findOne(4000);
if (successTip) {
log(type + "打卡成功");
} else {
log("未捕获成功提示,请手动核对");
}
} else {
log("未找到" + type + "打卡按钮,可能已打卡或UI结构变化");
}
home();
hamibot.exit();
}
// 主执行逻辑
if (!isWorkday()) {
log("非工作日,跳过执行");
hamibot.exit();
}
var targetType = getClockTypeByTime();
if (targetType) {
doClock(targetType);
} else {
log("当前时间不在打卡容错窗口内");
hamibot.exit();
}
部署与使用建议
-
定时触发方式(强烈推荐)
不要使用脚本内死循环轮询时间。请在 Hamibot 控制台为同一脚本创建 4 个定时任务:0 30 7 * * 1-5(工作日 07:30)0 10 12 * * 1-5(工作日 12:10)0 0 14 * * 1-5(工作日 14:00)0 40 17 * * 1-5(工作日 17:40)
脚本内的时间窗口仅作触发容错,控制台定时更精准且大幅降低耗电。
-
UI 选择器适配
企业微信的“工作台”布局受企业管理员配置影响,不同版本或企业可能使用id、desc或动态文本。若text("打卡")失效:- 使用 Hamibot 的 布局分析工具 抓取实际节点的
id或desc。 - 将
text("打卡")替换为id("xxx").findOne(5000)或desc("打卡")。
- 使用 Hamibot 的 布局分析工具 抓取实际节点的
-
系统权限与保活
- 授予 Hamibot 无障碍服务、后台弹出界面、悬浮窗 权限。
- 在系统电池优化中将 Hamibot 和企业微信设为 无限制/白名单,关闭省电策略。
- 锁定 Hamibot 后台,避免系统杀进程导致定时任务失效。
-
节假日与调休处理
脚本仅按周一到周五判断工作日。中国法定节假日及周末调休需你手动在控制台暂停/启用对应定时任务,或接入第三方节假日 API 进行动态判断(需额外网络请求逻辑)。 -
执行环境说明
脚本已严格适配 Rhino 1.7.15 引擎,未使用箭头函数、默认参数等不兼容语法。waitForPackage与bounds().centerX()调用方式符合 Hamibot 标准 API。
按上述步骤配置后,脚本可在指定时间自动完成企业微信打卡。如遇到 UI 节点定位失败,提供布局分析截图或节点属性,我可帮你调整选择器逻辑。