目标网站地址
aHR0cHM6Ly93d3cuYWlnZWkuY29tL3M/cT0lRTglQjclOTElRTYlQUQlQTUmdHlwZT1zb3VuZA==
需求
下载搜索到的所有结果中的预览音频。
分析过程
下载需要登录,但是不登录可以直接播放压缩后的预览音频,因此可以实现捕获。
第一步:获取下载信息
在点击翻页按钮后,可以监听到此请求
s?type=sound&q=搜索关键词&page=2&_pjax=%23tab-mount-content
请求头中的参数在主页的html中可以搜索到
'cccllpptttgt: 08c74eaaab208b45265db2af1f7992fe'
在此请求的返回值中,可以获取到此页内每个item的信息,如
ftype="audio_mp3" fmodel="play" rurl="113619368" extime="1753254000606" token="62affde2b164239242338e4336aaee4a"
cbk="callBackAudioFilePlay" rcbk="downloadAudioCallback"
第二步:获取预览音频文件URL
点击“播放”,系统使用第一步获取的信息,构造加密参数 v 向 /f/d/audio_mp3 发送请求。这个参数 v 明显是经过加密处理的,包含了用户身份验证和文件请求信息。
其响应为:
{"status":"success","message":"aHR0cHM6Ly9zMi5haWdlaS5jb20vc3JjL2F1ZC9tcDMvODgvODg1YWRkYzRjNGRhNDMyMGIxODlmMGMzYjliMWRkNGEubXAzP2U9MTc1MjgxMDEyMCZ0b2tlbj1QN1MyWHB6ZnoxMXZBa0FTTFRrZkhON0Z3LW9PWkJlY3FlSmF4eXBMOmxQeWoybm9TcTBJTVNyb2xueXNDd2VZZWNzbz0=","action":"prev_audio","consumeFundValue":{},"consumeFundRemain":0.0,"freeDownCntRemain":0,"validAction":true,"comsumeFund":true}
可以看到返回值中的message是一个base64,解码即可得到只可被使用一次的预览音频直链
预览音频加密参数构造
查看f12中该请求的“请求发起程序”
send @ jquery.min.js?v=141:1
ajax @ jquery.min.js?v=141:1
fget @ aigei.js:1
fileGet @ aigei.js:1
audioUrlRequest @ aigei-a.js:1
playByEl @ aigei-a.js:1
togglePlay @ aigei-a.js:1
(匿名) @ aigei-a.js:1
dispatch @ jquery.min.js?v=141:1
v.handle @ jquery.min.js?v=141:1
跟栈可知fget为请求参数生成逻辑的核心,其调用了2个核心加密函数dfu和cqbj。
在最终请求前,通过cupie(U['ud'] + '-' + Q)生成了X-Requested-ETag请求头
通过打断点和单步跟踪,可以知道在加密过程中,需要从目录页的html中获取以下几个用于加密的参数
cccllpptttgt
pIii111lllE
vvvvvvviisssss
llliiii1i0o0o0Oii1
lili1lli0o000oO
lllio0o0OO1i111li1lii1
将其和从aigei.js中剥离出的加密函数一起输入到static/encrypt_func.js中,并编写static/encrypt_func_test.js对函数进行测试。
由于剥离的函数中具有getUUID()这一具有随机性调用的函数,加密函数dfu和cqbj的结果无法对照验证
使用此处生成的参数进行请求,报错:
{'status': 'forbidden', 'message': '很抱歉,系统出现了错误,文件下载被阻止,我们已经记录下错误,将会尽快解决!错误代码=8287-2-n', 'consumeFundRemain': 0.0, 'comsumeFund': False, 'validAction': False}
逆向过程在此处陷入了僵局,求大佬指点