脚本开始瞎点的时候,先看一眼节点是不是没读出来。App 一改版,text、label 对不上号;WebView 更狠,直接给你一棵空树。字还老老实实待在屏幕上,那就让 OCR 认字,认出来再点。
适用版本:EasyClick iOS USB 中控 10.3.0+(changelog:新增 PPOCR-V6) 引擎 type:
paddleOcrOnnxV6(内置 PP-OCRv6_small) 官方 OCR 文档:https://ieasyclick.com/iosdocs/funcs/ocr-api/ 群控总入口:https://ieasyclick.com/apple_qunkong/
流程就三步:创建实例、截屏识别文字、计算中心点然后点击。
paddleOcrOnnxV6 怎么用
苹果群控脚本日常还是优先用节点。抓不到节点在使用OCR。按钮只有文案、没有稳定 id 的,读出来是空的;弹窗文案天天换,控件树跟不上;图文混排的界面,干脆读得七零八落。多机型号一杂更麻烦,节点属性五花八门,界面上的字反倒还对得上。
中控侧 OCR 对象前缀是 ocr。V6 的用法和 V5 同一套字段,type 改成 paddleOcrOnnxV6 就行。不写模型路径时用中控自带的
PP-OCRv6_small_det.onnx / PP-OCRv6_small_rec.onnx / ppocrv6_small_labels.txt。
偏快参数适合正立 UI,我自己写脚本时默认就先挂这一组:
function createOcrV6() {
ocr.releaseAll();
let tocr = ocr.newOcr();
let ok = tocr.initOcr({
"type": "paddleOcrOnnxV6",
"numThread": 2,
"single": 0,
"matMode": 1,
"padding": 32,
"maxSideLen": 640,
"doAngleFlag": 0,
"mostAngleFlag": 0
});
if (!ok) {
loge("OCR 初始化失败: " + tocr.getErrorMsg());
return null;
}
logd("paddleOcrOnnxV6 就绪");
return tocr;
}
single: 0 是多机场景常用法,每台设备单独实例;matMode: 1 走内存转 Mat,省内存。要更高检测精度,可以把 maxSideLen 提到
960,画面可能倒置再把 doAngleFlag、mostAngleFlag 打开。西里尔文识别不了,文档写得很直白。
如果初始化失败先看中控版本是不是到了 10.3.0,再看 OpenCV / OCR OCR文档 https://ieasyclick.com/iosdocs/funcs/ocr-api/
截屏OCR找坐标进行点击
使用 ocrImage识别。返回数组里每项有 label、confidence、x、y、width、height。找某个关键字,算中心点再点。
识字+ USB HID 点击。HID 会话和屏幕尺寸先配置好。
function ocrFindCenter(tocr, keyword) {
let img = image.captureFullScreen();
if (!img) {
loge("截图失败");
return null;
}
let result = tocr.ocrImage(img, 30 * 1000, {
"padding": 32,
"numThread": 2,
"maxSideLen": 640,
"doAngleFlag": 0,
"mostAngleFlag": 0
});
image.recycle(img);
if (!result) {
logw("未识别到结果");
return null;
}
for (let i = 0; i < result.length; i++) {
let item = result[i];
if (item.label && item.label.indexOf(keyword) >= 0) {
return {
x: item.x + item.width / 2,
y: item.y + item.height / 2,
label: item.label,
confidence: item.confidence
};
}
}
logw("没找到关键字: " + keyword);
return null;
}
function clickByOcrText(tocr, keyword) {
let hit = ocrFindCenter(tocr, keyword);
if (!hit) {
return false;
}
logd("命中「" + hit.label + "」置信度 " + hit.confidence
+ " 中心 " + hit.x + "," + hit.y);
// USB HID:先 sessionStart、setScreenSize,再点
let r = usbHidEvent.clickPoint(hit.x, hit.y);
if (!(r == null || r === "")) {
logw("点击失败: " + r);
return false;
}
return true;
}
function main() {
let tocr = createOcrV6();
if (!tocr) {
return;
}
let r = usbHidEvent.sessionStart(true);
if (!(r == null || r === "")) {
logw("开启 HID 会话失败: " + r);
tocr.releaseAll();
return;
}
// 分辨率按当前投屏/截图像素改,别照抄
r = usbHidEvent.setScreenSize(1170, 2532);
if (!(r == null || r === "")) {
logw("setScreenSize 失败: " + r);
usbHidEvent.sessionStop();
tocr.releaseAll();
return;
}
// 示例:找界面上的「发布」再点
clickByOcrText(tocr, "发布");
sleep(800 + Math.floor(Math.random() * 400));
usbHidEvent.sessionStop();
tocr.releaseAll();
}
main();
ocrImage 的第三个参数可以覆盖本次识别设置,全机默认偏快、某一屏临时加大 maxSideLen 都行。图片用完 image.recycle
,群控长跑不回收,内存会跟着涨。
关键字别写死成整句口号。App 文案常带空格、省略号、前后缀,indexOf 函数
更好一些;同屏多个「确定」时,要加区域过滤或置信度门槛,需要自己做判断
设备多了要增加CPU和内存
二十台同时全屏 OCR,中控 CPU 先告警。与其盲目堆 numThread,不如错峰跑,或者把长边调小。numThread 文档里可以调识别速度;机多了就保守一点。
误点比识错更糟。置信度低的结果直接丢掉;点击前后打日志,带上 label 和坐标,半夜翻日志才找得到是哪台点歪了。横竖屏一切换,
setScreenSize 和 OCR 坐标系一起乱,群控机柜尽量统一机型,少混分辨率。
V5 脚本要迁 V6,只需改 type。旧工程 paddleOcrOnnxV5 也能跑。
参考文档:
- OCR 识别(含 V6 示例):https://ieasyclick.com/iosdocs/funcs/ocr-api/
- USB HID 点击:https://ieasyclick.com/iosdocs/funcs/usb-hid-event-api/
- iOS USB 版总文档:https://ieasyclick.com/iosdocs/
- 苹果群控:https://ieasyclick.com/apple_qunkong/
站内相关文:USB HID API 教程、脚本购买/选型。
节点没啥问题可以优先使用,不行在使用 paddleOcrOnnxV6 OCR。
本文参数与示例依据 EasyClick iOS USB OCR 文档及 10.3.0 changelog 整理,以你本机中控版本对应的文档页为准。
关于 EasyClick:手机自动化脚本开发平台,覆盖安卓免 ROOT、iOS 免越狱、鸿蒙三大手机生态,还提供苹果脚本编写、苹果群控、安卓群控、远程云控、AI 群控手机等。→ 了解全部产品
想要真实跑起来?
本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。