0


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

前言

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

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

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

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

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

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

目录

必备的工具

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

安卓连点器方案

效果

优缺点

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

实现原理

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

教程

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

airtest测试方案

效果

优缺点

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

实现原理

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

教程

  1. 到airtest官网下载airtest工具airtest下载:https://airtest-new.nie.netease.com/update/airtestide
  2. 安装adb工具 :到adbhttps://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…()

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

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

标签: 自动化 前端

本文转载自: https://blog.csdn.net/weixin_67016521/article/details/142897443
版权归原作者 Freshman小姜 所有, 如有侵权,请联系我们删除。

“小猿口算自动化多方案代码及教程!”的评论:

还没有评论