很多游戏为了防止用户离线或者使用脚本挂机,会随机出现一些验证,比如这样的:
通过图片我们可以知道这个验证有两个区域:
【区域一】:问题区,简单的加减法运算
【区域二】:答案区,随机的排序的数字按键
对于两个区域,我们分开处理,先说第一个区域:
图片上的验证内容是24-8=
对于这部分内容我们需要分两步,
第一步识别图片文字;
第二步把识别的内容进行运算处理。
识别部分我测试了几个命令:
①本地光学识别:
- TracePrint Image.OcrText(199,400,276,421,0,0)
复制代码识别结果并不准确:
②smartocr命令识别
- TracePrint smartocr(199,400,276,421)
复制代码识别结果不能识别符号:
③百度云识别
- Import "shanhai.lua"
- Dim 路径="/sdcard/pictures/n.png"
- SnapShot(路径,199,400,276,421) //截图
- Dim arr=BaiDuOCR("你的api","你的Secret",路径,1)
- TracePrint "识别结果",arr
- Function BaiDuOCR(api, Secret, path, n)
- TracePrint "文字识别中,请耐心等待..."
- Dim ret_arr()
- Dim token=url.get("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id="&api&"&client_secret="&secret)
- dim mytoken=Encode.JsonToTable(token)
- Dim base64=ShanHai.ReadFileBase(path)
- Dim 图片=shanhai.CharToUrl(base64)
- TracePrint 图片
- Dim post内容="access_token="&mytoken["access_token"]&"&Content-Type=application/x-www-form-urlencoded&image="&图片&"&detect_direction=true"
- Dim myjson=url.post("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic",post内容)
- myjson = Encode.JsonToTable(myjson)
- For i = 0 To UBOUND(myjson["words_result"])
- ret_arr(i)=myjson["words_result"][i+1]["words"]
- Next
- If n = 0 Then
- BaiDuOCR = ret_arr
- ElseIf n = 1 Then
- BaiDuOCR=join(ret_arr,"")
- End If
- End Function
复制代码识别结果还比较准确:
3种方法对比来说,百度云识别更准确一些,但是能不能做到百分之百的准确,还需要大量测试。
如果出现少量的识别不准确,可以做微调。
假设把减号识别成下划线,用替换命令,把“_”替换成“-”,同理其他字符或者数字也可以用这种方法。
识别这部分这样,然后是运算,直接用山海插件的eval命令
- Import "shanhai.lua"
- traceprint shanhai.eval("24-8")
复制代码结果:
这个简单的数学运算没啥好说的,问题区域这些~
第二个区域:答案区
第一眼看上去,好像和我上一篇文章中的数字键盘有些相像~
但是不同之处是键盘上的数字是随机排序的,那么就不能用固定坐标了。
解决这个问题的思路是怎么把数字和图片联系起来,比方说是数字1时点击图片1,当你思考到这一步的时候是不是发现数字可以做图片名称的一部分呢。
- Dim 数字=1
- Dim intx,inty
- FindPic 0, 0, 0, 0, "Attachment:"&数字&".png","000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- Tap intx,inty
- End If
复制代码当每个找图用的截图都以数字命名,通过这个代码就可以把数字和找图点击连接在一起,那问题来了,如果数字是两位数或者多位数呢?
那么需要先对数字进行逐位提取,在循环点击。
- Dim 数字=16
- Dim intx,inty,单位数
- For i = 1 To Len(cstr(数字))
- 单位数 = UTF8.mid(cstr(数字),i,1)
- FindPic 0, 0, 0, 0, "Attachment:"&单位数&".png","000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- Tap intx,inty
- End If
- Next
复制代码这里稍微说一个容易错误的点,len命令和mid命令都是对字符串处理,的如果是数值类型,需要先用cstr命令把数值转成字符串类型。
关于答案区这部分内容,需要注意的点是找图是否准确,如果在数字更换位置以后,找不到图了,可以适当降低找图的相似度,如果还不行,就每个数字在不同位置时多截图几次,然后找多图。
命名使用 数字_1,数字_2这种方式,这样写同样可以使用上面的代码,把数字和找图联系起来。
总的来说,这期是关于准确识别的,无论是百度云识别还是找图,对于识别我们尽可能做到准确,即便不准确时也要想办法排查错误识别。
好了,本期内容就这些~