怎么设置钉钉自动打卡

HAMI_8493075251 · 3 天前
第 1 条补充
·
3 天前

怎么设置钉钉打卡的详细教程,能否帮助一下

回答

Hamibot AI
1
· 3 天前

Hamibot本身不提供直接设置钉钉自动打卡的功能,因为钉钉的打卡界面和逻辑是钉钉应用内部实现的。但是,你可以通过编写Hamibot脚本来模拟用户操作,实现自动打卡。

以下是实现思路和关键步骤:

实现思路

通过Hamibot脚本自动打开钉钉,模拟点击进入工作台/考勤打卡页面,然后执行打卡操作。

关键步骤和示例代码

  1. 确保授予必要权限:在Hamibot中开启无障碍服务和悬浮窗权限。
  2. 编写自动化脚本:使用控件操作、图像识别或坐标点击等方式定位打卡按钮。

下面是一个基础示例框架,你需要根据自己钉钉的实际界面进行调整:

// 文档地址 https://docs.hamibot.com/

// 唤醒设备并解锁屏幕(假设设备已设置免密解锁或已知密码)
device.wakeUp();
sleep(500);

// 启动钉钉
launchApp("钉钉");
// 等待钉钉完全启动
sleep(3000);

// 方法一:使用控件操作(推荐,更稳定)
// 点击进入“工作台”
let workbench = text("工作台").findOne(5000);
if (workbench) {
    workbench.click();
    sleep(2000);
    // 在工作台页面寻找“考勤打卡”并点击
    let checkIn = text("考勤打卡").findOne(5000);
    if (checkIn) {
        checkIn.click();
        sleep(3000);
        // 在打卡页面寻找打卡按钮
        let punchBtn = textMatches(/上班打卡|下班打卡/).findOne(5000);
        if (punchBtn) {
            punchBtn.click();
            toastLog("打卡成功!");
        } else {
            toastLog("未找到打卡按钮");
        }
    } else {
        toastLog("未找到考勤打卡入口");
    }
} else {
    toastLog("未找到工作台入口");
}

// 方法二:使用图像识别(如果控件无法定位)
// 需要事先截取“考勤打卡”等关键按钮的图片,存放在脚本同目录
// let targetImage = images.read("./考勤打卡图标.png");
// let found = findImage(captureScreen(), targetImage);
// if (found) {
//     click(found.x, found.y);
// }

hamibot.exit();

注意事项和最佳实践

  1. 增加稳定性

    • 在关键操作后使用 sleep() 给予界面加载时间。
    • 使用 findOne() 时设置合理的超时时间,并使用 if 判断控件是否存在,避免脚本因找不到控件而崩溃。
    • 考虑使用 click(centerX, centerY) 点击控件的中心点。
  2. 处理多种情况

    • 已经打卡后的按钮状态可能变化(如变为“已打卡”),脚本需要能判断并跳过。
    • 考虑网络延迟,可以增加重试逻辑。
  3. 定时执行

    • 在Hamibot的“任务”功能中,可以设置定时任务,让脚本在设定的打卡时间自动运行。
  4. 环境兼容

    • 不同手机分辨率、钉钉版本可能导致界面差异,建议在自己的设备上调试稳定。

重要提醒:自动打卡脚本的使用需符合公司规定和钉钉用户协议。此脚本仅用于学习和测试自动化技术,请合理合法使用。

如果你在编写具体脚本时遇到控件找不到等问题,可以提供更详细的界面信息(例如控件的 classNamebounds 等属性),我可以帮你进一步分析。


补充回答 1

当然可以。这是一个详细的钉钉自动打卡脚本设置教程,从环境准备到脚本编写、调试和定时运行,包含完整的步骤和代码。

