因为学校有要求要做四史活动所以就去分析了一下
目前已经完成了题库收集题目算法查重,成品就不发出来了怕有人卖分,就讲讲一路来的思路以及如何去分析的。
首先还是做题的时候抓下包分析一下题目的来源以及如何提交并判断答案是否正确,
从抓的包分析 进入答题一共会有三种请求分别是:
1.获取本次答题所有题目id的GET请求;(提交答题类型,获取随机抽出的题目id)
2.通过题目id获取题目选项的GET请求;(提交题目id,获取题目选项)
3.通过题目id获取题目答案的POST请求;(提交题目id以及选择的答案id,获取正确答案选项的id以供判断是否正确)
第一眼看到(2.)中返回的题目详情 就感觉题目id并不是很简单的固定id
下面是(1.)中返回的题目id;
对比发现不管是 题目id 还是 题目的选项id 和 答案id 都是长为24的中英文混合字符串
下面是(2.)中返回的题目详情
当我发现和题目有关的id并不是固定的而且并不能判断是用什么加密方式的时候 便想到了两条路
1.通过将题目详情api中返回的题目title和选项title去除干扰无用的标签以及其他的一些东西
例:以下是一个选项的截图 红框框出的是我们所需要的选项内容 其他的都是干扰无用的东西
2.直接强干加密(当然我是走的第二条路子)
当然这时候并没有思路去解密
去干扰思路
通过分析多个选项 发现 如果需要使用题目明文储存题库的话需要去除一些无用的东西
红框框出的含有display:none的style属性的标签是干扰用的,去除前后干扰标签以及内部文字(内部标签有的话先不去除)
再次寻找到如果去除干净再去除所有标签剩余就是需要的选项内容
例如上图中
第一次去除绿色部位
第二次去除剩余标签部位,剩下就是就是需要的选项内容
题目去干扰也是同样的方式
大体收集题库思路就是 每次获取选项以及题目,去干扰后暂时保存(保存id以及明文),随便选一个得到答案id后,给后台提交题目明文以及答案明文
获取后台答案思路就是 获取到题目后,给后台发送题目明文,后台匹配到答案明文输出 (题目建议md5摘要后储存)
好处是不需要分析id,且这样不可能发生题目重复答案不同(用id来分析的发生了)
但是这种储存题目的方法有个问题,就是提交答案时是用选项id去提交,并且去除干扰代码写起来有点麻烦(没试过)
分析id思路
一下为相同题目的6次id和6次A选项的 id
这里我就不详细说了就说一下思路
通过对比每次题目id变化以及选项id变化,发现变化是有一定规律
发现规律之后需要想出一种能够用该规律去判断id或者选项是否相同(这时候还不能保证题目重复的问题)
我用的一种摘要算法
然后就可以开始储存,每次需要提交题目id以及所有选项id去判断 题目的选项摘要然后返回提交的选项中正确的那个(多个选项储存为:正确选项1|正确选项2)
但是会有一定概率题目不同但是id的摘要相同,那怎么办呢,我琢磨了以后发现,其实题目id的摘要重复并不是什么大问题,因为每次返回答案的时候都需要提交该题目的选项id
所以就可以将不同题目相同id摘要的答案像多选题一样储存然后判断提交的选项摘要数据库是否含有,并返回。
大体思路就是这样具体实现就不说了,若有缺陷还请指出,感谢!!!