有人要用来下载56听书网音频,因为有时候网络用不了,所以分析了一下,在爬虫下也有同样的需求场景。另外推荐一款免费听书APP。
地址分析
首先查看播放页,音频src
放在了一对动态生成audio标签
里:
1 |
<audio id="jp_audio_0" preload="metadata" src="地址"></audio> |
在audio地址用了一个简单的加密解密处理,播放页datas
变量中调用:
1 |
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里:
1 2 3 4 5 6 7 8 |
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还原:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$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
时:
1 2 3 4 5 6 7 8 9 10 |
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一下得到返回串就行:
1 2 3 4 5 6 7 8 |
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听书网音频地址获取
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。