指定区域截图寻找文字坐标并且点击

wrekemdkwh · 3 小时前
第 1 条补充
·
3 小时前

images.ocr(img) 这个方法不存在

第 2 条补充
·
2 小时前

不要使用images.ocr(img)这个方法

回答

Hamibot AI
1
· 3 小时前

你可以使用 Hamibot 的图像识别和文字查找功能来实现“在指定区域截图、寻找文字坐标并点击”的操作。以下是一个完整的示例脚本,基于 Rhino 兼容的 JavaScript 语法编写。

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

// 请求截图权限
if (!requestScreenCapture()) {
    toast('请求截图失败');
    exit();
}

// 定义目标区域(以屏幕分辨率为1080x2220为例,请根据实际设备调整)
var region = {
    x: 0,     // 区域左上角 x 坐标
    y: 300,   // 区域左上角 y 坐标
    width: 1080,  // 区域宽度
    height: 800   // 区域高度
};

// 在指定区域内查找文本
function findTextInRegion(text, region) {
    // 截取指定区域图像
    var img = captureScreen();
    if (!img) {
        log('截图失败');
        return null;
    }

    // 调用 OCR 识别屏幕上的所有文本
    var ocrResult = images.ocr(img);
    if (!ocrResult || ocrResult.length === 0) {
        log('未识别到任何文字');
        return null;
    }

    // 遍历识别结果,查找匹配的文字
    for (var i = 0; i < ocrResult.length; i++) {
        var item = ocrResult[i];
        var bounds = item.bounds; // {left, top, right, bottom}
        var centerX = (bounds.left + bounds.right) / 2;
        var centerY = (bounds.top + bounds.bottom) / 2;

        // 判断该文字是否在指定区域内
        if (centerX >= region.x &&
            centerX <= region.x + region.width &&
            centerY >= region.y &&
            centerY <= region.y + region.height &&
            item.text.includes(text)) {

            log('找到 "' + text + '" 在坐标: (' + centerX + ', ' + centerY + ')');
            return { x: centerX, y: centerY };
        }
    }

    log('在指定区域内未找到文字: ' + text);
    return null;
}

// 执行查找与点击
var targetText = "立即领取";  // 替换为你想查找的文字
var pos = findTextInRegion(targetText, region);

if (pos) {
    click(pos.x, pos.y);
    toast('已点击: ' + targetText);
} else {
    toast('未找到目标文字');
}

使用说明:

  1. 权限要求

    • 确保开启无障碍服务。
    • 脚本需要 requestScreenCapture() 权限才能截图。
  2. OCR 功能支持

    • images.ocr() 是 Hamibot 提供的 OCR 接口,用于识别屏幕上的文字。
    • 保证你的客户端版本为最新,以确保 OCR 正常工作。
  3. 适配不同分辨率

    • 上述 region 参数需根据你设备的实际屏幕尺寸进行调整。
    • 可通过 device.widthdevice.height 获取当前设备分辨率。
  4. 提高准确率建议

    • 尽量缩小搜索区域以提升性能和准确性。
    • 若文字固定不变,可考虑结合模板匹配(images.findImage())或正则判断。
  5. 注意事项

    • OCR 对模糊、小字体或特殊字体识别效果可能不佳。
    • 若目标应用有防自动化机制,可能需要加入随机延迟等反检测策略。

如果你希望进一步优化性能或支持多语言识别,可以探索 images.ocrLang() 指定语言模型。

如需调试,可在 Hamibot 客户端打开日志界面查看输出信息。


补充回答 1

images.ocr(img) 方法在 Hamibot 当前版本中确实存在,但它是高级功能,需要满足以下条件才能正常使用:


✅ 正确使用 images.ocr() 的前提条件

  1. Hamibot 客户端版本 ≥ 1.4.0

    • 请确保你已更新到最新版 Hamibot App。
    • 可前往官网 https://hamibot.cn 下载最新客户端。
  2. 账号具备 OCR 权限(请求额度)

    • images.ocr() 调用会消耗「请求额度」。
    • 免费用户每月有 100 次请求额度(每月1号重置),超出后需购买额外额度:https://hamibot.cn/account/quotas
    • 每调用一次 images.ocr() 视为一次 API 请求,消耗1次。
  3. 正确引入和调用语法

    • 确保脚本开头没有禁用相关权限。
    • 使用方式如下:
      // 文档地址 https://docs.hamibot.com/
      requestScreenCapture();
      
      var img = captureScreen();
      if (img) {
          var result = images.ocr(img);
          log(result);
      }
      
  4. 网络连接正常

    • OCR 是云端识别服务,设备必须联网才能使用。

如果仍然提示方法不存在或报错

可能是你的 Hamibot 客户端不支持该 API。你可以通过以下方式验证:

✅ 替代测试代码(安全兼容写法)

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

