我需要一个 Hamibot 脚本:截图屏幕上显示的快递单条形码;解码识别出条形码代表的数字;将识别出的数字复制到剪贴板。请帮我写出这个 JavaScript 脚本。

Kalami · 2 小时前

回答

Hamibot AI
1
· 2 小时前

Hamibot 原生 API 暂未提供直接解码条形码图片的接口。快递单条形码下方通常都会印有对应的数字单号,因此最稳定且高效的实现方式是:通过内置 OCR 识别该区域的文字,再使用正则表达式提取单号并写入剪贴板。

以下为你提供完整脚本,代码已严格适配 Hamibot 的 Rhino 1.7.15 引擎(无箭头函数、无默认参数):

// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
    toastLog('未授予屏幕截图权限,脚本已退出');
    hamibot.exit();
}

sleep(1000);
toastLog('开始截屏...');
var img = captureScreen();

// 最佳实践:建议裁剪条形码及下方数字区域,可大幅提升识别准确率与速度
// 参数格式:[x, y, width, height],请根据你实际屏幕布局调整
// var regionImg = images.clip(img, 100, 800, 880, 300);
// var targetImg = regionImg ? regionImg : img;
var targetImg = img;

toastLog('开始识别文字...');
var ocrResult = ocr.recognizeText(targetImg);

if (ocrResult) {
    // 快递单号通常为 10~20 位的数字或数字字母组合
    // 你可根据常用快递(如顺丰、中通、京东等)的格式调整正则表达式
    var pattern = /[A-Za-z0-9]{10,20}/;
    var matchResult = ocrResult.match(pattern);
    
    if (matchResult) {
        var trackingNumber = matchResult[0];
        setClip(trackingNumber);
        toastLog('识别成功,单号已复制到剪贴板: ' + trackingNumber);
        log('快递单号: ' + trackingNumber);
    } else {
        toastLog('未匹配到符合格式的单号,原始结果: ' + ocrResult);
        log('原始OCR结果: ' + ocrResult);
    }
} else {
    toastLog('OCR 识别失败或未返回结果');
}

hamibot.exit();

关键说明与最佳实践

  1. 权限与截图requestScreenCapture() 是必要前置步骤。首次运行会弹出系统授权提示,需手动允许。
  2. 区域裁剪优化:脚本中注释了 images.clip() 用法。全屏识别容易受到界面其他文字干扰,裁剪出条形码及下方数字区域可显著提升识别成功率和执行速度。
  3. 正则表达式适配/[A-Za-z0-9]{10,20}/ 覆盖主流快递单号格式。若你只处理纯数字单号,可改为 /\d{10,20}/;若固定使用某家快递,建议根据其官方单号规则收紧正则,避免误识别。
  4. 识别环境要求:OCR 对清晰度敏感。确保屏幕亮度适中、条形码区域无遮挡、无严重反光或模糊。若识别不稳定,可在截图前增加 sleep(500) 等待界面渲染完成。
  5. 剪贴板操作setClip() 为 Hamibot 内置方法,执行后系统剪贴板即被覆盖,可直接在其他应用中粘贴使用。

如需针对特定快递界面调整裁剪坐标或正则规则,你可以提供具体截图布局或单号格式,我会为你进一步优化脚本参数。

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