auto();
// 锁屏密码
var pin = [5, 2, 1, 2, 4, 1];
// 判断时段
var hour = new Date().getHours();
// 时间范围判断
if (hour >= 8 && hour < 9) {
// 上班打卡,继续执行
} else if (hour >= 18 && hour < 20) {
// 下班打卡,继续执行
} else {
// 不在打卡时段,退出
exit();
}
// 随机延迟
sleep(random(0, 180) * 1000);
// 唤醒
device.wakeUp();
sleep(800);
var w = device.width;
var h = device.height;
// 上滑
swipe(w / 2, h * 0.8, w / 2, h * 0.3, 300);
sleep(1000);
// 密码键盘坐标
function getPos(n) {
if (n == 1) return [w * 0.17, h * 0.40];
if (n == 2) return [w * 0.50, h * 0.40];
if (n == 3) return [w * 0.83, h * 0.40];
if (n == 4) return [w * 0.17, h * 0.55];
if (n == 5) return [w * 0.50, h * 0.55];
if (n == 6) return [w * 0.83, h * 0.55];
if (n == 7) return [w * 0.17, h * 0.70];
if (n == 8) return [w * 0.50, h * 0.70];
if (n == 9) return [w * 0.83, h * 0.70];
if (n == 0) return [w * 0.50, h * 0.85];
}
// 输入密码
for (var i = 0; i < pin.length; i++) {
var p = getPos(pin[i]);
click(p[0], p[1]);
sleep(200);
}
sleep(1500);
// 打开企业微信
launchApp("企业微信");
sleep(5000);
// 点工作台
if (text("工作台").exists()) {
text("工作台").findOne().click();
} else {
click(w / 2, h * 0.88);
}
sleep(3000);
// 下滑
swipe(w / 2, h * 0.6, w / 2, h * 0.3, 300);
sleep(2000);
// 点打卡
if (text("打卡").exists()) {
text("打卡").findOne().click();
}
sleep(4000);
// 打卡
if (hour < 12) {
if (text("上班打卡").exists()) {
text("上班打卡").findOne().click();
}
} else {
if (text("下班打卡").exists()) {
text("下班打卡").findOne().click();
}
}
sleep(3000);
home();
回答
你提供的脚本有几个问题,这里帮你指出并优化。
主要问题
- 脚本重复定义:你粘贴了两次完整脚本,会导致
auto()被调用两次,且getPos函数重复声明,请只保留一份。 - 应用启动方式错误:
launchApp("企业微信")应使用包名,企业微信的包名是com.tencent.wework。 - 解锁逻辑不够健壮:上滑解锁后仅等待 800ms,某些设备可能来不及显示密码输入界面,密码坐标也可能因屏幕比例不同而偏移。
- 缺少无障碍服务检测:未调用
auto.waitFor(),若无障碍服务未开启脚本会直接失败。 - 时段判断冗余:
if-else内没有实际代码,直接通过即可,可简化。 - 唤醒与常亮:建议使用
device.wakeUpIfNeeded()和device.keepScreenOn()保持屏幕亮起,避免中途熄屏。 - 点击等操作无容错:如果按钮未找到但没有
else处理,可能卡住。
优化后的脚本
以下脚本兼容 Hamibot 的 Rhino 引擎,已添加必要注释。
// 文档地址 https://docs.hamibot.com/
auto();
auto.waitFor(); // 确保无障碍服务已开启
// 锁屏密码
var pin = [5, 2, 1, 2, 4, 1];
// 判断时段
var hour = new Date().getHours();
if (!(hour >= 8 && hour < 9) && !(hour >= 18 && hour < 20)) {
exit(); // 不在打卡时段,退出
}
// 随机延迟 (0~180秒)
sleep(random(0, 180) * 1000);
// 唤醒并保持常亮
device.wakeUpIfNeeded();
device.keepScreenOn(5 * 60 * 1000); // 保持5分钟常亮,防止熄屏
sleep(1000);
var w = device.width;
var h = device.height;
// 上滑解锁
swipe(w / 2, h * 0.8, w / 2, h * 0.3, 300);
sleep(1500); // 等待解锁界面出现
// 密码键盘坐标映射
function getPos(n) {
if (n == 1) return [w * 0.17, h * 0.40];
if (n == 2) return [w * 0.50, h * 0.40];
if (n == 3) return [w * 0.83, h * 0.40];
if (n == 4) return [w * 0.17, h * 0.55];
if (n == 5) return [w * 0.50, h * 0.55];
if (n == 6) return [w * 0.83, h * 0.55];
if (n == 7) return [w * 0.17, h * 0.70];
if (n == 8) return [w * 0.50, h * 0.70];
if (n == 9) return [w * 0.83, h * 0.70];
if (n == 0) return [w * 0.50, h * 0.85];
}
// 输入密码
for (var i = 0; i < pin.length; i++) {
var p = getPos(pin[i]);
click(p[0], p[1]);
sleep(200);
}
sleep(2000); // 等待解锁完成
// 打开企业微信
launchApp("com.tencent.wework");
sleep(5000);
// 点击工作台
if (text("工作台").exists()) {
text("工作台").findOne().click();
} else {
// 备用:点击底部中间位置
click(w / 2, h * 0.88);
}
sleep(3000);
// 下滑查找打卡入口
swipe(w / 2, h * 0.6, w / 2, h * 0.3, 300);
sleep(2000);
// 点击打卡
if (text("打卡").exists()) {
text("打卡").findOne().click();
} else {
toast("未找到打卡入口");
exit();
}
sleep(4000);
// 判断上班/下班打卡
if (hour < 12) {
if (text("上班打卡").exists()) {
text("上班打卡").findOne().click();
} else {
toast("未找到上班打卡按钮");
}
} else {
if (text("下班打卡").exists()) {
text("下班打卡").findOne().click();
} else {
toast("未找到下班打卡按钮");
}
}
sleep(3000);
home();
补充说明
- 如果密码界面是系统原生数字键盘,可以直接用控件的
desc或text来点击,会更稳定,例如desc("1").findOne().click()。 - 你还可根据实际设备调整
sleep时长和坐标比例。 - 若公司打卡界面有变化,可以改用坐标点击 + 控件判断作为备用方案。
如果有其他问题,可以继续问我。