苹果群控OCR脚本编写

EasyClick苹果群控脚本使用PaddleOCR V6 实战

中控 EasyClick iOS USB 10.3.0+ 内置 paddleOcrOnnxV6(PP-OCRv6_small)。本文按官方文档写初始化、偏快参数、截图识字、按文字框中心点击,以及多机群控时 single、线程和方向检测怎么取舍。

约 9 分钟

脚本开始瞎点的时候,先看一眼节点是不是没读出来。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 也能跑。

参考文档:

站内相关文:USB HID API 教程、脚本购买/选型。

节点没啥问题可以优先使用,不行在使用 paddleOcrOnnxV6 OCR。

本文参数与示例依据 EasyClick iOS USB OCR 文档及 10.3.0 changelog 整理,以你本机中控版本对应的文档页为准。


关于 EasyClick:手机自动化脚本开发平台,覆盖安卓免 ROOT、iOS 免越狱、鸿蒙三大手机生态,还提供苹果脚本编写、苹果群控、安卓群控、远程云控、AI 群控手机等。→ 了解全部产品

想要真实跑起来?

本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。

访问 EasyClick 官网 →