有人要用来下载56听书网音频,因为有时候网络用不了,所以分析了一下,在爬虫下也有同样的需求场景。另外推荐一款免费听书APP。
地址分析
首先查看播放页,音频src
放在了一对动态生成audio标签
里:
<audio id="jp_audio_0" preload="metadata" src="地址"></audio>
在audio地址用了一个简单的加密解密处理,播放页datas
变量中调用:
var datas = (FonHen_JieMa('*121*111*117*115*104*101*110*103*47*50*55*57*55*51*47*48*38*50*48*50*57*38*116*99').split('&'));
解密函数在main.js里:
function FonHen_JieMa(u){
var tArr = u.split("*");
var str = '';
for(var i=1,n=tArr.length;i<n;i++){
str += String.fromCharCode(tArr[i]);
}
return str;
}
针对它写个还原就行,例如PHP还原:
$str = "*104*116*116*112*115*58*47*47*111*100*46*113*105*110*103*116*105*110*103*46*102*109*47*109*52*97*47*53*97*100*56*51*100*51*54*55*99*98*56*57*49*52*101*49*51*49*51*53*99*50*50*95*49*48*49*48*48*52*50*57*95*54*52*46*109*52*97*38*51*52*50*38*109*52*97";
$audio = '';
$code = explode("*", $str);
$re = '';
foreach (array_filter($code) as $v) {
$re.= chr($v);
}
$re = explode('&', $re);
# $re[0]就是音频地址了。
$audio = $re[0];
其它语言类似,比较简单不一一写了。
其实他就是把这个这个字符串(46*120*109*99*100*110*46*99*111*109*47*103)这样的,用(*)号分割之后,再将每个数字转成了字符再拼接起来的
.fromCharCode()
将 Unicode 编码转为一个字符:比如65-->A
,解密出来的真实地址主要有.m4a 和 .mp3
两种格式。
AJAX音频地址
这里需要注意的是,音频地址有两种,第一种是直接返回音频地址(解密看上面),另一种是ajax获取返回真实地址
,当数组三(格式)等于tc
时:
if(datas[2]==='tc'){
url = url.split('/');
url = url[0]+'/'+url[1]+'/play_'+url[1]+'_'+url[2]+'.htm';
console.log('tc',url);
ajaxLoadData('/player/tingchina.php',{url:url});
}else{
url=url.replace(':82','');
console.log('else',url);
$("#fonhen-player").jPlayer("setMedia",{mp3:url,m4a:url}).jPlayer('play');
}
那么操作的时候你只需要curl一下得到返回串就行:
if ($re[2]==='tc') {
$res = explode("/", $re[0]);
$url = '/fonhen_player/tingchina.php?url='.$res[0].'/'.$res[1].'/play_'.$res[1].'_'.$res[2].'.htm';
$result = curl_file_get_contents($url);
$audio = $result['url'];
} else {
$audio = $re[0];
}
提取还原真实地址步骤
- 抓取或指定url
- 获得datas
- 还原真实地址
- 下载
原文连接:56听书网音频地址获取
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。