网易云批量下载脚本

话不多说,希望网易别告我侵权…

思路

开始

故事是这样的…本来我的音乐一栏都是用的外链,data 格式类似这样:

var musicData  = [{
    name: 'Treat You Better',
    artist: 'Shawn Mendes',
    url: 'https://[...].mp3',
    cover: 'https://p1.music.126.net/82rRBYyqOSEbneKr4cJAjQ==/1391981732024962.jpg'
},...]

至于这个 url 是从别的地方扒的,随手谷歌就有很多生成网易云外链的(不过现在都失效了)。

风云突变

后来网易好像发现了大家经常这么扒,就换成了临时 url ,反正就是一两个小时就换一个的那种,虽然还是能扒到 url 但是几个小时就变了也没有意义了。

这个事情还是有一天舍友告诉我说你的博客上的歌怎么听不了了我才发现的(。

于是我就考虑把歌放到服务器好了,这样至少是个永久的 url 不怕它改来改去。

所以就写了下面的代码用来批量下载

ID

歌曲的 ID 可以从网易云的网页版获取,进入歌曲页面即可。例如 https://music.163.com/#/song?id=415904452 的ID即为 415904452

代码

var http = require('http');
var request = require('request');
var fs = require('fs');
var _data  = [{
    name: 'Treat You Better',//必需,用于命名
    artist: 'Shawn Mendes',
    id: '415904452',//必需
},...]

function downloadFile(uri, filename, callback) {
    var req = http.request(uri, function(res) {
        console.log("request: " + filename + " return status: " + res.statusCode);
        if (res.statusCode == '302') {
            var realurl = res.headers['location']
            if (fs.existsSync(filename)) {
                console.log(filename + ' exists!');
            } else {
                var stream = fs.createWriteStream(filename);
                request(realurl).pipe(stream).on('close', callback);
            }
        }
    });
    req.on('error', function(e) {
        console.log("request  error, try again");
    });
    req.end();
}
_data.musicData.forEach((elem) => {
    var fileUrl = "https://music.163.com/song/media/outer/url?id=" + elem.id + ".mp3";
    var filename = 'src/musics/' + elem.name + '.mp3';//下载地址和命名
    downloadFile(fileUrl, filename, function() {
        console.log(filename + '下载完毕');
    });
})

使用方式

用 node 跑(…

随便说说

网易这个临时url的理论是通过重定向跳转,所以直接向https://music.163.com/song/media/outer/url?id=xxxx.mp3"; 这个 url 发送 get 请求是无法获取的,需要进行跳转后才能获取到真实地址。