狂暴补师亚丝娜 发表于 2018-4-19 16:47

【C++】逻辑配合LUA实现自动答题(微信小程序通杀)

本帖最后由 wushaominkk 于 2018-4-27 17:48 编辑

首先声明:
1、此源码为原创源码,相信吾爱的大神们见多识广。
2、本源码基本上通杀微信上判断类的游戏,如判断加减、判断数字大小,通关免费拿礼品的。(需要修改部分源码)
3、由于微信小程序上的基本上都是套路,越来越快,除非修改内存,所以即使是脚本秒回答+100%正确,也不一定通关。但是平均3把通关一次是没有问题的。

接下来,就让我详细地将源码+翻译+思路全部发出来。
首先说说原理:
通过对屏幕的识别,使用自己的字库,读取屏幕上的文字,再将文字通过判断,来选择按正确的按钮还是错误的按钮。
难点如下:效率。微信小程序对效率讲究极高,是必须回答这道题过后,才会出现下一道题,所以没办法预判。

源码如下:

local ocr, msg = createOCR({
                type = "tesseract",
      })

local function Mytext(a,b,c,d) --获取屏幕上的文字,a,b,c,d是对应的坐标
      if ocr ~= nil then
                local rect = {a,b,c,d}
                local diff = {"0xffffff-0x0f0f0f"}
                local code, text = ocr:getText({
                              rect = rect,
                              diff = diff
                        })
                if code == 0 then
                        return text --返回读取的字符串
                end
      end
end

init("0",0)
setScreenScale(1080,1920)
local qq = 1 --全局变量,用于判断画面是否改变
for i = 1, 100 do --模仿continue,跳过本次循环
      while true do
                local texta5 = Mytext(492,489,594,568)
                if qq ~= texta5 then --如果捕获到的画面与上次内容不同
                        qq = texta5--赋值给全局变量
                        local texta = Mytext(204,750,471,944) --第一个数字
                        local texta3 = Mytext(608,765,930,951) --第二个数字
                        local texta4 = Mytext(303,961,779,1162) --结果
                        if getColor(544,818) == 0xffffff then --判断是加号还是减号
                              local result = texta + texta3

                                        if(string.find(texta4,result) ~= nil) then --判断读取到的字符串是否包含正确答案
                                                touchDown(0,318,1652)
                                                mSleep(10)
                                                touchUp(0,318,1652)
                                                break
                                        else
                                                touchDown(0,815,1623)
                                                mSleep(10)
                                                touchUp(0,815,1623)
                                                break
                                        end
                        else
                              local result = texta - texta3
                                        if(string.find(texta4,"-")) then --判断如果是减号,答案是否含有负号
                                                if result >= 0 then --正确结果>0,却有负号,说明这道题答案是错的
                                                      touchDown(0,815,1623)
                                                      mSleep(10)
                                                      touchUp(0,815,1623)
                                                      break
                                                else
                                                      touchDown(0,318,1652)
                                                      mSleep(10)
                                                      touchUp(0,318,1652)
                                                      break
                                                end
                                        end
                                        if(string.find(texta4,result) ~= nil) then --判断读取到的字符串是否包含正确答案
                                                touchDown(0,318,1652)
                                                mSleep(10)
                                                touchUp(0,318,1652)
                                                break
                                        else
                                                touchDown(0,815,1623)
                                                mSleep(10)
                                                touchUp(0,815,1623)
                                                break
                                        end
                        end
                else
                        break
                end
      end
end

微信小程序界面:


成品效果:https://pan.baidu.com/s/1R9LHt07BpixBBhUZxXqXxA?from=timeline

首先,为了效率:
1、LUA不能进行大范围的读取屏幕,否则影响效率。
2、由于脚本非商用,所以去掉了所有不该有的判断,只留下主方法。(大幅度提高效率)
3、【重点】读取到的字符串可能还有未知字符串,即使读取到的数字是3,但是获取到的长度却是4,据大神透露这是正常的。(即使是空白),所以用 local a = b这种方法是完全不行的。
4、为了少读取一块区域,因此在判断是加号还是减号,直接判断减号上面有没有白色的点,如果有,那么他就是加号,没有就是减号!(判断点比判断区域效率提高很多!)
5、源码中的texta4是包含等号的所有结果。比如图中6+5,lua脚本读取到的结果为:【=13】,而非13,。并且如果再把等号去掉进行比较,效率又会降低,所以使用find方法,直接在字符串中查找字符串!特殊情况就是1和-1这种区别,所以需要判断是否大于0.如果结果大于0,正确答案却含有负号,则直接是错的!
6、texta5读取的区域是【第1题】。可以根据屏幕的变化自己设定。texta5的作用涉及到C++的逻辑,下面会讲!
7、除了按钮以外坚决不用sleep!(sleep是最影响效率的!)

