Greasy Fork

Greasy Fork is available in English.

酷狗在线听/下载/vip

无需登录在线听你想听的音乐

当前为 2023-04-11 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         酷狗在线听/下载/vip
// @namespace    http://tampermonkey.net/
// @version      1.7
// @icon         https://i0.hdslb.com/bfs/album/0d58ba3462659867aa46633d4a4791e93160ffb5.jpg
// @description  无需登录在线听你想听的音乐
// @author       今天是充满希望的一天
// @match        *://www.kugou.com/mixsong/*
// @match        *://www.kugou.com/song/*
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/jquery-confirm/3.3.4/jquery-confirm.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js
// @resource css https://cdn.bootcdn.net/ajax/libs/jquery-confirm/3.3.4/jquery-confirm.min.css
// @connect      music.api.goodluckweb.top
// @connect      m.kugou.com
// ==/UserScript==
console.log("==================================插件启动成功==================================")
// 2022-12-20新增批量下载,以及部分功能的优化
let loc = location.href;
var mp3_Name = "";
var download_hash = "";
var download_hash_list = "0";
if (loc.indexOf("www.kugou.com/song/") > 0 || loc.indexOf("www.kugou.com/mixsong/") > 0) {
    // 定义变量
    let mp3_Hash = "";
    let sq_hash = "";
    let g_hash = "";
    let albumid = "";
    // 当前播放的最高音质url
    let mp3_Url = "";

    // 添加按钮选择音质
    let down_load_div = document.getElementsByClassName("btnArea2 clearfix")[0];
    down_load_div.innerHTML = "";

    // 超高音质
    let button_ws = document.createElement("button");
    button_ws.id = "down_load_ws";
    button_ws.textContent = "下载超高音质(需设置flac为白名单)";
    button_ws.style.width = "230px";
    button_ws.style.height = "50px";
    button_ws.style.color = "#FFFFFF";
    button_ws.style.cursor = "pointer";
    button_ws.style.background = "#000000";
    down_load_div.appendChild(button_ws);
    $('#down_load_ws').hover(function () {
        $(this).css('background', '#232020')
        $(this).css('color', '#BCBBBB')
    }, function () {
        $(this).css('background', '#000000')
        $(this).css('color', '#FFFFFF')
    })
    // 高音质
    let button_g = document.createElement("button");
    button_g.id = "button_g";
    button_g.textContent = "下载高音质";
    button_g.style.width = "230px";
    button_g.style.height = "50px";
    button_g.style.color = "#FFFFFF";
    button_g.style.cursor = "pointer";
    button_g.style.background = "#000000";
    button_g.style.margin = "3px 0px";
    down_load_div.appendChild(button_g);
    $('#button_g').hover(function () {
        $(this).css('background', '#232020')
        $(this).css('color', '#BCBBBB')
    }, function () {
        $(this).css('background', '#000000')
        $(this).css('color', '#FFFFFF')
    })
    // 普通音质
    let button_mp3 = document.createElement("button");
    button_mp3.id = "button_mp3";
    button_mp3.textContent = "下载普通音质";
    button_mp3.style.width = "230px";
    button_mp3.style.height = "50px";
    button_mp3.style.color = "#FFFFFF";
    button_mp3.style.cursor = "pointer";
    button_mp3.style.background = "#000000";
    down_load_div.appendChild(button_mp3);
    $('#button_mp3').hover(function () {
        $(this).css('background', '#232020')
        $(this).css('color', '#BCBBBB')
    }, function () {
        $(this).css('background', '#000000')
        $(this).css('color', '#FFFFFF')
    })


    // 点击下载按钮 超高音质
    button_ws.onclick = function () {
        if (sq_hash == download_hash) {
            alert(mp3_Name + " 已在下载中!")
        } else {
            download_hash = sq_hash;
            downloadBySrc(mp3_Url,0);
        }
    };
    // 点击下载按钮 高音质
    button_g.onclick = function () {
        if (g_hash == download_hash) {
            alert(mp3_Name + " 已在下载中!");
        } else {
            download_hash = g_hash;
            getMp3UrlSrc(g_hash, albumid, 0);
        }
    };
    // 点击下载按钮 普通音质
    button_mp3.onclick = function () {
        if (mp3_Hash == download_hash) {
            alert(mp3_Name + " 已在下载中!");
        } else {
            download_hash = mp3_Hash;
            getMp3UrlSrc(mp3_Hash, albumid, 0);
        }
    };

    // // 点击下载按钮 超高音质
    // document.getElementById('pb_download').onclick = function () {
    //     if (download_url == mp3_Url) {
    //         alert(mp3_Name + " 已在下载中!")
    //     } else {
    //         downloadBySrc(mp3_Url);
    //         setTimeout(function () {
    //             document.getElementsByClassName('ui-popup ui-popup-show ui-popup-focus')[0].style.display = "none"
    //         }, 50)
    //     }
    // };

    // 监听audio开始播放事件(事件在视频/音频(audio/video)开始播放时触发。)
    document.getElementById('myAudio').addEventListener("play", function () {
        // 判断是否需要修改src属性
        if (document.getElementById('myAudio').getAttribute("data-hash") != mp3_Hash) {
            mp3_Hash = document.getElementById('myAudio').getAttribute("data-hash");
            let play_hash = mp3_Hash;
            let searchQualityUrl = 'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=' + play_hash;
            // 查询音质
            GM_xmlhttpRequest({
                method: "get",
                url: searchQualityUrl,
                onload: function (r) {
                    let jsonTxt = r.responseText;
                    let json = JSON.parse(jsonTxt);
                    albumid = json.albumid.toString();
                    g_hash = json.extra['320hash'];
                    if (g_hash == '') {
                        button_g.style.display = 'none';
                    } else {
                        button_g.style.display = 'block';
                        play_hash = g_hash;
                    }
                    sq_hash = json.extra.sqhash;
                    if (sq_hash == '') {
                        button_ws.style.display = 'none';
                    } else {
                        button_ws.style.display = 'block';
                        play_hash = sq_hash;
                    }
                    // 访问第三方解析无损接口
                    get_sq_url = "https://music.api.goodluckweb.top/url/byhash?hash=" + play_hash + "&albumid=" + albumid;
                    // get请求获取无损音质的信息
                    GM_xmlhttpRequest({
                        method: "get",
                        url: get_sq_url,
                        onload: function (r) {
                            let jsonTxt = r.responseText;
                            let json = JSON.parse(jsonTxt);
                            mp3_Url = json.data.play_url;
                            mp3_Name = json.data.audio_name;
                            document.getElementById('myAudio').src = mp3_Url;
                            //document.getElementById('openKugou').href = mp3_Url;
                            if (document.getElementById('myAudio').paused) {
                                document.getElementById('myAudio').play();
                            }
                            console.log(mp3_Name + mp3_Url.substr(mp3_Url.lastIndexOf(".")) + "   加载完成");
                        }
                    })
                }
            })
        }
    })
    // 直接用最暴力的方法,修改id
    document.getElementById("bar").id = 'new_bar';
    $("#new_bar").off("click").on("click", function(e) {
        let new_pre = e.offsetX / $("#progress_middle").width();
        document.getElementById('myAudio').currentTime = myAudio.duration * new_pre;
    });
} else if (loc.indexOf("/yy/rank/") > 0 || loc.indexOf("/yy/html/rank.html") > 0) {
    let download_div = document.getElementById("pc_temp_title");

    document.getElementsByClassName("pc_temp_btn_s02 pc_temp_bicon_play")[0].style.marginTop = "0px";
    $(".pc_rank_title .pc_temp_title").css("font-size", "12px");
    let form = document.createElement("form");
    let radio_sq = document.createElement("input");
    radio_sq.type = "radio";
    radio_sq.name = "choose_q";
    radio_sq.value = "0";
    radio_sq.style.marginLeft = "15px";
    let radio_sq_label = document.createElement('label');
    radio_sq_label.textContent = "超高音质";
    radio_sq_label.id = "radio_sq_label";
    radio_sq.style.cursor = "pointer";
    radio_sq_label.style.cursor = "pointer";
    let radio_g = document.createElement("input");
    radio_g.type = "radio";
    radio_g.name = "choose_q";
    radio_g.value = "1";
    radio_g.style.marginLeft = "15px";
    let radio_g_label = document.createElement('label');
    radio_g_label.textContent = "高音质";
    radio_g_label.id = "radio_g_label";
    radio_g.style.cursor = "pointer";
    radio_g_label.style.cursor = "pointer";
    let radio_d = document.createElement("input");
    radio_d.type = "radio";
    radio_d.name = "choose_q";
    radio_d.value = "2";
    radio_d.style.marginLeft = "15px";
    radio_d.defaultChecked = true;
    let radio_d_label = document.createElement('label');
    radio_d_label.textContent = "标准音质";
    radio_d_label.id = "radio_d_label";
    radio_d.style.cursor = "pointer";
    radio_d_label.style.cursor = "pointer";
    form.style.display = "inline";
    form.appendChild(radio_sq);
    form.appendChild(radio_sq_label);
    form.appendChild(radio_g);
    form.appendChild(radio_g_label);
    form.appendChild(radio_d);
    form.appendChild(radio_d_label);
    download_div.appendChild(form);
    // 点击label,模拟点击对应的radio
    $("#radio_sq_label").click(function () {
        $('[name="choose_q"]').eq(0).trigger("click");
    })
    $("#radio_g_label").click(function () {
        $('[name="choose_q"]').eq(1).trigger("click");
    })
    $("#radio_d_label").click(function () {
        $('[name="choose_q"]').eq(2).trigger("click");
    })
    // 下载所选按钮
    let download_button = document.createElement("button");
    download_button.id = "download_select";
    download_button.textContent = "下载所选音乐";
    download_button.style.width = "100px";
    download_button.style.height = "34px";
    download_button.style.color = "#fff";
    download_button.style.cursor = "pointer";
    download_button.style.background = "#169af3";
    download_button.style.marginLeft = "20px";
    download_div.appendChild(download_button);
    $('#download_select').hover(function () {
        $(this).css('background', '#158fe1')
    }, function () {
        $(this).css('background', '#169af3')
    })

    $('#download_select').click(function () {
        if (download_hash_list == "1") {
            alert("正在下载中,请稍后,如长时间无反应,请刷新后重试!");
            return;
        }
        download_hash_list = "1";
        // 全选
        if ($('.checkedAll').attr("class").indexOf("pc_temp_btn_checked") > 0) {
            $.confirm({
                title: '下载提示',
                content: '你确定要下载所有选中的音乐吗?',
                type: 'green',
                icon: 'glyphicon glyphicon-question-sign',
                buttons: {
                    ok: {
                        text: '确认',
                        btnClass: 'btn-primary',
                        action: function () {
                            global.features.forEach(function (song, index) {
                                if ($('[name="choose_q"]:checked').val() == 0) {
                                    // 使用同步方式
                                    (async function () {
                                        let sqhash = await getSqHashOrGHash(song.Hash, "sqhash");
                                        getMp3UrlSrc(sqhash, song.album_id, song.FileName);
                                    })()
                                } else if ($('[name="choose_q"]:checked').val() == 1) {
                                    (async function () {
                                        let ghash = await getSqHashOrGHash(song.Hash, '320hash');
                                        getMp3UrlSrc(ghash, song.album_id, song.FileName);
                                    })()
                                } else {
                                    getMp3UrlSrc(song.Hash, song.album_id, song.FileName);
                                }
                            })
                        }
                    },
                    cancel: {
                        text: '取消',
                        btnClass: 'btn-primary',
                        action: function() {
                            download_hash_list = "0";
                        }
                    }
                }
            })
        } else {
            $.confirm({
                title: '下载提示',
                content: '你确定要下载所有选中的音乐吗?',
                type: 'green',
                icon: 'glyphicon glyphicon-question-sign',
                buttons: {
                    ok: {
                        text: '确认',
                        btnClass: 'btn-primary',
                        action: function () {
                            // 获取选中的
                            $('.pc_temp_btn_checked').each(function () {
                                let song_index = $(this).attr("data-index");
                                let song = global.features[song_index];
                                mp3_Name = song.FileName;
                                if ($('[name="choose_q"]:checked').val() == 0) {
                                    // 使用同步方式
                                    (async function () {
                                        let sqhash = await getSqHashOrGHash(song.Hash, "sqhash");
                                        getMp3UrlSrc(sqhash, song.album_id, song.FileName);
                                    })()
                                } else if ($('[name="choose_q"]:checked').val() == 1) {
                                    (async function () {
                                        let ghash = await getSqHashOrGHash(song.Hash, '320hash');
                                        getMp3UrlSrc(ghash, song.album_id, song.FileName);
                                    })()
                                } else {
                                    // setTimeout(function () { getMp3UrlSrc(song.Hash, song.album_id, song.FileName); }, 5000);
                                    getMp3UrlSrc(song.Hash, song.album_id, song.FileName);
                                }
                            });
                        }
                    },
                    cancel: {
                        text: '取消',
                        btnClass: 'btn-primary',
                        action: function() {
                            download_hash_list = "0";
                        }
                    }
                }
            })
        }
        setTimeout(function () { download_hash_list = "0"; }, 5000);
    })

}

