2020-5-8更新:在線下載網(wǎng)易云VIP音樂,直接復(fù)制地址(去掉#),或者從客戶端復(fù)制鏈接。
從豆瓣切換到網(wǎng)易云后,發(fā)現(xiàn)好多好聽的歌mac用什么軟件下載音樂,但是鵝。。當(dāng)我想把這些歌拿下來扔到車?yán)锏臅r(shí)候,發(fā)現(xiàn)下載是不允許的。我可以聽還是不聽?這是不科學(xué)的。作為程序員,你必須迎接挑戰(zhàn)。
單打下載
如果你只想下載某首歌,你不需要寫代碼。畢竟瀏覽器獲取文件的功能很多,但是如果想要很多下載,這種重復(fù)性的工作就需要扔到程序里面去做。
如果是客戶端,可以右鍵獲取單個(gè)鏈接,然后在瀏覽器中打開。如下:
打開瀏覽器按F12打開控制臺(tái)
在瀏覽器中輸入鏈接后,進(jìn)入頁(yè)面,然后按F12,打開控制臺(tái),點(diǎn)擊進(jìn)入TAB頁(yè)面。
找到
然后點(diǎn)擊播放按鈕,音樂的播放地址會(huì)顯示在視圖中。
底部播放地址
點(diǎn)擊鏈接,打開,復(fù)制mp3的播放地址,在另一個(gè)窗口輸入播放,右鍵保存到本地。
音樂鏈接
以上操作可以下載下載單曲音樂文件。如果你不怕麻煩,也可以按照這個(gè)操作下載下載整個(gè)播放列表的所有歌曲文件。
當(dāng)然,作為程序員,這樣的浪費(fèi)勞動(dòng)是絕對(duì)不允許的。
按程序批處理下載
以下是專業(yè)知識(shí)mac用什么軟件下載音樂,至少需要js相關(guān)知識(shí)和少量代碼編寫操作。
初步步驟 1 - 設(shè)置后端 API
網(wǎng)易云音樂有一個(gè)API接口服務(wù),地址如下:
將 git下載 傳遞到本地后,啟動(dòng)它,然后將其作為 API 服務(wù)器來請(qǐng)求調(diào)用以獲取數(shù)據(jù)。
我在這里提供一個(gè)我使用的。請(qǐng)適度使用。我也不希望IP被封后無法使用。希望不要在自動(dòng)爬取下載的程序中使用,自己使用下載播放列表即可。
第 2 步 - 構(gòu)建本地客戶端下載工具
由于這個(gè)工具僅供我自己使用,并沒有放在上面,這里只是幾個(gè)核心代碼供大家參考。
// api.js
// var api = 'http://localhost:3000';
var api = 'http://music.byyui.com';
//獲得歌單
var superagent = require('superagent');
function MusicLoad ( opt ){
var _default = {
isSingle : false,
getListUrl : api+'/v1/playlist/detail',
getSingleInfo : api+'/v1//music/detail',
getUrl : api+'/v1/music/url',
fs : require('fs'),
url : require('url'),
http : require('http'),
async : require('async')
};
this.opt = Object.assign(_default,opt);
this.init();
}
MusicLoad.prototype.init = function(){
var that = this,opt = that.opt;
if(opt.isSingle){
that.getUrl(that.opt.id,null,function(){
console.log('下載完畢.');
});
}else{
that.getList();
}
}
MusicLoad.prototype.getList = function( ){
var that = this;
superagent.get(that.opt.getListUrl+'?id='+that.opt.id+'&limit=300').end(function(err,res){
if(err){
console.log('無法獲取歌單')
return;
}
var txt = res.text;
var data = JSON.parse(txt);
var list = data.playlist.tracks;
console.log(list.length);
console.log('獲得'+data.playlist.creator.nickname+'的歌單,共計(jì)歌曲:'+list.length+'首');
if(list.length > 0){
//循環(huán),獲得一首,下載一首
var data = list.map(function(item){
return {
id : item.id,
name : item.name
};
});
//開始判斷
if(that.opt.start !== 0){
data = data.slice(that.opt.start,data.length);
console.log('從第'+that.opt.start+'處開始下載,共計(jì)'+(data.length - that.opt.start));
}
that.list = data;
that.startLoad();
}else{
console.log('對(duì)不起,這個(gè)歌單沒有歌曲下載。');
}
});
}
MusicLoad.prototype.startLoad = function(){
var that = this;
var list = that.list,async = that.opt.async;
async.mapLimit(list,1,function(item,cb){
that.getUrl(item.id,item.name,cb);
},function(){
console.log('全部下載完成;');
});
}
MusicLoad.prototype.getUrl = function(id,name,cb){
var that = this;
var target= that.opt.getUrl+'?id='+id+'&br=320000';
console.log(target);
superagent.get(target).end(function(err,res){
if(err){
console.log(err);
cb(err,null);
return;
}
var data =JSON.parse(res.text);
var url = data.data[0].url;
if(typeof url == 'string'){
that.download({id : id,name : name,url : url},cb);
}else{
console.log('沒有獲得該歌曲的URL');
cb(null,null);
}
});
}
MusicLoad.prototype.download = function( item,callback ){
var download = this.opt.download,fs = this.opt.fs,url = this.opt.url,http = this.opt.http;
var href = item.url,
myHref = url.parse(href);
var host = myHref.host,pathname = myHref.pathname;
var http_client = http.request({
hostname: host,
method: 'GET',
path: pathname,
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4',
'Connection': 'keep-alive',
// 'Content-Type': 'application/x-www-form-urlencoded',
// 'Referer': 'http://music.163.com',
'Pragma':'no-cache',
'Host': host,
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
}
}, function(res) {
res.on('error', function(err) {
//回調(diào),報(bào)錯(cuò)
callback(err,null);
});
var fileBuffer = [];
res.on('data',function(chunk){
fileBuffer.push(new Buffer(chunk));
});
res.on('end',function(){
var total = Buffer.concat(fileBuffer);
fs.appendFile(download+'/'+(item.name || item.id) +'.mp3',total,function(err){
console.log('歌曲下載完成:'+item.name);
callback(null,'over');
});
});
});
http_client.end();
}
var Down = function( opt ){
new MusicLoad(opt);
}
module.exports = Down;
上面的api.js是調(diào)用API服務(wù)的工具類,包括下載和獲取數(shù)據(jù)。下面是調(diào)用api.js的入口函數(shù): //app.js
//引入api.js文件
let api = require('./api');
//調(diào)用
api({
isSingle : false,//是否是單曲
id : '87950133',//單曲ID或者歌單ID
start : 0,//從第幾個(gè)開始下載
download : 'f:/redmusic/'//歌曲保存位置
});
console.log('開始下載歌曲..成功率不高');
保存后,執(zhí)行node app。
執(zhí)行效果圖
以上僅用于研究和學(xué)習(xí)。