前言:最近我在玩游戏时遇到一个很烦的事情,就是游戏限时任务需要答题,但是我又不想自己慢慢手点也不想搜题,那么我就有一个想法,为什么不自己做一个自动答题的脚本呢?
首先我遇到的题目是这样的
这样的题目一共有20道,那么一个一个搜起来就很麻烦,就算有题目也需要Ctrl+F慢慢搜,那么我们就可以用到OCR文字识别提取文字,再写一个自动遍历题库的脚本。
正文开始:
关于OCR文字识别我们可以使用百度云,阿里云,腾讯云等。或者去Github下载一些开源的文字识别,比如:rapidocr(此处我们以百度云OCR文字识别为例)
注:百度云ocr文字识别需要去百度云注册,此处我不作演示,需要的可以去百度云官网注册
代码部分:
首先我们随意定义两个值:如下(此处我将该值从界面输入框读取)
Dim account = ReadUIConfig("输入框1")
Dim secret = ReadUIConfig("输入框2")
然后我们可以在百度云获取到我们的client_id以及client_secret。在使用OCR文字识别之前我们需要用到access_token,以下是获取代码:
token1 = "https://aip.baidubce.com/oauth/2.0/token? client_id="&account&"&client_secret="&secret&"&grant_type=client_credentials"
token1 = URL.Get(token1)
token1 = Encode.JsonToTable(token1)
token1 = token1["access_token"]
TracePrint token1 //此处打印获取到的access_token的值
获取到token之后我们就可以使用OCR文字识别了,但是识别是需要上传图片到百度云识别的,那么我们就可以用下列代码截取屏幕指定范围内的一张图
path = GetSdcardDir()
SnapShot path & "/test.png", 289,282,536,993//这里我截取的是289,282,536,993范围的图片
图片路径 = path & "/test.png"
path是要存放图片的文件夹,也就是手机默认的文件夹
做完上述步骤后我们就可以使用百度云OCR的api接口了(此处使用了紫猫插件,需要的可以在网络下载)
link = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" & token1
base64 = zm.FileReadBinaryBase64(图片路径)
base64 = zm.EncodeURL (base64)
param = "image="&base64
res = Url.Post(link,param)
TracePrint res
这样我们就获得了识别到的文字,但是有些字体因为i 1 l和5 s都很相像,识别可能不准确,不过无伤大雅
我们开始提取题目和答案,因为返回的res是一个json类型,我们需要让他变成table类型
res = Encode.JsonToTable(res)
words_result = res["words_result"]
For i = 0 To UBound(words_result) - 3
题目 = words_result(i)
题目 = 题目["words"]
题目1 = 题目1 & 题目
Call 替换题目()
TracePrint 题目1
Next
optionA = words_result(UBOUND(words_result) - 2)
optionA = optionA["words"]
optionB = words_result(UBOUND(words_result) - 1)
optionB = optionB["words"]
optionC = words_result(UBOUND(words_result) )
optionC = optionC["words"]
这样我们就提取到了题目,选项A,选项B,选项C。接下来就是遍历题库了(可以使用txt文本来保存题目和答案,我这里格式为 题目:答案,方便后续获取答案)
fileContent = File.Read("/sdcard/misc/题库.txt")
fileContent = Split(fileContent, "\n") //使用换行符号分割题库
For i = 0 To UBOUND(fileContent)
题库题目 = Split(fileContent(i), ":")
If InStr(1,题目1, 题库题目(0)) > 0 Then
Dim length2 = UTF8.Len(题库题目(1))
题库答案 = UTF8.Left(题库题目(1), length2 - 1)
Exit For
End If
Next
这样就获取到了答案,最后我们只需要截取原来选项中的A,B,C的图片使用findpic函数找图执行点击就好了(这部分过于简单,就不作演示了)