如何批量导出唱吧中的歌曲

唱吧里录的歌越来越多想自己下载下来留一份肿么办?想自己做一份清单页分享出来肿么办?宝哥告诉你,世上无难事,只要懂IT。Here we go~

1.登录唱吧网页版

2.执行脚本

打开控制台,执行以下脚本(复制到Console标签中,回车执行),我已经push到“神奇小脚本”中。

var list =[],  
loadSongsUrl ="http://changba.com/member/personcenter/loadmore.php?pageNum=#pageNo#&type=0&userid=9204769",  
loadPlayUrl ="http://changba.com/member/personcenter/loadplayurl.php?wid=#wid#",  
matchMp3Reg =/http://.*?.changba.com/.*?d+.mp3/g;  
var loadSongsCallback =function(pageNo,data,respText,defered){  
    if(respText=='success'&&data.length){
       loadMoreSongs(++pageNo);
   }else{
//console.log(list);
loadPlayUrlInfo(0);  
}
}
var loadMoreSongs =function(pageNo){  
   $.getJSON(loadSongsUrl.replace('#pageNo#',pageNo),null,function(data){
       list = list.concat(data);
   }).done(function(data,respText,defered){
       loadSongsCallback.call(this,pageNo,data,respText,defered);
   });
}
var loadPlayUrlCallback =function(idx,data,respText,defered){  
   console.log('loading '+ idx +'/'+list.length+' song play url');
   if(respText=='success'&&idx<list.length-1){
       loadPlayUrlInfo.call(this,++idx);
   }else{
//console.log(list);
loadMp3UrlInfo(0);  
}
}
var loadPlayUrlInfo =function(idx){  
    var song = list[idx];
    $.get(loadPlayUrl.replace('#wid#',song.workid),null,function(data){
       song.playUrl = data;
   }).done(function(data,respText,defered){
       loadPlayUrlCallback.call(this,idx,data,respText,defered);
   });
}
var loadMp3UrlCallback =function(idx,data,respText,defered){  
   console.log('loading '+ idx +'/'+list.length+' song mp3 url');
   if(respText=='success'&&idx<list.length-1){
       loadMp3UrlInfo.call(this,++idx);
   }else{
       console.log(list);
//console.log(JSON.stringify(list))
}
}
var loadMp3UrlInfo =function(idx){  
    var song = list[idx];
    $.get(song.playUrl,null,function(data){
        var match = data.match(matchMp3Reg);
        song.mp3Url =(match && match[0]);
    }).done(function(data,respText,defered){
       loadMp3UrlCallback.call(this,idx,data,respText,defered);
   });
}
loadMoreSongs(0);  

执行效果图:

grab changba song

脚本都干了什么

它做了三件事。

  • 调用loadSongsUrl这个api去分页获取歌曲json信息
  • 获取所有歌曲后,再调用loadPlayUrl这个api去获取一个个歌曲的播放地址,追加到json信息中。
  • 以上两个api都是唱歌网站提供的。接下来就我采用一种比较直接讨巧的办法去获取每首歌的mp3链接。就是前端用jquery去get播放页的html代码,然后用正则匹配mp3直接地址。同样将获取到的mp3地址追加到json信息中。

最后直接输出json信息即可。你可以console.log(list)输出方便控制台里查看,也可以console.log(JSON.stringify(list))输出后复制出来,保存成.json文件,方便你读取和处理,比如用程序下载mp3文件到本地。

有清单有真相

ok,我已经通过以上方式弄出我唱吧上的歌曲清单页来了,你呢? :)