C++逻辑如下:【重点】
1、LUA是没有类似于continue这种函数(死循环中跳过本次循环),所以得自己实现continue。我这里用的方法是在死循环外面再套一个循环,即可实现:死循环中跳过本次循环!就是在while外面嵌套一个for循环。
2、由于效率的原因,如果用texta5的方法进行每次屏幕对比,效率可想而知。但是为了屏幕的变化,又必须保存(总不可能保存缓存吧!)在这里,我用了C++的逻辑,即中间变量(源码当中为qq)。qq为全局变量,当texta5读取到字符串过后,会将读取的字符串保存到qq上,当下次再循环的时候,如果qq等于texta5,则屏幕没有变化,否则,屏幕变化了!(原创吧属于,网络上的源码是读取屏幕色块,两种原理完全不同。)

其他:
1、为什么要判断屏幕是否变化?
答:如果不判断的话无法保存按钮的正确率。自己拿源码测一遍就可以了哦~
2、不能用orc接口,本地判断永远效率大于网络,这里我用的是LUA自带的一种字库~

再次申明:本份源码稍微修改即可通杀所有判断类微信小程序,如判断加减、判断数字大小等~

大家最关心的问题,怎么使用lua脚本在手机运行?(教程来啦)
安卓手机需要root!用于调试
1、首先需要下载2个工具。下载地址:http://dev.xxzhushou.cn/userIndex.html(网址就像微软的一个下载集合一样,不用上传百度云吧)
下载:叉叉集成开发环境   、 叉叉开发助手。
2、电脑、手机都安装过后,打开,将手机与电脑通过叉叉集成开发环境连接(同一个wifi下即可,具体可以看教程)
3、就和易语言、VS一样了,新建项目,在main里面复制我的代码,直接运行即可。(一般不用调试,用运行~)

JackDx 发表于 2018-4-20 11:27

正在打包脚本,请稍候
开始运行脚本...
发送信息完毕...
运行已停止
错误信息: :5: '=' expected near 'local'
报错~~~

stack traceback:
        :-1: in function ''
        :-1: in function 'require'
        :2: in main chunk
        :-1: in function 'require'
        :1: in main chunk

查小布 发表于 2018-5-6 15:12

main.lua:45: attempt to perform arithmetic on local 'texta' (a string value)
stack traceback:
        main.lua:45: in main chunk
        local vars: ocr=msg='3.02.02',Mytext=<func>,qq=''
        :-1: in function 'require'
        :1: in main chunk
27关挂,试了10多次

wushaominkk 发表于 2018-4-19 16:58

楼主有心了,还录制个小视频!支持一个!{:1_921:}

zhk1985 发表于 2018-4-19 19:23

头脑王者可以用吗

苏紫方璇 发表于 2018-4-19 19:57

zhk1985 发表于 2018-4-19 19:23
头脑王者可以用吗

头脑王者应该用不了这个

梦入神机 发表于 2018-4-20 08:32

不错,有时间看看

狂暴补师亚丝娜 发表于 2018-4-20 16:10

JackDx 发表于 2018-4-20 11:27
正在打包脚本,请稍候
开始运行脚本...
发送信息完毕...


原封不动复制进去不会报错啊,你看下是不是复制少了

jjyywg 发表于 2018-4-27 09:24

不错,收藏一下。

mr清扬 发表于 2018-4-27 17:07

本来我想写这个的...我是想通过在电脑上开模拟器,在电脑上运行微信小程序.然后通过截屏,然后用算法将图片进行分割,处理和识别,然后在电脑计算运行结果,再手动点击. . 这个加减那个数子,利用向量对比识别应该可以

狂暴补师亚丝娜 发表于 2018-4-27 17:20

mr清扬 发表于 2018-4-27 17:07
本来我想写这个的...我是想通过在电脑上开模拟器,在电脑上运行微信小程序.然后通过截屏,然后用算法将图片进 ...

这样太麻烦了
页: [1] 2
查看完整版本: 【C++】逻辑配合LUA实现自动答题(微信小程序通杀)