很多 App、游戏里面都有随机安全键盘 ,每次弹出键盘,0‑9 数字按钮的位置都会打乱变化。这种键盘做了防护,直接用inputtext、keyPress这类命令是无法完成输入的,脚本不能直接往输入框写入内容,只能模拟点击屏幕上的数字按钮来完成填写。
比如验证码、计算题验证场景,算出结果之后,需要点击随机排布的数字按键提交。键盘布局每次都变,坐标不能写死,那脚本要如何定位到对应数字按钮?今天分享两种常用实现方案:找图识别法 、OCR 文字识别法。
方法一:找图法,图片匹配定位数字按钮
核心思路:提前把 0‑9 十个数字按钮截图,每个图片以对应数字命名,例如0.png、1.png一直到9.png。脚本运行时,循环去屏幕上查找对应数字图片,找到后获取坐标,执行点击操作。
步骤 1:准备素材
截取安全键盘上每一个数字按钮图片,命名为数字本身,放到脚本附件里。
步骤 2:拆分待输入数字
待输入的数字,例如66,不能直接整体处理,需要拆成单个字符6、6,逐个查找图片、逐个点击。
注意:存储数字的变量必须是字符串类型 ,否则
Len()无法获取字符长度,可以用CStr()强制转为字符串。
拆分示例代码:
Dim num = "66"
Dim n
For i = 1 To Len(num)
n = Mid(num, i, 1)
TracePrint n
Next
步骤 3:封装完整点击函数
把找图、判断、点击、延时封装成函数,后续直接调用,完整代码:
Function 键盘点击(num)
Dim intx,inty,n
For i = 1 To Len(num)
n = Mid(num, i, 1)
FindPic 0, 0, 0, 0, "Attachment:"&n&".png","000000", 0, 0.9, intX, intY
If intX > -1 And intY > -1 Then
tap intx,inty
End If
Delay 300
Next
End Function
调用示例:Call 键盘点击("66"),即可自动依次点击两个数字 6。
优缺点:
✅ 识别稳定,对环境光线、界面变化容错好;
❌ 需要提前准备 10 张截图素材,如果按钮样式更新,截图就要重新制作。
方法二:OCR 文字识别,直接读取键盘上数字文本
OCR 方案不需要提前截图,直接框选安全键盘所在区域,调用OcrEx识别区域内所有文字,解析返回结果,拿到数字文本 + 对应 X、Y 屏幕坐标,构建数字‑坐标映射表,之后按需要点击对应坐标。
1、OCR 获取键盘识别结果
指定键盘区域,执行识别,返回的表格数据包含文本、置信度、x/y 坐标等信息。
Dim tb = OcrEx(113,394,427,612)
TracePrint encode.TableToJson(tb)
For i = 1 To Len(tb)
TracePrint tb[i]["text"]
Next
输出样例(节选):
[
{"h":35,"score":0.52350407838821,"text":"查除","w":57,"x":358,"y":410},
{"h":31,"score":0.99966430664062,"text":"确认","w":56,"x":357,"y":559},
{"h":33,"score":0.99936264753342,"text":"4","w":27,"x":296,"y":559},
{"h":34,"score":0.99967694282532,"text":"5","w":27,"x":138,"y":484},
{"h":35,"score":0.99971395730972,"text":"2","w":26,"x":139,"y":410},
{"h":35,"score":0.99921548366547,"text":"6","w":26,"x":218,"y":557},
{"h":32,"score":0.99972718954086,"text":"3","w":25,"x":218,"y":486},
{"h":34,"score":0.60895961523056,"text":"8","w":25,"x":296,"y":411},
{"h":33,"score":0.96144515275955,"text":"7","w":25,"x":218,"y":411},
{"h":35,"score":0.99800330400467,"text":"9","w":24,"x":139,"y":558},
{"h":31,"score":0.83861255645752,"text":"0","w":22,"x":376,"y":486},
{"h":31,"score":0.99609309434891,"text":"1","w":20,"x":298,"y":486}
]
返回结果里面有 "确认" 这类无关文字,我们只需要保留数字,以及它的 x、y 坐标。
2、处理 OCR 结果,构建数字坐标数组
两种存储格式,大家按需选择。
格式 A:键值对,arr["1"] = {x,y},数字文本作为下标
Dim arr = {null}
Dim tb = OcrEx(113,394,427,612)
TracePrint encode.TableToJson(tb)
For i = 1 To Len(tb)
TracePrint tb[i]["text"]
//判断识别内容是不是数字,是数字就存入数组
If IsNumeric(tb[i]["text"]) Then
arr[tb[i]["text"]] = {tb[i]["x"],tb[i]["y"]}
End If
Next
TracePrint encode.TableToJson(arr)
输出效果:
[[376,486],[298,486],[139,410],[218,486],[296,559],[138,484],[218,557],[218,411],[296,411],[139,558]]
格式 B:数组下标对应数字,arr[1]={x,y},我个人更推荐这种写法
注意:按键精灵数组下标默认从 1 开始,数字 0 会存放在 arr (0) 位置。
Dim arr = {null}
Dim tb = OcrEx(113,394,427,612)
TracePrint encode.TableToJson(tb)
For i = 1 To Len(tb)
TracePrint tb[i]["text"]
If IsNumeric(tb[i]["text"]) Then
arr(cint(tb[i]["text"])) = {tb[i]["x"],tb[i]["y"]}
End If
Next
TracePrint encode.TableToJson(arr)
3、拆分数字,循环点击按钮
拿到数字坐标映射数组之后,同样拆分输入字符串,逐个取出坐标执行点击。
Dim arr = {null}
Dim tb = OcrEx(113,394,427,612)
For i = 1 To Len(tb)
If IsNumeric(tb[i]["text"]) Then
arr(cint(tb[i]["text"])) = {tb[i]["x"],tb[i]["y"]}
End If
Next
Dim num = "66"
Dim n
For i = 1 To Len(num)
n = cint(Mid(num, i, 1))
TracePrint arr[n][1],arr[n][2]
tap arr[n][1],arr[n][2]
Delay 300
Next
优缺点:
✅ 无需准备图片素材,键盘样式小幅改动也能兼容;
❌ OCR 识别受字体、清晰度影响,偶尔识别出错,需要设置置信度过滤低可信度结果。
两种方案怎么选?
-
界面稳定,数字按钮样式不变 → 优先找图法,识别准确率高,适合长期使用;
-
不想做截图素材、界面经常微调 → 优先 OCR 识别法,开发速度更快,需要做好容错判断。
常见踩坑总结
-
待输入数字一定要转字符串,如果是数字类型,
Len()函数获取不到字符长度; -
找图的相似度参数,根据实际界面调整,不要设置过高或者过低;
-
OCR 务必框选精准,只框选键盘区域,减少无关文字干扰识别;
-
每次点击之后加上延时,模拟真人操作,防止操作过快被系统风控。
感谢作者三分钟学堂的思路分享,按键精灵提供了专业级的安卓脚本开发软件。它支持可视化的安卓脚本录制,也允许进阶用户进行手动的安卓脚本编写与安卓脚本制作。最核心的优势在于其免root脚本开发能力------基于安卓系统的无障碍脚本服务,无需获取Root权限即可实现安卓自动连点、模拟滑动等操作。开发完成的脚本,还可通过内置的安卓脚本打包工具,一键打包成独立APK,方便分享或商用。针对苹果脚本(iOS脚本)需求,按键精灵也推出了对应的iOS脚本开发软件。在越狱环境下,它提供了完整的iOS越狱脚本开发方案,支持iOS越狱脚本录制、iOS越狱脚本编写、iOS越狱脚本制作,并可通过iOS越狱脚本打包工具生成文件。同时,它也内置了iOS连点器功能,让iOS自动连点变得简单易行。无论是安卓还是苹果,无论你需要的是简单的手机自动连点,还是复杂的手游脚本,按键精灵都提供了从开发、录制、编写到打包的完整工具链,是移动端自动化利器。