程序员攻占小猿口算,炸哭小学生!

小学生万万没想到,做个加减乘除的口算练习题,都能被大学生、博士生、甚至是程序员大佬们暴打!

最近这款拥有 PK 功能的《小猿口算》App 火了,谁能想到,本来一个很简单的小学生答题 PK,竟然演变为了第四次忍界大战!

刚开始还是小学生友好 PK,后面突然涌入一波大学生来踢馆,被网友称为 "大学生炸鱼";随着战况愈演愈烈,硕士生和博士生也加入了战场,直接把小学生学习软件玩成了电子竞技游戏,谁说大一就不是一年级了?这很符合当代大学生的精神状态。

然而,突然一股神秘力量出现,是程序员带着科技加入战场! 自动答题一秒一道 ,让小学生彻底放弃,家长们也无可奈何,只能在 APP 下控诉严查外挂。

此时很多人还没有意识到,小学生口算 PK,已经演变为各大高校和程序员之间的算法学术交流竞赛!

各路大神连夜改进算法,排行榜上的数据也是越发离谱,甚至卷到了 0.1 秒一道题!

算法的演示效果,可以看我发的 B 站视频:https://www.bilibili.com/video/BV1xp2hYHEVn

接口也是口,算法也是算,这话没毛病。

这时,官方不得不出手来保护小学生了,战况演变为官方和广大程序员的博弈。短短几天,GitHub 上开源的口算脚本就有好几页,程序员大神们还找到了多种秒速答题的方案。

官方刚搞了加密,程序员网友马上就成功解密,以至于 网传 官方不得不高价招募反爬算法工程师,我建议直接把这些开源大佬招进去算了。

实现方法

事情经过就是这样,我相信朋友们也很好奇秒答题目背后的实现原理吧,这里我以 GitHub 排名最高的几个脚本项目为例,分享 4 种实现方法。当然,为了给小学生更好的学习体验,这里我就不演示具体的操作方法了,反正很快也会被官方打压下去。

方法 1、OCR 识别 + 模拟操作

首先使用模拟器在电脑上运行 App,运用 Python 读取界面上特定位置的题目,然后运用 OCR 识别技术将题目图片识别为文本并输入给算法程序来答题,最后利用 Python 的 pyautogui 库来模拟人工点击和输入答案。

这种方法比较好理解,应用范围也最广,但缺点是识别效果有限,如果题目复杂一些,准确度就不好保证了。

详见开源仓库:https://github.com/ChaosJulien/XiaoYuanKouSuan_Auto

方法 2、抓包获取题目和答案

通过 Python 脚本抓取 App 的网络请求包,从中获取题目和答案,然后通过 ADB(Android Debug Bridge)模拟滑动操作来自动填写答案。然而,随着官方升级接口并加密数据,这种方法已经失效。

详见开源仓库:https://github.com/cr4n5/XiaoYuanKouSuan

方法 3、抓包 + 修改答案

这个方法非常暴力!首先通过抓包工具拦截口算 App 获取题目数据和答案的网络请求,然后修改请求体中的答案全部为 "1",这样就可以通过 ADB 模拟操作,每次都输入 1 就能快速完成答题。 根据测试可以达到接近 0 秒的答题时间!

但是这个方法只对练习场有效,估计是练习场的答题逻辑比较简单,且没有像 PK 场那样的复杂校验。

详见开源仓库:https://github.com/cr4n5/XiaoYuanKouSuan

方法 4、修改 PK 场的 JavaScript 文件

这种方法就更暴力了!在 PK 场模式下,修改 App 内部的 JavaScript 文件来更改答题逻辑。通过分析 JavaScript 响应中的 isRight 函数,找到用于判定答案正确与否的逻辑,然后将其替换为 true,强制所有答案都判定为正确,然后疯狂点点点就行了。

详见开源仓库:https://github.com/cr4n5/XiaoYuanKouSuan

能这么做是因为 App 在开发时采用了混合 App 架构,一些功能是使用 WebView 来加载网页内容的。而且由于 PK 场答题逻辑是在前端进行验证,而非所有请求都发送到服务器进行校验,才能通过直接修改前端 JS 文件绕过题目验证。

官方反制

官方为了保护小学生学习的体验,也是煞费苦心。

首先加强了用户身份验证和管理,防止大学生炸鱼小学生;并且为了照顾大学生朋友,还开了个 "巅峰对决" 模式,让俺们也可以同实力竞技 PK。

我建议再增加一个程序员模式,也给爱玩算法的程序员一个竞技机会。

其实从技术的角度,要打击上述的答题脚本,并不难。比如检测 App 运行环境,发现是模拟器就限制答题;通过改变题目的显示方式来对抗 OCR 识别;通过随机展示部分 UI, 让脚本无法轻易通过硬编码的坐标点击正确的答案;还可以通过分析用户的答题速度和操作模式来识别脚本,比如答题速度快于 0.1 秒的用户,显然已经超越了人类的极限。

0.0 秒的这位朋友,是不是有点过分(强大)了?

但最关键的一点是,目前 App 的判题逻辑是在前端负责处理的,意味着题目答案的验证可以在本地进行,而不必与服务器通信,这就给了攻击者修改前端文件的机会。虽然官方通过接口加密和行为分析等手段加强了防御,但治标不治本,还是将判题逻辑转移到服务端,会更可靠。

当然,业务流程改起来哪有那么快呢?


不过现在的局面也不错,大学生朋友快乐了,程序员玩爽了,口算 App 流量赢麻了,可谓是皆大欢喜!

等等,好像有哪里不对。。。别再欺负我们的小学生啦!

相关推荐
修己xj1 天前
三月,我只想做好这四件事
程序员
不要秃头啊1 天前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
AI探索者1 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者1 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
jonjia1 天前
引入新维度化解权衡难题
程序员
jonjia1 天前
优秀的工程师如何打破规则
程序员
jonjia1 天前
在大厂交付大型项目的策略
程序员
jonjia1 天前
RFC 与设计文档
程序员
jonjia1 天前
为什么你(或任何人)应该成为一名研发经理?
程序员
jonjia1 天前
管理技术质量 (Manage Technical Quality)
程序员