// 获取高音质或者超高音质的hash
function getSqHashOrGHash(hash, quality) {
    let searchQualityUrl = 'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=' + hash;
    let quality_hash = "";
    // 查询音质
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "get",
            url: searchQualityUrl,
            onload: function (r) {
                let jsonTxt = r.responseText;
                let json = JSON.parse(jsonTxt);
                quality_hash = json.extra[quality];
                if (quality_hash == "" && quality == "sqhash") {
                    quality_hash = json.extra['320hash'];
                }
                if (quality_hash == "") {
                    quality_hash = hash;
                }
                // 返回的值,quality_hash
                resolve(quality_hash);
            }
        })
    })
}
// 获取高音质或者普通音质的MP3地址并且下载
function getMp3UrlSrc(d_hash, albumid, file_name) {
    let get_url = "https://music.api.goodluckweb.top/url/byhash?hash=" + d_hash + "&albumid=" + albumid;
    GM_xmlhttpRequest({
        method: "get",
        url: get_url,
        onload: function (r) {
            let jsonTxt = r.responseText;
            let json = JSON.parse(jsonTxt);
            downloadBySrc(json.data.play_url, file_name);
        }
    })
}

// 点击下载 by url
function downloadBySrc(download_url_quality, file_name) {
    let down_name = file_name != 0 ? file_name : mp3_Name;
    let download_url = download_url_quality;
    let loaded = 0.0;
    NProgress.set(0.0);
    GM_download({
        url: download_url,
        name: down_name + download_url.substr(download_url.lastIndexOf(".")),
        saveAs: true,
        onerror: function (error) {
            //如果下载最终出现错误,则要执行的回调
            console.log(error)
            console.log(down_name + "  下载报错,请反馈!");
        },
        onprogress: (pro) => {
            //如果此下载取得了一些进展,则要执行的回调
            // console.log(pro.loaded) //文件加载量
            // console.log(pro.totalSize) //文件总大小
            let size = (pro.loaded / pro.totalSize).toFixed(1);
            if (loaded != size) {
                loaded = size;
                NProgress.inc(0.1);
            }
        },
        ontimeout: () => {
            //如果此下载由于超时而失败,则要执行的回调
            console.log(down_name + "下载超时,请反馈!");
        },
        onload: () => {
            //如果此下载完成,则要执行的回调
            console.log(down_name + "   下载完成!");
            download_hash = "";
            NProgress.done();
        }
    })
}
GM_addStyle(GM_getResourceText("css"));
//========================================= nprogress.min.css
GM_addStyle(`
#nprogress{pointer-events:none}#nprogress .bar{background:#f90;position:fixed;z-index:1031;top:0;left:0;width:100%;height:5px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #f90,0 0 5px #f90;opacity:1;-webkit-transform:rotate(3deg) translate(0,-4px);-ms-transform:rotate(3deg) translate(0,-4px);transform:rotate(3deg) translate(0,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#f90;border-left-color:#f90;border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
`);
//=========================================jq的confirm
GM_addStyle(`
.jconfirm-box-container .jconfirm-box{width: 281px;}
`);