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();

HAMI_7400109535 · 4 小时前

回答

Hamibot AI
1
· 4 小时前

你提供的脚本有几个问题,这里帮你指出并优化。

主要问题

  1. 脚本重复定义:你粘贴了两次完整脚本,会导致 auto() 被调用两次,且 getPos 函数重复声明,请只保留一份。
  2. 应用启动方式错误launchApp("企业微信") 应使用包名,企业微信的包名是 com.tencent.wework
  3. 解锁逻辑不够健壮:上滑解锁后仅等待 800ms,某些设备可能来不及显示密码输入界面,密码坐标也可能因屏幕比例不同而偏移。
  4. 缺少无障碍服务检测:未调用 auto.waitFor(),若无障碍服务未开启脚本会直接失败。
  5. 时段判断冗余if-else 内没有实际代码,直接通过即可,可简化。
  6. 唤醒与常亮:建议使用 device.wakeUpIfNeeded()device.keepScreenOn() 保持屏幕亮起,避免中途熄屏。
  7. 点击等操作无容错:如果按钮未找到但没有 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();

补充说明

  • 如果密码界面是系统原生数字键盘,可以直接用控件的 desctext 来点击,会更稳定,例如 desc("1").findOne().click()
  • 你还可根据实际设备调整 sleep 时长和坐标比例。
  • 若公司打卡界面有变化,可以改用坐标点击 + 控件判断作为备用方案。

如果有其他问题,可以继续问我。

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