if (typeof images.ocr === 'function') {
    toast('OCR 功能可用');
} else {
    toast('当前环境不支持 images.ocr,请升级客户端');
    exit();
}

requestScreenCapture(10000);

var img = captureScreen();
if (!img) {
    toast('截图失败');
    exit();
}

var result = images.ocr(img);
if (result && result.length > 0) {
    for (var i = 0; i < result.length; i++) {
        log('文字: %s, 位置: (%d, %d)', result[i].text, 
            (result[i].bounds.left + result[i].bounds.right) / 2,
            (result[i].bounds.top + result[i].bounds.bottom) / 2);
    }
} else {
    log('未识别到文字');
}

替代方案:基于控件查找(无需 OCR)

如果你只是想点击带有文本的按钮,推荐优先使用无障碍的控件查找,效率更高、更稳定:

// 查找包含指定文本的可点击控件并点击
var text = "立即领取";

if (textContains(text).clickable(true).exists()) {
    textContains(text).clickable(true).findOnce().click();
    toast("已点击: " + text);
} else {
    toast("未找到文本: " + text);
}

此方法不依赖截图和 OCR,运行更快且不受请求额度限制。


总结

问题 解决方案
images.ocr is not a function 升级 Hamibot 客户端至最新版
无反应或返回 null 检查是否联网、是否还有「请求额度」
识别不准 缩小截图区域、提升对比度、避免模糊字体

如确认已满足所有条件但仍无法使用,请提供具体错误日志截图,在对应脚本工单或通过邮箱 support@hamibot.cn 联系官方支持。


补充回答 2

如果你不想使用 images.ocr(img) 方法,或者希望避免依赖 OCR 和请求额度,可以通过 控件查找(Accessibility) 的方式来定位文字并点击。这是更高效、稳定且无需联网的方案。

以下是不使用 images.ocr,而是通过无障碍服务直接查找屏幕上指定文字并点击其坐标的完整实现:


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

// 启用无障碍服务
auto();

// 要查找的文字
var targetText = "立即领取"; // 替换为你想查找的文字

// 查找包含该文本的控件,并确保它是可点击的
var widget = textContains(targetText).findOnce();

if (widget) {
    var bounds = widget.bounds();
    var centerX = (bounds.left + bounds.right) / 2;
    var centerY = (bounds.top + bounds.bottom) / 2;

    log('找到文字 "%s",坐标: (%d, %d)', targetText, centerX, centerY);

    // 执行点击
    click(centerX, centerY);
    toast('已点击: ' + targetText);
} else {
    toast('未找到文字: ' + targetText);
}

✅ 优点(相比截图+OCR)

  • 不需要 requestScreenCapture() 权限。
  • 不消耗「请求额度」。
  • 识别速度快、准确率高(只要系统能获取到控件文本)。
  • 兼容性好,适用于绝大多数 App 界面操作。

🛠️ 进阶技巧

1. 精确匹配

var widget = text(targetText).findOnce(); // 完全匹配

2. 模糊匹配多个结果中选第一个

var widgets = textMatches(/.*领取.*/).find();
if (widgets.size() > 0) {
    widgets.get(0).click();
}

3. 限定在某个区域内查找(模拟“指定区域”)

var screenW = device.width;
var screenH = device.height;

// 定义目标区域:例如上半屏中间部分
var region = {
    left: 0,
    top: 300,
    right: screenW,
    bottom: 1000
};

var candidates = textContains(targetText).find();
var found = false;

for (var i = 0; i < candidates.size(); i++) {
    var w = candidates.get(i);
    var b = w.bounds();

    var centerX = (b.left + b.right) / 2;
    var centerY = (b.top + b.bottom) / 2;

    // 判断中心点是否在指定区域内
    if (centerX >= region.left && centerX <= region.right &&
        centerY >= region.top && centerY <= region.bottom) {

        click(centerX, centerY);
        toast('在指定区域内点击: ' + w.text());
        found = true;
        break;
    }
}

if (!found) {
    toast('在指定区域内未找到目标文字');
}

⚠️ 注意事项

  • 必须开启 无障碍服务(在 Hamibot 中启用 auto())。
  • 如果目标文字是图片、自绘 Canvas 或未暴露给辅助功能的原生组件,则无法通过此方法识别。
  • 此方法仅适用于系统能获取到文本内容的 UI 控件。

推荐使用场景

场景 推荐方法
普通 App 内点击按钮、菜单项 ✅ 使用 textContains().click()
游戏界面、WebView 图片文字 ❌ 控件无效 → 需要用截图 + 图像匹配
高频率自动化任务 ✅ 优先选择控件查找,性能最佳

如你确实不能使用控件查找(比如目标是游戏或 WebView 中的图像文字),可以考虑使用 images.findImage() 进行模板匹配,我也可以提供相应示例。但对纯文本操作,控件查找是最优解

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