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

Freshman小姜 2024-10-22 12:07:01 阅读 64

前言

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

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

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

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

安卓连点器方案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下载:<code>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. 在左侧代码框复制下面的代码

<code>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")code>

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教程:<code>https://github.com/ChaosJulien/XiaoYuanKouSuan_Auto?tab=readme-ov-file根据github教程操作即可,但可能需要一定的摸索时间

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

效果

在这里插入图片描述

优缺点

利用网络抓包截取数据,可以直接获取答案或者修改,修改空间大,实现效果多,速度快

配置较复杂,容易遇到问题,会受到官方接口修改影响,不稳定

原理

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

教程

此方案也有较为详细的github仓库,读者可以先参考其内容进行配置:抓包改包github仓库<code>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 = []

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 os

for i in range(1000):

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

来进行连点

js篡改方案

效果

优缺点

配置难度与前一个方案类似,实现pk场快速对决

易被官方反爬虫和接口修改影响

实现原理

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

教程

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

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

import mitmproxy

import re

import json

emptylist = []

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 等的开源技术和讨论。

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。