回答
以下是实现钉钉自动打卡的脚本示例:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
function main() {
// 1. 解锁设备(建议保持屏幕常亮或已解锁状态)
device.wakeUpIfNeeded();
sleep(1000);
// 2. 打开钉钉
toastLog("正在打开钉钉...");
if (!launchApp("钉钉")) {
// 备用:通过包名启动
launch("com.alibaba.android.rimet");
}
sleep(5000); // 等待应用加载
// 3. 点击底部"工作台"
toastLog("进入工作台...");
var workTab = text("工作台").findOne(3000);
if (workTab) {
workTab.click();
sleep(2000);
} else {
toastLog("未找到工作台,尝试备用方案...");
// 部分版本可能在底部导航栏不同位置
click(device.width / 2, device.height - 100);
sleep(2000);
}
// 4. 点击"考勤打卡"
toastLog("寻找考勤打卡入口...");
var attendance = text("考勤打卡").findOne(3000) ||
textContains("打卡").findOne(3000);
if (attendance) {
attendance.click();
sleep(3000);
} else {
toastLog("未找到考勤打卡应用,请检查是否在工作台首页");
exit();
}
// 5. 处理可能的弹窗(更新提示、公告等)
var closeBtn = text("关闭").findOne(1000) ||
text("下次再说").findOne(1000) ||
desc("关闭").findOne(1000);
if (closeBtn) {
closeBtn.click();
sleep(1000);
}
// 6. 点击打卡按钮
toastLog("执行打卡...");
// 按钮文字可能是"上班打卡"或"下班打卡"
var punchBtn = textContains("打卡").findOne(3000);
if (punchBtn) {
// 尝试直接点击
if (punchBtn.clickable()) {
punchBtn.click();
} else {
// 如果控件不可点击,点击其父元素或坐标
var bounds = punchBtn.bounds();
click(bounds.centerX(), bounds.centerY());
}
toastLog("打卡按钮已点击");
sleep(2000);
// 7. 截图保存结果(可选)
// captureScreen("/sdcard/钉钉打卡_" + new Date().getTime() + ".png");
toastLog("打卡完成,请检查结果");
} else {
toastLog("未找到打卡按钮,可能已打卡或不在打卡时间");
}
}
main();
使用步骤
| 步骤 | 操作 |
|---|---|
| 1 | 确保手机已解锁,网络正常 |
| 2 | 运行脚本 |
| 3 | 脚本自动打开钉钉 → 工作台 → 考勤打卡 → 点击按钮 |
注意事项
| 问题 | 解决方法 |
|---|---|
| 定位打卡 | 脚本无法伪造 GPS,需确保手机在公司范围内 |
| 人脸识别 | 如开启人脸打卡,脚本点击后会弹出识别框,需人工配合 |
| UI 变化 | 钉钉版本更新可能导致控件变化,需用布局分析重新定位 |
| 定时任务 | 配合 Hamibot 定时功能,每天早上自动运行 |
进阶:定时自动打卡
- 在 Hamibot 控制台创建定时任务
- 设置触发时间(如每天 08:55)
- 选择设备和脚本
- 系统自动唤醒设备并执行
如果钉钉界面有变化,可以使用布局分析工具查看具体的按钮 ID 或文字,修改脚本中的选择器。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实