ximalaya-download

喜马拉雅音乐或视频下载

当前为 2024-10-27 提交的版本,查看 最新版本

// ==UserScript==
// @name        ximalaya-download
// @namespace   https://gf.qytechs.cn/zh-CN/users/135090
// @grant       none
// @version     1.4.3
// @author      zwb83925462
// @license     BSD
// @description 喜马拉雅音乐或视频下载
// @run-at      document-end
// @require     https://registry.npmmirror.com/ajax-hook/3.0.3/files/dist/ajaxhook.min.js
// @require     https://registry.npmmirror.com/crypto-js/4.2.0/files/crypto-js.js
// @require     https://registry.npmmirror.com/jquery/3.7.1/files/dist/jquery.min.js
// @match       https://www.ximalaya.com/sound/*
// @match       https://www.ximalaya.com/album/*
// @match       https://m.ximalaya.com/album/*
// ==/UserScript==

setTimeout(function(){
    'use strict';
    //获取单曲解析结果
    if (location.pathname.includes("/sound/")){
        var playurl;
        var title=document?.querySelector("h1.title")?.textContent || document?.querySelector("h1.title-wrapper")?.textContent;
        if (window?.location?.pathname?.includes("sound")){
            var trackid=window?.location?.pathname?.split("/")[2];
            var item={
                id:trackid,
                ttl:title
            };
            setTimeout(function(){
                var link = document.createElement("a");
                var container = document.body;
                link.id="mp4";
                link.style="position:fixed;top:10%;left:2%";
                link.style.display = "block";
                link.style.color = "#230de5";
                getAllMusicURL2(item).then(result=>{
                    playurl=result?.toString();
                    return playurl;
                }).then(data=>{
                    if (data == undefined){
                        link.textContent="未购买,无法下载";
                        link.style.fontSize = "20px";
                        link.style.color="#F00";
                    } else {
                        link.download=item.ttl;
                        link.textContent=item.ttl;
                        console.log(link.href=data);
                    }
                });
                container.append(link);
            },2000);
        }
        async function getAllMusicURL2(item) {
            function decrypt(t) {
                return CryptoJS.AES.decrypt({
                    ciphertext: CryptoJS.enc.Base64url.parse(t)
                }, CryptoJS.enc.Hex.parse('aaad3e4fd540b0f79dca95606e72bf93'), {
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7
                }).toString(CryptoJS.enc.Utf8);
            }
            var res = null;
            var ares = null;
            const timestamp = Date.parse(new Date());
            var url = `https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/${timestamp}?device=web&trackId=${item.id}&forVideo=true&needMp4=true`;
            var aurl =`https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/${timestamp}?device=web&trackId=${item.id}`;
            $.ajax({
                type: 'get',
                url: aurl,
                async: false,
                dataType: "json",
                success: function(resp) {
                    try {
                        ares = decrypt(resp.trackInfo.playUrlList[0].url);
                    } catch (e) {
                        console.log("无效");
                    }
                }
            });
            $.ajax({
                type: 'get',
                url: url,
                async: false,
                dataType: "json",
                success: function(resp) {
                    try {
                        res = decrypt(resp.trackInfo.playUrlList[0].url);
                        item.ttl += ".mp4";
                    } catch (e) {
                        console.log("解密错误,无视频");
                        item.ttl += ".m4a";
                        res=ares;
                    }
                }
            });
            return res;
        }
    }
    //获取专辑列表
    if (location.pathname.includes("/album/") && location.hostname == "www.ximalaya.com"){
        var alt=[];
        var ttls=[];
        var abid=location.pathname.includes("/album/") ? location.pathname.split("/")[2] : "77545064";
        var abapi=`https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=${abid}&pageNum=1&pageSize=100`;
        setTimeout(function(){
        fetch(abapi,{method:"get"})
        .then(res=>{var jsondata=res?.json();return jsondata;})
        .then(res=>{
            var trackcount=res?.data?.trackTotalCount;
            if (trackcount == 0){
                var adt2;
                for (let name of document.scripts) {
                    if (name.innerHTML.indexOf("window.__INITIAL_STATE__") == 0){
                        //console.log(name.innerHTML);
                        if (name.innerHTML.indexOf("AlbumDetailTrackListV2") > 0) {
                            var sid=name.innerHTML.indexOf("AlbumDetailTrackListV2")+24;
                            var eid=name.innerHTML.indexOf("SeoSearchPage")-2;
                            var adt=name.innerHTML.substring(sid,eid);
                            console.log(adt2=adt);
                        }
                    }
                }
                var ti=JSON.parse(adt2);
                trackcount=ti.tracksInfo.trackTotalCount;
                console.log(trackcount);
            }
            var pagenums=(trackcount/100 | 0) + (trackcount % 100 >0 ? 1 : 0);
            //var pagenums = (trackcount % 100 >0 ? trackcount+100 : trackcount) / 100 | 0;
            console.log(pagenums);
            var tracks=res?.data?.tracks;
            tracks.forEach(i=>{
                alt.push(i.url);ttls.push(i.title);
            });
            return pagenums;
        })
        .then(pns => {
            if (pns > 1){
                var abapinew=abapi.replace('pageNum=1','pageNum='+pns);
                var morehtm=`<a id="newab" target="_blank" href="${abapinew}">${abapinew}</a>`
                morehtm += `<p id=tip>专辑曲目超过100,请修改API参数后再访问.最大页码为${pns}</p>`;
                var alink=document.createElement("p");
                alink.innerHTML=morehtm;
                document.querySelector(".sound-list").append(alink);
            }
            document.querySelector(".sound-list > .download-more").remove();
            document.querySelector(".sound-list>ul").innerHTML="";
            document.querySelector(".sound-list>ul").style.listStyle = 'decimal';
            ttls.forEach((it,n)=>{
                console.log(it,n+1);
                var ulli=document.createElement("li");
                var plink=document.createElement("a");
                plink.href=alt[n];
                plink.target="_blank";
                plink.style.color="#088";
                plink.style.fontSize="20px";
                plink.textContent=it;
                ulli.append(plink);
                document.querySelector(".sound-list>ul").append(ulli);
            });
        });},500)
    }
    //list-view__body,{"id","store"
    //移动版视图
    if (location.pathname.includes("/album/") && location.hostname == "m.ximalaya.com"){
        var adt2;
        for (let name of document.scripts) {
            if (name.innerHTML.indexOf("window.__INITIAL_STATE__") == 0){
                //console.log(istt = name.innerHTML.substring(27,name.innerHTML.length-1));
                //console.log(JSON.parse(istt));
                if (name.innerHTML.indexOf(`"store"`) > 0) {
                    var sid=name.innerHTML.indexOf(`"store"`)+8;
                    var eid=name.innerHTML.length-2;
                    var adt=name.innerHTML.substring(sid,eid);
                    //console.log(adt2=adt);
                    adt2=adt;
                }
            }
        }
        var ti=JSON.parse(adt2);
        var trackcount=ti.albumPage.trackPageInfo.total;
        console.log("总数"+trackcount);
        var pagenums=(trackcount/30 | 0) + (trackcount % 30 >0 ? 1 : 0);
        //var pagenums = (trackcount % 100 >0 ? trackcount+100 : trackcount) / 100 | 0;
        console.log("页数"+pagenums);
        var abapi=`https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=${abid}&pageNum=1&pageSize=30`;
        var pns=pagenums;
        if (pns > 1){
            document.querySelector("div.list-view__footer > a").remove();
            var abapinew=abapi.replace('pageNum=1','pageNum='+pns);
            var morehtm=`<a id="newab" target="_blank" href="${abapinew}">${abapinew}</a>`
            morehtm += `<p id=tip>专辑曲目超过30,请修改API参数后再访问.最大页码为${pns}</p>`;
            var alink=document.createElement("p");
            alink.innerHTML=morehtm;
            document.querySelector("div.list-view__footer").append(alink);
        } else {
            document.querySelector("div.list-view__footer").remove();
        }

    }
},500);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址