当前位置:首页 » 《随便一记》 » 正文

小猿口算自动化多方案代码及教程!

0 人参与  2024年11月10日 12:01  分类 : 《随便一记》  评论

点击全文阅读


前言

本文会提供多种小猿口算的自动化做题方案,不同方法的稳定性实现速度配置难度都有所不同。对于零基础同学,最为简单的方法也至少需要约两个小时实现功能,如果你是编程爱好者,这会是一个很有意思的过程!

只作为娱乐与安卓自动化和逆向学习用途

使用本项目所产生的任何后果由使用者自行承担。在使用本项目之前,请确保您已充分了解相关法律法规,并确保您的行为符合所在国家或地区的法律要求。未经授权的情况下,请勿将本项目用于商业用途或其他非法用途。

下面介绍的方案难度从简到难,当然效果可能也是也是先劣后优:

安卓连点器方案airtest自动化测试方案ocr方案抓包改包方案(只适用练习场)js篡改方案(只适用pk场)frida破密包方案apk逆向破密sign方案

黑色字体方案作者没有实现,难度较大,但有开源方案

目录

前言下面介绍的方案难度从简到难,当然效果可能也是也是先劣后优: 必备的工具 安卓连点器方案效果优缺点实现原理 教程 airtest测试方案效果优缺点实现原理 教程 ocr方案效果优缺点原理 教程 抓包改包方案(适用于练习场)效果优缺点原理 教程 js篡改方案效果优缺点实现原理 教程 frida破密包方案 与 apk逆向破密sign方案完致谢

必备的工具

一台电脑(macos也能实现,但作者是)模拟器或真机(建议使用模拟器,因为各种配置有风险搞坏你的真机)不同方案的不同工具要求

安卓连点器方案

效果

优缺点

速度较快,可以在真机和模拟器运行,环境配置几乎为0
没有代码界面,看着比较低级,只能适用于比大小

实现原理

利用设定的连点器脚本,迅速滑动大于小于动作。

教程

下载安卓连点器,具体脚本设置方法,可见抖音视频:连点器设置教程:https://v.douyin.com/iBpTGBbQ/

airtest测试方案

效果

优缺点

上手十分简单,airtest对无基础用户及其友好
速度较慢(主要在于文本获取,有优化空间)

实现原理

利用airtest连接,使用adb连接模拟器,获取控件树内容,获取数字大小,再根据airtest包装好的adb方法,操作设备画出符号

教程

到airtest官网下载airtest工具airtest下载:https://airtest-new.nie.netease.com/update/airtestide安装adb工具
:到adbhttps://dl.google.com/android/repository/platform-tools-latest-windows.zip 网站下载压缩包;解压安装后,把解压路径放到系统变量里去(
点击设置中的系统,然后点击高级系统设置,里面可以设置环境变量,如图)


3. 打开airtest IDE 右侧点击连接设备,如果没有出现设备,说明adb没有安装成功


4. 在左侧代码框复制下面的代码

dev=device()for j in range(30):    touch((542, 1202))    wait(Template(r"tpl1728559665389.png", record_pos=(-0.028, -0.299), resolution=(1080, 1920)))    for i in range(10):        time.sleep(0.1)        nums = poco(name="android.widget.TextView")        if len(list(nums))!=0:            num1 = nums[2].get_text()            num2 = nums[3].get_text()[1:]            num1 = float(num1)            num2 = float(num2)                 if num1 > num2:            dev.swipe_along([(537, 1253), (779, 1435), (537, 1684)],duration=0.01)            print('>')        else:            dev.swipe_along([(537, 1253), (321, 1423), (537, 1684)],duration=0.01)            print('<')

代码中的tp…png内容需要自己截图替换:打开一次pk,点击左侧上方的wait,然后到右侧屏幕框选数字中间的问号,把自动生成的wait代码替换我上面的wait…()

开始pk后马上运行脚本

ocr方案

效果

优缺点

速度能匹敌大学生,比较稳定,不受反爬虫影响
ocr识别需要一定时间,配置环境较为复杂,有一定的错误率

原理

利用adb(类似原理的js,python工具)获取设备截图,识别指定区域的数字,再通过adb工具模拟绘制大于小于号。

教程

对于ocr项目,有较完善完整的github教程:https://github.com/ChaosJulien/XiaoYuanKouSuan_Auto?tab=readme-ov-file根据github教程操作即可,但可能需要一定的摸索时间

抓包改包方案(适用于练习场)

效果

在这里插入图片描述

优缺点

利用网络抓包截取数据,可以直接获取答案或者修改,修改空间大,实现效果多,速度快
配置较复杂,容易遇到问题,会受到官方接口修改影响,不稳定

原理

利用中间人服务截取模拟器的网络请求,并进行重写,对小猿口算app获取的数据进行修改。

教程

此方案也有较为详细的github仓库,读者可以先参考其内容进行配置:抓包改包github仓库https://github.com/cr4n5/XiaoYuanKouSuan

如果希望达到我的视频的相同效果,可以按照以下步骤:
先按照该github仓库配置模拟器环境:安卓模拟器配置教程:https://github.com/cr4n5/XiaoYuanKouSuan/blob/main/README_EMULATOR.md

然后新建一个python文件(至于python的编译环境,这里不赘述了),在该python环境pip install mitmproxy

然后打开cmd命令提示符执行

adb shell settings put global http_proxy ip:8080

其中IP替换为你的本机ip

然后添加python文件,命名为main.py,注意不要运行

