前言
本文会提供多种小猿口算的自动化做题方案,不同方法的稳定性,实现速度,配置难度都有所不同。对于零基础同学,最为简单的方法也至少需要约两个小时实现功能,如果你是编程爱好者,这会是一个很有意思的过程!
只作为娱乐与安卓自动化和逆向学习用途
使用本项目所产生的任何后果由使用者自行承担。在使用本项目之前,请确保您已充分了解相关法律法规,并确保您的行为符合所在国家或地区的法律要求。未经授权的情况下,请勿将本项目用于商业用途或其他非法用途。
下面介绍的方案难度从简到难,当然效果可能也是也是先劣后优:
- 安卓连点器方案
- airtest自动化测试方案
- ocr方案
- 抓包改包方案(只适用练习场)
- js篡改方案(只适用pk场)
- 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 inrange(30):
touch((542,1202))
wait(Template(r"tpl1728559665389.png", record_pos=(-0.028,-0.299), resolution=(1080,1920)))for i inrange(10):
time.sleep(0.1)
nums = poco(name="android.widget.TextView")iflen(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 mitmproxy
import re
import json
emptylist =[]classDemo:defrequest(self, flow: mitmproxy.http.HTTPFlow):
request = flow.request
defresponse(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=10print('修改res:',res)withopen('change.json','w')as f:
json.dump(res, f)withopen('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)withopen('change.json','w')as f:
json.dump(res, f)withopen('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 os
for i inrange(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 mitmproxy
import re
import json
emptylist =[]classDemo:defrequest(self, flow: mitmproxy.http.HTTPFlow):
request = flow.request
defresponse(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=10print('修改res:',res)withopen('change.json','w')as f:
json.dump(res, f)withopen('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)withopen('change.json','w')as f:
json.dump(res, f)withopen('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 等的开源技术和讨论。
创作不易,希望读者点个关注~
版权归原作者 Freshman小姜 所有, 如有侵权,请联系我们删除。