在制作自动化脚本或者rpa脚本过程中一般我们都是使用无障碍技术,但是无障碍目前被乱用的厉害,导致很多app都会检测无障碍,甚至最后可能会封杀账户。今天我给大家介绍一种可以规避检测的实现自动化脚本的方案,就是ocr方案,这个ocr和普通的ocr不一样,绝对有惊喜!下面以冰狐智能辅助的ocr作为例子进行讲解。
一、OCR介绍
OCR(Optical Character Recognition,光学字符识别)是一种将图像中的文字(如印刷体或手写体)转换为可编辑、可搜索的文本数据的技术。它通过分析图像中的像素模式,识别出字符并将其转换为计算机可处理的字符编码(如ASCII、Unicode),从而实现对纸质文档、图片、扫描件等非结构化文本的数字化。
在自动化脚本中我们使用ocr技术主要目的就是为了识别界面中的文字,主要是汉字,当然也包括部分数字等。这里我们使用的是冰狐智能辅助的ocr作为例子,因为冰狐的ocr对汉字的识别率高达100%,比百度的paddle ocr识别率还要高,冰狐官方称冰狐的ocr支持在线增量学习,汉字识别率(可以做到99.999%接近100%识别率)高于任何已知的ocr。
二、api介绍
1.ocr
这是最普通的ocr函数,支持在线增量学习,汉字识别率(可以做到99.999%接近100%识别率)高于任何已知的ocr。返回值为数组,里面存放识别到的文本和对应的区域,区域格式为[left, top, width, height](相对屏幕的坐标,不是相对识别区域的坐标)例:[{text:'a', region:[11, 23, 10, 50]}, {text:'b', region:[111, 231, 50, 20]}]。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
options | object | 选填,默认值:{region:[0, 0, 1, 1], bitmap: null, awesome:{threshold: 0.1, count: 3}} | region,指定区域[left, top, width, height],若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。默认值[0,0,1,1]。bitmap,如果为null则使用截屏后图片,否则直接使用该位图。如果感觉ocr识别汉字偶尔会出错,请直接开启awesome,即可实现汉字识别99.999%成功率 awesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6],如果开启awesome后还有汉字识别不对,请使用增量学习,把正确的语句添加到ocr文本库,然后点击「训练模型」,完成后下载模型,并打包进冰狐apk,即可正确识别对应的汉字。 |
例子:
function main() {
requestScreenShot();
var ret = ocr();
// 开启awesome,实现汉字100%成功率
// var ret = ocr({awesome:{threshold: 0.9, count: 4}});
console.log('ret:' + ret);
}
2.tessOcr
tessOcr,专用于识别数字和英文(注意不能识别中文,若想识别中文请用ocr函数)。返回值为数组,里面存放识别到的文本和对应的区域,区域格式为[left, top, width, height](相对屏幕的坐标,不是相对识别区域的坐标)例:[{text:'a', region:[11, 23, 10, 50]}, {text:'b', region:[111, 231, 50, 20]}]。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
options | object | 选填,默认值:{region:[0, 0, 1, 1], bitmap: null} | region,指定区域[left, top, width, height],若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。默认值[0,0,1,1]。bitmap,如果为null则使用截屏后图片,否则直接使用该位图。 |
例子:
function main() {
requestScreenShot();
var ret = tessOcr({region:[0, 0, 0.5, 200]});
console.log('ret:' + ret);
}
3.ocrFindView
其功能对应冰狐的findView函数。先用ocr识别文本,然后再查找匹配的文本,返回值为json对象,包含tag、text和region(left, top, width, height)三个key,如果没找到则对象的length为0,若找到则tag为匹配到的tag, text为匹配到的文本,region为匹配到文本的位置,例:{tag:'hello', text:'hello world' region:[100, 200, 30, 80]}。当页面的ui树获取不到时使用,比如游戏等。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
tag | string | 必填 | 目标页面的tag,注意只能为text,多个文本使用|连接,找到任意一个即可,txt:表示精确搜索text为tag的控件,txt$:表示搜索text以tag结尾的控件,txt^:表示搜索text以tag开始的控件,txt*:表示搜索text包含tag的控件。例:'txt:我的|txt:首页'。 |
options | json object | {region:null, duration:500, maxStep:5, random: false, beforeWait:0, afterWait:0, failed: null, timeout: 1000, returnAllData: false, awesome:{threshold: 0.1, count:3}} | region可以在ocr时指定区域[left, top, width, height],注意:若取值在[0, 1]之间表示比例,例:[0.5, 100, 100, 200]表示left位于屏幕x轴中点;若取值大于1表示像素值。duration表示两次搜索的间隔时间,单位毫秒。maxStep表示当搜索失败时,重搜索的最大次数。beforeWait表示在搜索前等待的时间,单位毫秒。afterWait表示在搜索完成后等待的时间,单位毫秒。failed表示搜索控件失败后调用的函数,主要用于在操作期间出现弹窗的场景。timeout指ocr的超时时间,默认1000毫秒。awesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6]。 |
bitmap | Bitmap | 选填 | 默认为null,如果为null则使用截屏后图片,否则直接使用该位图 |
例子:
function main() {
requestScreenShot();
var ret = ocrFindView('txt:数据分析|txt^:首页');
console.log('ret:' + ret);
}
4.ocrClick
对应冰狐的click函数。ocrClick,先用ocr识别文本,然后再点击文本,返回boolean。当页面的ui树获取不到时使用,比如游戏等。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
tag | string | 必填 | 目标页面的tag,注意只能为text,多个文本使用|连接,找到任意一个即可,txt:表示精确搜索text为tag的控件,txt$:表示搜索text以tag结尾的控件,txt^:表示搜索text以tag开始的控件,txt*:表示搜索text包含tag的控件。例:'txt:我的|txt:首页'。 |
options | json object | {region:null, clickMode:1, duration:500, maxStep:5, random: false, beforeWait:0, afterWait:0, failed: null, timeout: 1000, awesome:{threshold: 0.1, count:3}} | region可以在ocr时指定区域[left, top, width, height],注意:若取值在[0, 1]之间表示比例,例:[0.5, 100, 100, 200]表示left位于屏幕x轴中点;若取值大于1表示像素值。duration表示两次搜索的间隔时间,单位毫秒。maxStep表示当搜索失败时,重搜索的最大次数。beforeWait表示在搜索前等待的时间,单位毫秒。afterWait表示在搜索完成后等待的时间,单位毫秒。failed表示搜索控件失败后调用的函数,主要用于在操作期间出现弹窗的场景。timeout指ocr的超时时间,默认1000毫秒。awesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6]。clickMode表示点击模式,1表示无障碍,2表示蓝牙,3表示usb,4表示root,5表示adb,如果使用蓝牙、usb、adb则需要先调用相应的初始化函数。 |
bitmap | Bitmap | 选填 | 默认为null,如果为null则使用截屏后图片,否则直接使用该位图 |
例子:
function main() {
requestScreenShot();
var ret = ocrClick('数据分析|首页');
console.log('ret:' + ret);
}
5.ocrSwitchPage
对应冰狐的switchPage函数。使用ocr来实现切换页面,返回boolean。当页面的ui树获取不到时使用,比如游戏等。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
findTag/clickPosition | string/array | 必填 | findTag,表示需要点击的文本,注意只能为text,txt:表示精确搜索text为tag的控件,txt$:表示搜索text以tag结尾的控件,txt^:表示搜索text以tag开始的控件,txt*:表示搜索text包含tag的控件。clickPosition表示点击的目标位置信息,可以为[left, top]或者[left, top, width, height]。 |
checkTag | string | 必填 | 目标页面的tag,注意只能为text,多个文本使用|连接,找到任意一个即可,txt:表示精确搜索text为tag的控件,txt$:表示搜索text以tag结尾的控件,txt^:表示搜索text以tag开始的控件,txt*:表示搜索text包含tag的控件。例:'txt:我的|txt:首页'。 |
options | json object | {findRegion:null, checkRegion:null, showOcrResult: false, clickMode:1, duration:500, maxStep:5, maxCheckStep:1, random: false, beforeWait:0, afterWait:0, failed: null, timeout: 1000, findAwesome:{threshold: 0.1, count:3}, checkAwesome:{threshold: 0.1, count:3}} | findRegion和checkRegion可以在ocr时指定区域[left, top, width, height],注意:若取值在[0, 1]之间表示比例,例:[0.5, 100, 100, 200]表示left位于屏幕x轴中点;若取值大于1表示像素值。showOcrResult表示是否在log中显示ocr的结果,用于调试。duration表示两次搜索的间隔时间,单位毫秒。maxStep表示当搜索失败时,重搜索的最大次数。maxCheckStep表示一次搜索时最多检查几次目标tag。beforeWait表示在搜索前等待的时间,单位毫秒。afterWait表示在搜索完成后等待的时间,单位毫秒。failed表示搜索控件失败后调用的函数,主要用于在操作期间出现弹窗的场景。timeout指ocr的超时时间,默认1000毫秒。注意:如果failed返回true则会立即检查2次是否到达目标页面。findAwesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6]。checkAwesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6]。clickMode表示点击模式,1表示无障碍,2表示蓝牙,3表示usb,4表示root,5表示adb,如果使用蓝牙、usb、adb则需要先调用相应的初始化函数。 |
function main() {
requestScreenShot();
var ret = ocrSwitchPage('查看', '数据分析|首页');
console.log('ret:' + ret);
}
6.ocrBack2Page
对应冰狐的back2Page函数。使用ocr来实现返回指定页面,返回boolean。当页面的ui树获取不到时使用,比如游戏等。
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
tag | string | 必填 | tag,表示目标页面中的tag文本,注意只能为text,txt:表示精确搜索text为tag的控件,txt$:表示搜索text以tag结尾的控件,txt^:表示搜索text以tag开始的控件,txt*:表示搜索text包含tag的控件。 |
options | json object | {midTag:'', backMode: 1, region:null, backFirst: true, duration:1000, maxStep:5, maxCheckStep:2, beforeWait:0, afterWait:0, failed: null, timeout:1000, awesome:{threshold: 0.9, count:3}} | midTag表示在返回目标页面过程中的中间页面上的唯一tag。backFirst表示是否先模拟点击返回按键。region可以在ocr时指定区域[left, top, width, height],注意:若取值在[0, 1]之间表示比例,例:[0.5, 100, 100, 200]表示left位于屏幕x轴中点;若取值大于1表示像素值。duration表示两次搜索的间隔时间,单位毫秒。maxStep表示当搜索失败时,重搜索的最大次数。maxCheckStep表示一次搜索时最多检查几次目标tag。beforeWait表示在搜索前等待的时间,单位毫秒。afterWait表示在搜索完成后等待的时间,单位毫秒。failed表示搜索控件失败后调用的函数,主要用于在操作期间出现弹窗的场景。timeout指ocr的超时时间,默认1000毫秒。awesome:{threshold:0.9, count: 3},threshold取值范围[0.5, 0.9], count取值范围[2, 6]。backMode表示使用什么方法按返回键,1表示无障碍,2表示蓝牙,3表示usb,4表示root,5表示adb,如果使用蓝牙、usb、adb则需要先调用相应的初始化函数。 |
function main() {
requestScreenShot();
var ret = ocrBack2Page('首页');
console.log('ret:' + ret);
}
三、ocr在线增量学习
冰狐的ocr支持在线增量学习,进而达到汉字识别率接近100%。如果在时操过程中出现ocr的汉字没有识别正确,比如“冰狐”识别成了“冰孤”,请按如下步骤操作:
1.打开冰狐网站,进入「管理中心」-「OCR文本库」
2.添加文本,因为是将冰狐识别成了冰孤,所以添加正确的文本“冰狐”进去,权重先填100,如果无法识别就增加权重重新学习,比如1000等。
3.点击“训练模型”按钮开始增量学习训练,训练完成后会弹出下载地址,点击下载模型。
4.将下载的模型文件model.bin打包到冰狐apk中,具体打包请见冰狐官网「管理中心」-「定制APP/打包」。
5.安装打包后的新app即可实现100%汉字识别率,如果还是无法识别则增加权重或者降低awesome的threshold,增加awesome的count。
四、总结
本文详细介绍一种不使用无障碍技术实现自动化脚本的方案,即:ocr技术方案。以冰狐智能辅助为例子,详细介绍了汉字识别率为100%的方案,并详细讲解了每个api的详细使用方法,同时给出了具体的例子,最后介绍了ocr的在线增量学习,并给出了调优方案。