大家好,我是公眾號3分鐘學堂的郭立員~
很多游戲為了防止用戶離線或者使用腳本掛機,會隨機出現一些驗證,比如這樣的:
通過圖片我們可以知道這個驗證有兩個區域:
【區域一】:問題區,簡單的加減法運算
【區域二】:答案區,隨機的排序的數字按鍵
對于兩個區域,我們分開處理,先說第一個區域:
圖片上的驗證內容是24-8=
對于這部分內容我們需要分兩步,
第一步識別圖片文字;
第二步把識別的內容進行運算處理。
識別部分我測試了幾個命令:
①本地光學識別:
TracePrintImage.OcrText(199,400,276,421,0,0)
識別結果并不準確:
當前腳本第1行:24_B
②smartocr命令識別
TracePrintsmartocr(199,400,276,421)
識別結果不能識別符號:
當前腳本第1行:248
③百度云識別
Import"shanhai.lua"Dim路徑="/sdcard/pictures/n.png"SnapShot(路徑,199,400,276,421)//截圖Dimarr=BaiDuOCR("你的api","你的Secret",路徑,1)TracePrint"識別結果",arrFunctionBaiDuOCR(api, Secret, path, n)TracePrint"文字識別中,請耐心等待..."Dimret_arr()Dimtoken=url.get("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id="&api&"&client_secret="&secret)dimmytoken=Encode.JsonToTable(token)Dimbase64=ShanHai.ReadFileBase(path)Dim圖片=shanhai.CharToUrl(base64)TracePrint圖片Dimpost內容="access_token="&mytoken["access_token"]&"&Content-Type=application/x-www-form-urlencoded&image="&圖片&"&detect_direction=true"Dimmyjson=url.post("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic",post內容)myjson=Encode.JsonToTable(myjson)Fori = 0 To UBOUND(myjson["words_result"])ret_arr(i)=myjson["words_result"][i+1]["words"]NextIfn = 0 Then BaiDuOCR=ret_arrElseIfn = 1 ThenBaiDuOCR=join(ret_arr,"")EndIfEndFunction
識別結果還比較準確:
當前腳本第5行:識別結果24-8
3種方法對比來說,百度云識別更準確一些,但是能不能做到百分之百的準確,還需要大量測試。
如果出現少量的識別不準確,可以做微調。
假設把減號識別成下劃線,用替換命令,把“_”替換成“-”,同理其他字符或者數字也可以用這種方法。
識別這部分這樣,然后是運算,直接用山海插件的eval命令
Import"shanhai.lua"traceprint shanhai.eval("24-8")
結果:
當前腳本第2行:16
這個簡單的數學運算沒啥好說的,問題區域這些~
第二個區域:答案區
第一眼看上去,好像和我上一篇文章中的數字鍵盤有些相像~
但是不同之處是鍵盤上的數字是隨機排序的,那么就不能用固定坐標了。
解決這個問題的思路是怎么把數字和圖片聯系起來,比方說是數字1時點擊圖片1,當你思考到這一步的時候是不是發現數字可以做圖片名稱的一部分呢。
Dim數字=1Dimintx,intyFindPic0,0,0,0,"Attachment:"&數字&".png","000000",0,0.9,intX,intYIfintX>-1AndintY>-1ThenTapintx,intyEndIf
當每個找圖用的截圖都以數字命名,通過這個代碼就可以把數字和找圖點擊連接在一起,那問題來了,如果數字是兩位數或者多位數呢?
那么需要先對數字進行逐位提取,在循環點擊。
Dim數字=16Dimintx,inty,單位數Fori=1ToLen(cstr(數字))單位數=UTF8.mid(cstr(數字),i,1)FindPic0,0,0,0,"Attachment:"&單位數&".png","000000",0,0.9,intX,intYIfintX>-1AndintY>-1ThenTapintx,intyEndIfNext
這里稍微說一個容易錯誤的點,len命令和mid命令都是對字符串處理,的如果是數值類型,需要先用cstr命令把數值轉成字符串類型。
關于答案區這部分內容,需要注意的點是找圖是否準確,如果在數字更換位置以后,找不到圖了,可以適當降低找圖的相似度,如果還不行,就每個數字在不同位置時多截圖幾次,然后找多圖。
命名使用 數字_1,數字_2這種方式,這樣寫同樣可以使用上面的代碼,把數字和找圖聯系起來。
總的來說,這期是關于準確識別的,無論是百度云識別還是找圖,對于識別我們盡可能做到準確,即便不準確時也要想辦法排查錯誤識別。
好了,本期內容就這些~