56听书网音频地址获取

有人要用来下载56听书网音频,因为有时候网络用不了,所以分析了一下,在爬虫下也有同样的需求场景。另外推荐一款免费听书APP。

56听书网音频地址获取
56听书网音频地址获取

地址分析

首先查看播放页,音频src放在了一对动态生成audio标签里:

1<audio id=”jp_audio_0″ preload=”metadata” src=”地址”></audio>

在audio地址用了一个简单的加密解密处理,播放页datas变量中调用:

1var 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里:

12345678function 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还原

1234567891011121314$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时:

12345678910if(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一下得到返回串就行:

12345678if ($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];}

提取还原真实地址步骤

  1. 抓取或指定url
  2. 获得datas
  3. 还原真实地址
  4. 下载