import mitmproxyimport reimport jsonemptylist = []class Demo:    def request(self, flow: mitmproxy.http.HTTPFlow):        request = flow.request            def response(self, flow):        # 获取响应对象        response = flow.response        request = flow.request        if 'https://xyks.yuanfudao.com/leo-math/android/exams?' in request.url:            res = response.json()            print('获取到数据包:', res)            for i in res["questions"]:                i["answer"] = "1"   #将答案都改成1                i["answers"]=["1"]   #将答案都改成1                i["userAnswer"]=i["answer"] #将答案改成正确答案                i['status']=1  #将回答结果设置为正确            # 以上两种选择一种即可,看需求            res["questionCnt"]=1000  #这里设置题目数量,可以设置1000刷能量,也可以设置成一题            res["questions"] = res["questions"][:1] #一题对应的代码            res["questions"] = res["questions"]*10  #1000题对应的代码,注意开始练习时要选择10,因为10*10=10            print('修改res:',res)            with open('change.json', 'w') as f:                json.dump(res, f)            with open('change.json', 'r') as g:                res = json.load(g)            # 设置返回数据            response.set_text(json.dumps(res))            print(response.text)        if 'https://xyks.yuanfudao.com/leo-game-pk/android/math/pk/match?' in request.url:            res = response.json()            print('获取到数据包:', res)            for i in res['examVO']["questions"]:                i["answer"] = "1"                i["answers"]=["1"]            res['examVO']["questionCnt"]=1            res['examVO']["questions"] = res['examVO']["questions"][:1]            print('修改res:',res)            with open('change.json', 'w') as f:                json.dump(res, f)            with open('change.json', 'r') as g:                res = json.load(g)            # 设置返回数据            response.set_text(json.dumps(res))            print(response.text)addons = [    Demo()]

然后在该python文件所在的文件夹打开命令提示符,运行mitmweb -s main.py
然后在app中你应该就能看到想要的结果,改为一题或者很多,答案改为1或是直接植入正确答案
后续如果想要自动,那只需要结合前面方案(adb,连点器,airtest)模拟滑动即可,如果设置了直接植入正确答案,可以直接用连点器点击跳过。
你可以运行

import osfor i in range(1000):    os.system('adb shell input tap 952 135')  #实际坐标与模拟器有关,可以通过airtest获取坐标

来进行连点

js篡改方案

效果

优缺点

配置难度与前一个方案类似,实现pk场快速对决
易被官方反爬虫和接口修改影响

实现原理

pk场利用了webview实现一些功能,通过修改返回的js代码,修改判断函数,实现所有答案不通过判断即判断为正确

教程

该教程同样于github开源,是大佬对混淆js的分析发现的漏洞。可以参照:js修改https://github.com/cr4n5/XiaoYuanKouSuan

作者本人测试不需要安装HttpCanary,只需要保持上一个方案的环境即可,经过作者优化,只需要把刚刚的main.py修改为:

import mitmproxyimport reimport jsonemptylist = []class Demo:    def request(self, flow: mitmproxy.http.HTTPFlow):        request = flow.request            def response(self, flow):        # 获取响应对象        response = flow.response        request = flow.request        if 'https://xyks.yuanfudao.com/leo-math/android/exams?' in request.url:            res = response.json()            print('获取到数据包:', res)            for i in res["questions"]:                i["answer"] = "1"   #将答案都改成1                i["answers"]=["1"]   #将答案都改成1                i["userAnswer"]=i["answer"] #将答案改成正确答案                i['status']=1  #将回答结果设置为正确            # 以上两种选择一种即可,看需求            res["questionCnt"]=1000  #这里设置题目数量,可以设置1000刷能量,也可以设置成一题            res["questions"] = res["questions"][:1] #一题对应的代码            res["questions"] = res["questions"]*10  #1000题对应的代码,注意开始练习时要选择10,因为10*10=10            print('修改res:',res)            with open('change.json', 'w') as f:                json.dump(res, f)            with open('change.json', 'r') as g:                res = json.load(g)            # 设置返回数据            response.set_text(json.dumps(res))            print(response.text)        if 'https://xyks.yuanfudao.com/leo-game-pk/android/math/pk/match?' in request.url:            res = response.json()            print('获取到数据包:', res)            for i in res['examVO']["questions"]:                i["answer"] = "1"                i["answers"]=["1"]            res['examVO']["questionCnt"]=1            res['examVO']["questions"] = res['examVO']["questions"][:1]            print('修改res:',res)            with open('change.json', 'w') as f:                json.dump(res, f)            with open('change.json', 'r') as g:                res = json.load(g)            # 设置返回数据            response.set_text(json.dumps(res))            print(response.text)        if 'https://leo.fbcontent.cn/bh5/leo-web-oral-pk/exercise' in request.url:            original = response.text            funname = re.search(r"(?<=isRight:)[^,]*?\(.*?\).*?(?=\|)",original).group()            print('替换函数名:',funname)            if funname!=None:                response.set_text(original.replace(funname,funname+"||true"))                print('替换成功')addons = [    Demo()]

然后保存即可,如果你在前面关闭了执行mitmweb -s main.py的命令窗口,重新执行即可。
然后app中所有的回答都会被判断为正确,之后的自动化与上一方案同理。

frida破密包方案 与 apk逆向破密sign方案

这两个方案难度较大,能够实现请求数据和sign的破解,进而实现直接设置答题结果耗时,数量等强大功能。

目前作者遇到较多问题,还未实现,具体的实现方案以开源并在跟进
frida破密https://github.com/xmexg/xyks
有更高需求的读者可以关注学习,但也要注意法律问题!

如果实现遇到问题,欢迎在下方留言,文章在公众号同样发布,在公众号下方留言回复更快

致谢

各方案汇总于网络和个人实践成果,多膜拜大佬们!感谢github 上 cr4n5,xmexg 等的开源技术和讨论。

创作不易,希望读者点个关注~


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/184216.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1