前言
本文会提供多种小猿口算的自动化做题方案,不同方法的稳定性,实现速度,配置难度都有所不同。对于零基础同学,最为简单的方法也至少需要约两个小时实现功能,如果你是编程爱好者,这会是一个很有意思的过程!
只作为娱乐与安卓自动化和逆向学习用途
使用本项目所产生的任何后果由使用者自行承担。在使用本项目之前,请确保您已充分了解相关法律法规,并确保您的行为符合所在国家或地区的法律要求。未经授权的情况下,请勿将本项目用于商业用途或其他非法用途。
下面介绍的方案难度从简到难,当然效果可能也是也是先劣后优:
安卓连点器方案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工具:到adb
https://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…()
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 等的开源技术和讨论。
创作不易,希望读者点个关注~