回答
Hamibot 内置的 OCR 是纯本地运行的,不依赖云端接口,因此没有调用次数限制。识别速度与准确率主要取决于你设备的 CPU 性能与内存状态。
针对找不到控件 ID 的关闭按钮,推荐按以下逻辑选择方案:
- 图像匹配(找图):适用于纯图标(如“×”形状)或背景相对固定的场景,定位最精准,可直接获取点击坐标。
- OCR 文字识别:适用于按钮明确包含“关闭”“取消”“跳过”等文字的场景。需注意,
ocr.recognizeText()仅返回识别出的文本内容,无法直接提供坐标,若需点击需配合区域截图或改用images.findImage()。
以下是针对该场景的推荐实现代码(已适配 Rhino 1.7.15 引擎,优先使用图像匹配):
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
toastLog('未获取屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 请提前截取目标关闭按钮的透明背景 PNG,保存至脚本目录
var templatePath = './close_btn.png';
var template = images.read(templatePath);
if (!template) {
toastLog('模板图片加载失败');
hamibot.exit();
}
var screen = captureScreen();
// 相似度阈值建议 0.75~0.85,过高易漏匹配,过低易误匹配
var result = images.findImage(screen, template, { threshold: 0.8 });
if (result) {
// result 为 Point 对象,包含 x, y 坐标
click(result.x, result.y);
log('已点击关闭按钮');
} else {
log('未找到目标按钮,可尝试降低 threshold 或更换模板');
}
// 释放资源
screen.recycle();
template.recycle();
关键注意事项:
- 模板图片建议使用截图工具单独截取按钮区域,保留透明背景或纯色背景,避免包含多余弹窗内容。
- 每次调用
captureScreen()或images.read()后,务必在逻辑末尾调用.recycle()释放内存,防止脚本长时间运行触发 OOM。 - 若弹窗样式随系统版本动态变化,建议将
images.findImage()放入循环或结合sleep()重试,并设置最大尝试次数避免死循环。 - 不同机型控件层级差异较大,建议优先使用 Hamibot 客户端的「布局分析」功能确认是否真的无可用控件属性,OCR 与找图仅作为兜底方案。
如需调整匹配区域或优化识别性能,可结合 images.clip() 裁剪屏幕截图范围,减少计算量。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
蓝色框选处