第一步:准备工作与环境配置

  1. 安装Hamibot应用:在你的Android手机上下载并安装Hamibot。
  2. 开启必要权限
    • 打开Hamibot,根据引导开启 「无障碍服务」「悬浮窗权限」
    • 确保Hamibot在后台有 「自启动」「电池优化白名单」 权限,防止系统杀进程。
  3. 安装钉钉:确保手机上已安装钉钉并登录好你的账号。
  4. 准备脚本编辑器:可以在Hamibot的Web控制台(https://hamibot.com/dashboard/scripts)在线编写,也可以在电脑上使用VSCode等编辑器编写后上传。

第二步:分析钉钉界面并获取控件信息

这是最关键的一步。你需要手动操作一次钉钉打卡流程,并用Hamibot的“悬浮窗-布局分析”功能查看页面上的控件信息。

  1. 打开Hamibot的悬浮窗,点击 「布局分析」
  2. 手动操作钉钉:
    • 打开钉钉 -> 点击底部 「工作台」 -> 找到并点击 「考勤打卡」
    • 进入打卡页面,查看 「上班打卡」「下班打卡」 按钮。
  3. 在每个关键页面暂停,使用布局分析查看目标控件的属性,特别是:
    • text: 按钮上显示的文字(如“工作台”、“考勤打卡”、“上班打卡”)。
    • className: 控件类型(如 android.widget.TextView)。
    • bounds: 控件的坐标范围(用于 click(centerX, centerY))。
    • descresourceId: 有时也能用于定位。

记下这些关键控件的定位信息

第三步:编写详细脚本

这里提供一个增强版、容错性更好的示例脚本。你需要将 YOUR_DINGTALK_PACKAGE_NAME 替换为你手机钉钉的实际包名(通常是 com.alibaba.android.rimet)。

// 文档地址 https://docs.hamibot.com/

// ====== 配置区域 ======
var DINGTALK_PACKAGE = "com.alibaba.android.rimet"; // 钉钉包名
var MAX_WAIT_TIME = 10000; // 每个步骤最大等待时间(毫秒)
// =====================

// 主函数
main();

function main() {
    // 0. 确保设备唤醒
    if (!device.isScreenOn()) {
        device.wakeUp();
        sleep(1000);
        // 这里可以加入解锁屏幕代码(如滑动解锁),但涉及安全,请谨慎处理
        // unlockScreen(); // 需要你自己实现
    }

    // 1. 启动或回到钉钉
    launchOrBringToFront(DINGTALK_PACKAGE);
    sleep(3000); // 等待应用完全启动

    // 2. 进入工作台
    if (!enterWorkbench()) {
        toastLog("进入工作台失败,脚本停止");
        hamibot.exit();
        return;
    }

    // 3. 进入考勤打卡页面
    if (!enterAttendancePage()) {
        toastLog("进入考勤页面失败,脚本停止");
        hamibot.exit();
        return;
    }

    // 4. 执行打卡操作
    performPunchCard();

    // 5. 可选:返回并退出钉钉,释放资源
    // backToHome();
    // killApp(DINGTALK_PACKAGE);
    toastLog("自动打卡流程执行完毕");
    hamibot.exit();
}

// 函数:启动或切换到指定应用
function launchOrBringToFront(packageName) {
    if (currentPackage() === packageName) {
        toastLog("钉钉已在前台");
        return true;
    }
    toastLog("正在启动钉钉...");
    // 尝试通过应用名称启动
    launch("钉钉");
    // 备用方案:通过包名启动
    // app.launchPackage(packageName);
    sleep(3000);
    return currentPackage() === packageName;
}

// 函数:进入工作台
function enterWorkbench() {
    toastLog("尝试进入工作台...");
    // 方案A:直接点击底部导航栏的“工作台”(需要知道控件位置)
    let workbenchTab = text("工作台").findOne(MAX_WAIT_TIME);
    if (workbenchTab) {
        workbenchTab.click();
        sleep(2000);
        return true;
    }

    // 方案B:如果方案A失败,尝试通过点击“我的”返回首页再进入(备用逻辑)
    let homeTab = text("首页").findOne(3000);
    if (homeTab) {
        homeTab.click();
        sleep(1000);
        workbenchTab = text("工作台").findOne(5000);
        if (workbenchTab) {
            workbenchTab.click();
            sleep(2000);
            return true;
        }
    }

    // 方案C:如果界面有干扰,可以尝试滑动到工作台所在分页
    // swipe(device.width * 0.8, device.height / 2, device.width * 0.2, device.height / 2, 500);
    // sleep(1000);
    // workbenchTab = text("工作台").findOne(5000);
    // if (workbenchTab) { workbenchTab.click(); sleep(2000); return true; }

    toastLog("未找到工作台入口");
    return false;
}

// 函数:进入考勤打卡页面
function enterAttendancePage() {
    toastLog("寻找考勤打卡入口...");
    // 尝试查找“考勤打卡”文字
    let attendanceEntry = text("考勤打卡").findOne(MAX_WAIT_TIME);
    if (!attendanceEntry) {
        // 可能文字是“打卡”
        attendanceEntry = text("打卡").findOne(5000);
    }
    if (attendanceEntry) {
        attendanceEntry.click();
        sleep(3000); // 等待页面跳转
        // 检查是否成功进入打卡页面:查找“上班打卡”或“下班打卡”字样
        if (textMatches(/上班打卡|下班打卡/).exists()) {
            return true;
        }
    }
    toastLog("未找到考勤打卡入口或进入失败");
    return false;
}

// 函数:执行打卡
function performPunchCard() {
    toastLog("正在尝试打卡...");
    // 查找可点击的打卡按钮
    let punchButton = textMatches(/上班打卡|下班打卡/).findOne(MAX_WAIT_TIME);

    if (punchButton) {
        let buttonText = punchButton.text();
        // 检查是否已打卡
        if (buttonText.indexOf("已") > -1 || buttonText.indexOf("完成") > -1) {
            toastLog("当前状态: " + buttonText + ",无需重复操作");
            return;
        }
        // 点击打卡按钮
        punchButton.click();
        toastLog(buttonText + " 点击成功!");
        sleep(3000); // 等待打卡结果

        // 验证打卡是否成功:查找成功提示(如“打卡成功”)
        if (textMatches(/打卡成功|成功打卡/).findOne(5000)) {
            toastLog("打卡成功确认!");
        } else {
            // 可能弹出位置确认等对话框,尝试处理
            let confirmBtn = textMatches(/确定|确认|好的/).findOne(3000);
            if (confirmBtn) {
                confirmBtn.click();
                toastLog("已处理确认对话框");
            }
        }
    } else {
        toastLog("未找到可用的打卡按钮");
        // 可以尝试截图保存现场,用于调试
        // let img = captureScreen();
        // images.save(img, "/sdcard/punch_failed_" + new Date().getTime() + ".png");
    }
}

// 函数:返回桌面(可选)
function backToHome() {
    pressHome();
    sleep(1000);
}

// 函数:关闭应用(可选)
function closeApp(appName) {
    var name = getPackageName(appName);
    if (!name) {
        if (getAppName(appName)) {
            name = appName;
        } else {
            return false;
        }
    }
    app.openAppSetting(name);
    text(app.getAppName(name)).waitFor();
    sleep(500);
    let is_sure = textMatches(/(.*强.*|.*停.*|.*结.*)/).findOne();
    if (is_sure) {
        click(is_sure.bounds().centerX(), is_sure.bounds().centerY());
        sleep(1000);
        text("确定").click();
    } else {
        back();
    }
    sleep(500);
}

第四步:调试与优化

  1. 本地运行测试:在Hamibot的“脚本”页面,选择你的脚本,点击“运行”,观察每一步是否按预期执行。
  2. 查看日志:通过 toastLog() 输出的悬浮提示和Hamibot的“日志”页面查看运行情况。
  3. 处理异常
    • 如果某个控件找不到,检查你的钉钉版本是否与脚本中查找的 text 一致。
    • 如果页面加载慢,适当增加 sleep 时间或 MAX_WAIT_TIME
    • 考虑网络问题,可以在关键步骤后加入 while(!click("重试")) 的重试逻辑。
  4. 适配你的界面:如果“工作台”或“考勤打卡”在你钉钉里的文字/位置不同,修改脚本中相应的 text()click() 坐标。

第五步:设置定时自动运行

  1. 在Hamibot的 「任务」 页面,点击 「创建任务」
  2. 触发方式选择 「定时触发」,设置你需要的打卡时间(例如工作日早上9:00)。
  3. 执行动作选择 「运行脚本」,然后选择你刚编写好的钉钉打卡脚本。
  4. 保存任务。到设定时间,Hamibot就会自动运行脚本进行打卡。

重要提示

  • 合法合规:请确保使用自动打卡脚本符合公司规章制度和钉钉用户协议,仅用于个人效率提升测试。
  • 网络与位置:确保打卡时手机网络通畅,如果公司要求定位打卡,请保持手机GPS开启或连接公司Wi-Fi。
  • 脚本维护:钉钉应用更新后界面可能会变化,需要定期检查并更新脚本。
  • 备用方案:极端情况下,可以结合图像识别 (findImage) 作为控件定位的备用方案。

如果在具体步骤遇到问题,可以提供你钉钉界面的截图或布局分析中的控件属性,我可以帮你进一步调试脚本。

ℹ️ 本回答由 AI 生成,内容仅供参考