回答
以下是为你编写的 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();
核心逻辑说明
- 触发条件:脚本通过
while循环每 30 秒检查一次当前时间与 WiFi 名称。当时间到达 8:00 且 WiFi 为freewifi时触发流程。 - 防重复执行:使用
isDoneToday标记确保同一天内仅执行一次。每日 23:59 自动重置标记。 - UI 交互:采用
text()与textContains()进行元素匹配,配合findOne(timeout)避免阻塞。所有点击操作后均加入sleep()等待页面渲染。 - 引擎兼容:已严格使用
var声明变量,未使用箭头函数、默认参数等 Rhino 1.7.15 不支持的语法。
部署与调试步骤
- 在 Hamibot 控制台创建新脚本,将上述代码完整粘贴。
- 在目标 Android 设备上安装 Hamibot 客户端,授予 无障碍服务 与 悬浮窗权限。
- 首次运行前,使用 Hamibot 的 布局分析工具 抓取企业微信实际界面元素:
- 确认“工作台”、“打卡”、“公司切换”按钮的
text、id或desc属性。 - 若企业微信版本更新导致文本变化,需同步修改脚本中的
text("xxx")参数。
- 确认“工作台”、“打卡”、“公司切换”按钮的
- 在控制台设置脚本为 常驻运行 或 定时启动(建议设置为每日 7:55 启动,预留网络与页面加载时间)。
关键注意事项
- WiFi 名称匹配:
device.getWifiName()返回的值可能包含前后空格或大小写差异,脚本已做trim()处理。若仍不匹配,可在控制台打印currentWifi实际值进行核对。 - 企业微信 UI 差异:不同企业配置的工作台布局可能不同。若“打卡”入口被折叠或改名,需改用
id()或className()定位,或通过滑动scrollForward()查找。 - 权限与后台保活:Android 系统可能限制后台脚本运行。请在设备设置中将 Hamibot 加入电池优化白名单,并锁定后台任务。
- 异常处理:脚本已包含基础日志输出。若打卡失败,请查看 Hamibot 控制台日志,定位具体中断步骤并调整对应
sleep()时长或选择器。
如需针对特定企业微信版本优化选择器,或需要添加打卡结果截图上传、失败重试机制,可提供具体界面结构,我将为你补充对应逻辑。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实