在自动化脚本领域,控件识别是实现稳定脚本的关键。然而,并非所有应用都提供标准无障碍控件信息(如 text、id 等),尤其是一些游戏、老旧应用或自定义渲染界面,往往无法通过常规方式定位元素。此时,OCR(光学字符识别)技术便成为不可或缺的替代方案。
OCR支持本地 Tesseract 引擎、云端 OCR 服务以及基于深度学习的 YOLO 模型,开发者可根据实际需求灵活选择。本文将详细介绍如何在使用 纯 JS API 实现基于 OCR 的自动化脚本,并附带完整可运行的 Demo 示例。
一、OCR 功能概述
冰狐提供了以下 OCR 相关接口:
ocr(text, options):基础文字识别,返回识别结果数组。tessOcr(text, options):使用本地 Tesseract 引擎进行识别。onlineOcr(text, options):调用云端 OCR 服务,精度更高但需联网。ocrFindView(keyword, options):直接通过 OCR 查找包含关键词的"虚拟控件"。ocrClick(keyword, options):识别并点击包含关键词的位置。ocrSwitchPage / ocrBack2Page:结合 OCR 实现页面跳转判断。
⚠️ 注意:所有 OCR 操作均依赖截图权限。首次使用需调用
requestScreenShot()获取权限。
二、准备工作
在编写 OCR 脚本前,请确保完成以下步骤:
- 开启无障碍服务(部分 OCR 操作需配合界面刷新);
- 授予截屏权限;
- 确保目标文字清晰、对比度高,避免模糊或艺术字体影响识别率。
可通过以下代码初始化环境:
javascript
function prepareEnvironment() {
// 请求截屏权限
if (!requestScreenShot()) {
console.error("用户未授予截屏权限");
return false;
}
// 检查无障碍是否开启
if (!isAccessibilityEnabled()) {
openAccessibilitySetting();
console.warn("请手动开启无障碍服务");
sleep(5000); // 等待用户操作
}
return true;
}
三、OCR 基础用法示例
场景:自动登录某 App(无标准控件)
假设某 App 的登录按钮显示为图片文字"立即登录",且无 text 或 id 属性。我们可通过 OCR 识别并点击。
✅ 完整 Demo 源码
javascript
/**
* 使用 OCR 实现自动登录
* 仅使用冰狐平台 JS API
*/
function main() {
// 1. 初始化环境
if (!prepareEnvironment()) {
toast("初始化失败,请检查权限");
return -1;
}
// 2. 启动目标 App(假设包名为 com.example.app)
var pkg = "com.example.app";
var ret = launchApp(pkg, "txt*:启动页", { maxStep: 30, afterWait: 2000 });
if (ret !== 1) {
console.error("启动 App 失败");
return -2;
}
console.log("App 启动成功,等待主界面");
// 3. 循环查找"立即登录"按钮(最多尝试10次)
var attempts = 0;
while (attempts < 10) {
sleep(1000);
// 使用 ocrClick 直接点击识别到的文字
var clicked = ocrClick("立即登录", {
similarity: 0.8, // 文字相似度阈值
region: [0.2, 0.6, 0.8, 0.9], // 限定在屏幕下半区域搜索(x1,y1,x2,y2,归一化坐标)
timeout: 3000,
afterWait: 500
});
if (clicked) {
console.log("成功点击【立即登录】");
break;
} else {
console.log(`第 ${++attempts} 次未找到"立即登录"`);
// 可尝试滑动页面
if (attempts % 3 === 0) {
scroll("down", { distance: 0.3, duration: 300 });
}
}
}
if (attempts >= 10) {
toast("未找到登录按钮");
return -3;
}
// 4. 输入账号密码(假设输入框可通过 OCR 定位)
sleep(1500);
// 点击"手机号"输入框(通过 OCR 定位)
ocrClick("手机号", { similarity: 0.75, afterWait: 300 });
sleep(500);
inputText("13800138000"); // 使用输入法输入
sleep(500);
ocrClick("密码", { similarity: 0.75, afterWait: 300 });
sleep(500);
inputText("MySecurePass123!");
// 5. 再次点击登录
sleep(1000);
ocrClick("登录", { similarity: 0.8, afterWait: 1000 });
console.log("登录流程执行完毕");
toast("自动化登录完成!");
return 0;
}
// 辅助函数:环境准备
function prepareEnvironment() {
if (!requestScreenShot()) {
return false;
}
if (!isAccessibilityEnabled()) {
openAccessibilitySetting();
sleep(5000);
}
return true;
}
四、高级技巧:结合 ocrFindView 精准操作
ocrClick 虽然便捷,但在复杂场景下可能不够灵活。我们可以先用 ocrFindView 获取位置信息,再执行自定义逻辑。
javascript
// 示例:识别多个相同文字,点击第二个
function clickSecondOccurrence(keyword) {
var views = ocrFindView(keyword, {
similarity: 0.85,
maxCount: 5
});
if (views && views.length >= 2) {
var second = views[1]; // 数组索引从0开始
click(second.x, second.y); // 手动点击坐标
console.log(`点击第2个"${keyword}",位置: (${second.x}, ${second.y})`);
return true;
}
return false;
}
五、提升 OCR 识别准确率的建议
- 限定识别区域 :通过
region参数缩小搜索范围,减少干扰。 - 调整相似度 :
similarity默认 0.8,可适当降低(如 0.7)以容忍字体差异。 - 预处理截图:虽冰狐未开放图像处理 API,但可通过多次截图+重试提高成功率。
- 优先使用
onlineOcr:对关键步骤(如验证码)可调用云端服务提升精度(需网络)。
javascript
// 使用云端 OCR 识别验证码
function recognizeCaptcha() {
var result = onlineOcr("", {
region: [0.3, 0.5, 0.7, 0.6],
timeout: 5000
});
if (result && result.length > 0) {
return result[0].text; // 返回识别出的文字
}
return "";
}
六、注意事项与常见问题
- 性能开销:OCR 比控件查找慢,避免高频调用。
- 文字方向:默认识别水平文字,倾斜文本可能识别失败。
- 多语言支持:Tesseract 需提前加载对应语言包。
七、总结
通过使用OCR 即使面对无标准控件的应用,我们也能实现可靠的自动化操作。开发者应根据实际场景选择合适的 OCR 接口,并结合区域限定、重试机制等策略提升脚本鲁棒性。