需求分析:爬取掌上高考每一年的专业录取分数

声明:本文章只用于学习研究,禁止用于但不限于商业用途、批量爬取

抓包

因为换页要求登录,所以我们打开开发者工具以后点下一年就会重新发数据包

分析后发现这个数据包就是请求的数据,返回数据和请求包都有加密,请求包里有个signsafe参数

分析请求包

ctrl+shift+f全局搜索signsafe,发现有两个js文件包含signsafe

先点开最后一个看,格式化以后继续搜索signsafe,发现uri是sendsmscode的,继续看看另外一个包(猜测:算法应该一样的,直接扣这个应该也可以)

发现只要带有signsafe的都是p赋值的,直接在p赋值的地方打上断点,然后继续发送请求包分析

认真看一下js代码,发现是url进行了HmacSHA1加密,密钥是常量D23ABC@#56,直接使用python改写

signsafe加密代码

1
2
3
4
5
6
7
8
9
10
11
import base64
import hmac
from hashlib import sha1

def hash_hmac(key, code):
hmac_code = hmac.new(key.encode(), code.encode(), sha1).digest()
return base64.b64encode(hmac_code).decode()

t = 'api.eol.cn/web/api/?local_batch_id=7&local_province_id=53&local_type_id=1&page=1&school_id=263&size=10&special_group=&uri=apidata/api/gk/score/special&year=2020'
k = 'D23ABC@#56'
print(hash_hmac(k, t))

结果和网站js加密的一致,还有一个c()(g),盲猜md5,结果猜对了

加了md5以后结果和网站一致,signsafe参数逆向结束,这里不提供爬虫完整代码

返回数据分析

看响应包应该是aes加密,我们先搜搜aes解密的特征(如果有混淆就无效):AES.encrypt、aes.encrypt、AES.decrypt、aes.decrypt

很荣幸我们搜到了,进去看看是不是解密的地方,decrypt是解密,encrypt是加密, 別搞混了

看到这代码,熟悉的味道,这肯定是webpack,之前看过一篇自动扣webpack的文章里面有工具,我忘记收藏了,度娘一波

找到一篇文章:https://blog.csdn.net/zjq592767809/article/details/122355530,花了30秒看完文章以后开始实操,研究了一下,不太方便,要安装很多依赖,而且不是通用的,还不如自己扣,e和n是可以写死的,a就是text加密字符串;完结撒花!!!!

由于js解密代码6万多行,就不贴代码出来了,需要的可以留言,仅供学习研究!!!