1. 前言
书接上文,继续完善刷课脚本。上周我们已经将共享课视频部分给过掉了,接下来我们要继续弄刷题部分。起初我以为这部分应该会很简单,只需要找到获取题目的接口,然后找一个第三方题库对接,最后再找到提交题目的接口,就可以美美的完成了!但是理想很丰满现实很骨感,中间还是遇到了不少困难,要不然我也不会在这一个点整整卡了一周哈哈哈哈。接下来我会一步一步的阐述我是如何解决这些问题的。
2.代码实现
2.1 题库选择
我们学校是不需要刷课的,我咨询了一下我的朋友,他说他的ocs刷课脚本使用的言溪题库,我也是直接搜索了一下
太好了,果然有API开发者文档,直接照着文档对接就完事了
心里是这么想的,但是在测试接口响应的时候发现了问题
就是这个多选题响应的时候,答案隔开的方式五花八门的,让人很烦恼
我也是找到了客服问了一下,客服说是早期收录不规范导致的,并把ocs平台的源码甩给我,让我自己看看照着改一改
很快就找到了可能分割的所有字符串类型,这个问题就解决了
2.2刷课平台响应题目格式不统一
我找了多门课并观察了一下他们的题目格式,发现既然都不统一
以上两张图是两门不同课程的题目模板
这个很明显是将服务器响应的题目直接用html解析然后渲染在页面上
我最开始的想法是使用正则表达式来匹配中文汉字,但是我仔细想想这样好像不行,因为有些标签里面也是会有汉字的,这样匹配说不定会有错
后面我又想到了之前大一的时候刚入坑爬虫的时候,学了一个xpath的方法,可以解析html页面
那我们何不直接将这个内容获取下来,然后在他们两边加上html标签,然后直接使用xpath解析,获取整个页面的所有文本信息,这个获取到的文本信息就是我们想要的题目
每次获取到题目和答案的时候都用这个函数处理一下,就能筛选出我们想要的文本内容了
若是服务器响应的是img标签,想要提取出其中的src属性,也可以用一样的方法先解析页面,再获取标签属性
现在仔细想想,开始学js逆向了以后就甚少使用xpath了,当时遇到这个问题的时候第一反应既然想不到xpath,是不是提醒我该复习了哈哈哈哈
2.3 空间推理验证码
把以上的思路全部转成代码,运行,正当我以为一切都结束的时候,现实给了我当头一击。我观察日志,在代码正常运行一段时间后,日志突然报错,我查看了一下服务器响应了msg:滑动验证未通过(忘记截图了。。。)
当时我还不当回事,心想不就是个风控吗,让我看看怎么个事,当我打开页面,我直接人傻了。。。
好好好这就是你说的滑动验证码是吧。。。这明明是空间推理验证码。。。
这也是我第一次在网页上真实的见到这种验证码,也不知道怎么解决这个问题,我去网上查资料,读到了一篇使用yolov8来进行物体识别的文章
我仔细想了一下,既然物体都能识别的如此准确,那识别这种方方正正的验证码不是右手就行
打开yolo的github网页
直接将所有的配置都拉到我们本地,方便我们使用
我读的那篇文章使用yolov8写的,我看了一下官方文档,现在都出到yolo11了都,但我担心新版本不稳定(可能是多余的担心。。。),还是选择了yolov8。
这里我直接使用官方预训练好的yolov8n模型配上我自己的数据集来训练我们自己的模型
直接在搜索引擎搜索yolov8.np
点进去,找到yolov8n.np
点一下就能直接下载了
这里可以看到yolov8除了n版本,还有s,m等版本,n应该是最菜的版本,但是我硬件条件也不太行,就用这个最简单的就行了
在我们刚刚下载到本地的配置里,找到cfg(config配置)文件夹
在这个配置文件夹下,我们最关心的就是datasets(数据集),models(模型)的配置
我们先来看数据集的配置
对于v8模型,官方文档指出对应的配置文件是coco128,我们构建自己的数据集的时候也要按照这个格式来
观察一下coco128配置文件的结构
上面的path就是你的数据集的位置,train(训练使用的数据集)和val(训练完后验证使用的数据集)的路径要填写相对于path的路径,test是可选项不用管
这个names就是你的标签类别了
再来看看模型的配置
点击modoules,再点击v8
最上面这个就是yolov8的配置文件了
最上面的这个nc参数就是最关键的,这个是数据集标签的数量,如果我们要构建自己的数据集,这里要改成我们自己数据集的标签数量
在根目录下新建一个我们自己的文件夹,将刚刚提到的配置文件复制一份进来
注意,将yolov8.yaml复制进文件夹后,最好改个名字,比如,你要使用n模型,就改成yolov8n.yaml;若你要使用s模型,就改成yolov8s.yaml,若是不改名,训练的时候会默认使用n模型
这里的mydata.yaml就是coco128.yaml,我自己改了个名字
我们先来创建一个conda的虚拟环境以便运行,具体怎么创建可以去查一下anaconda的使用
创建好环境了以后我们激活一下我们的环境
然后将我们的项目选择这个创建的虚拟环境就行
在这个虚拟环境中执行pip install ultralytics,安装我们所需的虚拟环境
这里会默认安装cpu版本的pytorch,若是想提高训练速度,可以自己删掉cpu版本的pytorch,自己手动安装GPU版本的pytorch,具体怎么做去网上搜教程吧,官方建议的v8模型最好使用版本大于2.0的pytorch,我亲自试过安装了1.8版本的pytorch,结果在训练的时候爆显存了,所以听人劝吃饱饭。。。
然后就到数据集的构建了,根据官方给的coco128数据集,我们可知我们最后构建的数据集应该长这样
这个images中的train2017就是我们提前下载的图片
直接写个爬虫代码不断地请求验证码的接口,就可以批量获取验证码图片了
至于这个labels中的train2017装的是什么,一会儿说~
我们先来看看如何构建自己的数据集,先按照刚刚数据集的结构建好,labels中的train2017暂时啥都不放
在激活虚拟环境后执行pip install labelimg
安装完后,直接输入labelimg后回车打开这个工具
打开工具后,先点击open dir,选择我们存放图片的那个文件夹
然后点击 change save dir,这个就选择那个labels中的train2017文件夹
再点击一下这里,切换成yolo输出模式
然后点击create RectBox,就可以框选需要识别的目标了,然后给该目标加上标签,这些信息都会以txt文本的格式输出到刚刚选择的labels 中的train2017文件夹中
全部标记好了以后,可以看到labels中有很多txt文件
随便点击一个进去看看,都是一些刚刚框选目标的坐标信息
除了这些文件,还有一个classes.txt
都是我们标记的标签类型,还记得我们刚刚看过的数据集配置文件吗,这个要按照以下这种格式写入配置文件
然后模型的配置模型这里的nc要改成自己标签对应的种类
我这里有124种标签,所以这里写124
然后我们改一下数据集的路径,这边建议按我说的改,先打开我图片中的路径,把Ultralytics的配置文件改一下
点击settings.json,将数据集路径的配置置空
然后回到我们的项目,将path改为我们自己数据集的绝对路径
然后就可以开始训练了
训练的代码很简单,如下图
如果你是在windows系统下运行的这段代码,一定要加上图中框出的东西,关闭多线程,否则会报错
执行代码,等代码执行完毕以后,会看到项目文件夹中多了个runs文件夹
该文件夹中的这个权重文件夹中的best.pt就是我们训练出来效果最好的模型
接下来我们用这个模型来预测
在预测结果中,result.boxes中就存放着预测的所有信息,包括检测到目标的框的坐标,以及框的标签名称,还有置信度等
运行代码,查看结果
可以看见训练的效果还不错,拿到边框信息后,就可以根据四个坐标取框的中点,这个中点就是点击的坐标
3.结语
这个空间推理验证码的逆向部分就不多说了,和滑块的那个大差不差,感兴趣的可以自己去易盾官网试试
这也是我第一次玩深度学习,收获不少,且答题部分在完善了这个验证码后也是全部完成了!
努力了三个周终于有了结果,嘿嘿