Greasy Fork

Greasy Fork is available in English.

网易云音乐高音质下载 改自 网易云音乐下载,网易云音乐高音质支持

歌单里好多歌用以前的脚本都404了,于是简单修改了下。

当前为 2017-05-21 提交的版本,查看 最新版本

// ==UserScript==
// @name        网易云音乐高音质下载 改自 网易云音乐下载,网易云音乐高音质支持 
// @description  歌单里好多歌用以前的脚本都404了,于是简单修改了下。
// @version   20170521
// @author         糖果君
// @include     http*://music.163.com/*
// @grant       unsafeWindow
// @grant        GM_xmlhttpRequest
// @require  http://greasyfork.icu/scripts/26727-网易云音乐歌曲封面下载/code/网易云音乐歌曲封面下载.user.js
// @namespace 
// ==/UserScript==
//参考 http://greasyfork.icu/zh-CN/scripts/10548-网易云音乐下载
//以及更早的 http://greasyfork.icu/zh-CN/scripts/1099-netease-music-download
var api = {
    //      //参考 http://greasyfork.icu/zh-CN/scripts/10582-网易云音乐高音质支持
    //     getTrackURL: function (dfsId) {
    //        var byte1 = '3go8&$8*3*3h0k(2)2';
    //         var byte2 = dfsId + '';
    //         var byte3 = [];
    //         for (var i = 0; i < byte2.length; i++) {
    //             byte3[i] = byte2.charCodeAt(i) ^ byte1.charCodeAt(i % byte1.length);
    //         }
    //         byte3 = byte3.map(function (i) {
    //             return String.fromCharCode(i);
    //         }) .join('');
    //         var results = unsafeWindow.CryptoJS.MD5(byte3) .toString(unsafeWindow.CryptoJS.enc.Base64) .replace(/\//g, '_') .replace(/\+/g, '-');
    //         var url = 'http://p2.music.126.net/' + results + '/' + byte2 + '.mp3';
    //         return url;
    //     },
    //     request: function (callback, url) {
    //         var req = new XMLHttpRequest();
    //         req.open('GET', url, true);
    //         req.onload = function () {
    //             callback(JSON.parse(this.responseText));
    //         };
    //         req.send();
    //     },
    encrypt_request: function (callback, url, data) {
        // 这个好像不重要。var token = unsafeWindow.document.cookie.split('__csrf') [1].split(';') [0].substring(1); 
        var token = '';
        data.csrf_token = token;
        var req = new XMLHttpRequest();
        req.open('POST', url + token, true);
        req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        req.onload = function () {
            callback(JSON.parse(this.responseText));
        };
        //参考  https://github.com/darknessomi/musicbox/wiki/网易云音乐新版WebAPI分析。
        var pubKey = '010001';
        var modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';
        var nonce = '0CoJUm6Qyw8W8jud';
        var result = unsafeWindow.asrsea(JSON.stringify(data), pubKey, modulus, nonce);
        req.send('params=' + encodeURIComponent(result.encText) + '&encSecKey=' + encodeURIComponent(result.encSecKey));
    },
    detail: function (songId, callback) {
        var url = '/weapi/v3/song/detail?csrf_token=';
        var data = {
            c:
            JSON.stringify([{
                id: songId
            }
                           ])
        };
        this.encrypt_request(callback, url, data);
    },
    lrc: function (songId, callback) {
        var url = '/weapi/song/lyric?csrf_token=';
        var data = {
            id: songId,
            lv: - 1,
            tv: - 1
        };
        this.encrypt_request(callback, url, data);
    },
    newsong: function (songId, callback) {
        var url = '/weapi/song/enhance/player/url?csrf_token=';
        var data = {
            ids: [songId],
            br: 999000,
        };
        this.encrypt_request(callback, url, data);
    },
    mv: function (mvId, callback) {
        var url = '/weapi/mv/detail/';
        var data = {
            id: mvId,
        };
        this.encrypt_request(callback, url, data);
    },
};
var innerFrame = document.querySelector('iframe');
var pages = [
    {
        url: 'music.163.com/#/song?id=',
        handler: function () {
            var songId = location.href.match(/id=([0-9]+)/) [1];
            var downloadLine = this.createDownloadLine(songId);
            var innerFrameDoc = innerFrame.contentWindow.document;
            var albumNode = innerFrameDoc.querySelectorAll('p.des.s-fc4') [1];
            var parentNode = albumNode.parentNode;
            parentNode.insertBefore(downloadLine, albumNode.nextElementSibling);
        },
        createDownloadLine: function (songId) {
            var disableStyle = function (link) {
                link.text += '(无)';
                link.style.color = 'gray';
                link.style.textDecoration = 'none';
                link.style.cursor = 'auto';
            };
            var setUrlAndSize = function (mp3Link, Music) {
                if (Music) {
                    var href = Music.url;
                    if (href) {
                        mp3Link.href = href;
                        mp3Link.text += (Music.size / 1024 / 1024) .toFixed(1) + 'M';
                        return ;
                    }
                }
                disableStyle(mp3Link);
            };
            var setLyric = function (LycLink, result) {
                var LrC='';
                var lrc=result.lrc;
                var tlrc=result.tlyric;
                var num=0;
                if(lrc && lrc.lyric){
                    LrC+=lrc.lyric+'\n';
                    num+=1;}
                if( tlrc&& tlrc.lyric){
                    LrC+=tlrc.lyric;
                    num+=2;}


                if(num!=0){
                    var html='';
                    switch(num){
                        case 1:html="(原)";break;
                        case 2:html="(译)";break;
                        case 3:html="(合)";break;
                    }
                    LycLink.href = 'data:text/plain;charset=utf-8,' +encodeURIComponent(LrC);
                    LycLink.innerHTML+=html;
                }else{
                    disableStyle(LycLink);
                }   
            };

            var setMV = function (mvLink, mv) {
                mvLink.href=mv[720]|| mv[480]|| mv[240];
            };
            //  var mp3Link = this.createLink('歌曲(旧)');
            var newMp3Link = this.createLink('歌曲');
            var lyricLink = this.createLink('歌词');
            var mvLink = this.createLink('mv');
            api.detail(songId, function (result) {
                var song = result.songs[0];
                // setUrlAndSize(mp3Link, song.hMusic ? song.hMusic : song.mMusic ? song.mMusic : song.lMusic);
                if (song.mv) {
                    api.mv(song.mv, function (result) {
                        var mv = result.data.brs;
                        setMV(mvLink, mv );
                    });
                } 
                else {
                    disableStyle(mvLink);
                };
            });
            api.newsong(songId, function (result) {
                var song = result.data[0];
                setUrlAndSize(newMp3Link, song);
            });
            api.lrc(songId, function (result) {
                setLyric(lyricLink, result);
            });
            var container = this.createLineContainer('下载');
            //  container.appendChild(mp3Link);
            container.appendChild(newMp3Link);
            container.appendChild(lyricLink);
            container.appendChild(mvLink);
            return container;
        },
        createLink: function (label) {
            var link = document.createElement('a');
            link.innerHTML = label;
            link.className = 's-fc7';
            link.style.marginRight = '10px';
            link.href = 'javascript:void(0);';
            link.target = '_blank';
            return link;
        },
        createLineContainer: function (label) {
            var container = document.createElement('p');
            container.className = 'desc s-fc4';
            container.innerHTML = label + ':';
            container.style.margin = '10px 0';
            return container;
        },
    },
];
if (innerFrame) {
    innerFrame.addEventListener('load', function () {
        var i,page;
        for (i = 0; i < pages.length; i += 1) {
            page = pages[i];
            if (location.href.indexOf(page.url) !=-1) {
                page.handler();
            }
        }
    });
}
var addcookie = function (e) {
    if (e.shiftKey) {
        if (e.keyCode == 49)
        {
            document.cookie = 'os=linux';
            //document.cookie = 'osver=Ubuntu%2016.10';
           // document.cookie = ' appver=1.0.0.1026';
            //document.cookie = ' __remember_me=true';
            //document.cookie = 'MUSIC_U=06836c39987860966e291afd7d5a9c976809a126d62c8db78e347a67b521db573ce1d89e6aac6994a735680ac8dbd977eb9d1f08e23b047aea8e9e58b0ce0e3b';
            location.reload();
        } 
        else if (e.keyCode == 50)
        {
            document.cookie = 'os=';
            location.reload();
        }
    }
};
window.addEventListener('keydown', addcookie);