回答
编写企业微信私有版打卡脚本的核心是通过无障碍服务模拟用户点击与滑动操作。由于私有版的包名、界面结构或安全策略可能与公开版存在差异,你需要先使用 Hamibot 的 UI 检查器获取准确的控件属性。以下提供兼容 Rhino 1.7.15 引擎的脚本框架、适配步骤与最佳实践。
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
device.keepScreenOn();
// 1. 启动企业微信(私有版包名可能不同,请通过 Hamibot 设备管理或 adb 确认)
var appName = "企业微信";
launchApp(appName);
// 2. 等待主界面加载(使用 UI 元素等待替代固定 sleep,提升稳定性)
if (!text("工作台").findOne(10000)) {
toast("应用启动超时或界面未加载");
exit();
}
// 3. 进入打卡模块
var workTab = text("工作台").findOne(3000);
if (workTab) {
workTab.click();
sleep(1500);
} else {
toast("未找到工作台入口");
exit();
}
// 4. 定位并点击打卡按钮(选择器需根据实际 UI 调整)
var clockInBtn = text("打卡").findOne(5000);
if (clockInBtn) {
clockInBtn.click();
sleep(2000);
// 处理常见弹窗(位置确认、网络提示、权限申请等)
var confirmBtn = text("确定").findOne(3000) || text("允许").findOne(3000);
if (confirmBtn) {
confirmBtn.click();
sleep(1000);
}
toast("打卡指令已执行");
} else {
toast("未找到打卡按钮,请检查当前页面或使用 UI 检查器更新选择器");
}
// 5. 执行完成后释放屏幕常亮
device.cancelKeepingAwake();
关键适配步骤
- 获取私有版包名与控件:在 Hamibot 控制台连接设备后,打开“UI 检查器”悬浮窗。进入打卡页面,点击目标按钮,记录
text、id、className或desc。私有版常使用自定义控件,若text()失效,可改用className("android.widget.Button").text("打卡")或id("com.xxx:id/btn_clock")。 - 处理异步加载:企业微信页面多为网络请求后渲染,务必使用
findOne(timeout)或waitFor()等待元素出现,避免脚本在元素未渲染时点击失败。 - 包名与启动页差异:私有版可能修改了包名。你可在脚本开头添加
log(currentPackage()); log(currentActivity());运行后查看日志,替换launchApp()中的名称。 - 定时任务配置:在 Hamibot 控制台创建定时计划,使用 Cron 表达式(如工作日 08:55 执行:
55 8 * * 1-5),开启“失败重试”与“运行日志”便于追踪异常。
技术限制与合规说明
- 企业微信内置防自动化机制(模拟点击检测、GPS/Wi-Fi 校验、人脸/活体验证)。Hamibot 仅支持标准无障碍模拟,无法绕过企业安全策略。若打卡流程包含人脸验证或强制内网 Wi-Fi,脚本仅能完成前置点击,后续步骤需人工介入。
- 请勿使用坐标点击(
click(x, y)),屏幕分辨率或状态栏变化会导致点击偏移。始终优先使用控件选择器。
最佳实践建议
- 使用
try...catch包裹核心逻辑,结合log()输出关键节点状态,便于控制台排查。 - 在脚本开头添加
auto.waitFor()确保无障碍服务已授权,否则findOne()会直接返回 null。 - 企业微信版本更新后界面结构可能变化,建议每月使用 UI 检查器验证一次选择器有效性。
- 若需处理复杂弹窗或滑动列表,可结合
scrollForward()、swipe()与textContains()进行模糊匹配。
如需针对你私有版的具体界面定制选择器或处理特殊弹窗逻辑,可提供 UI 检查器导出的控件树片段,我将为你优化对应代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实