吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12343|回复: 452
收起左侧

[Web逆向] 新版QQ音乐下载获取

    [复制链接]
13955925361 发表于 2026-1-2 22:09
本帖最后由 13955925361 于 2026-1-5 21:20 编辑

大家新年快乐,我用自己绿钻cookies写了个下载QQ音乐的接口,手慢无。
支持搜索歌手或歌名,支持本地批量下载,支持单曲选择下载与链接播放。
保存的是mp3格式,任何播放器都可以收听,没有加密限制。
下载会默认保存到本地QQ音乐文件夹,我打包创建好了的。效果如图所示。


此贴完结,账号已被风控,访问403,是各位下的太多太快了么,热情我感受到了,代码没问题可以借鉴,请改自己cookies,或者换ip

QQ20260102-215539.png

QQ20260102-221817.png
cookies修改在这,把这个字典改一下。

QQ20260105-210506.png


QQ20260103-112100.png


代码在这


JS代码:
jiemi.js:


[JavaScript] 纯文本查看 复制代码

window=global


window.crypto=require("crypto")
location={

    "host": "y.qq.com",

}

navigator={'userAgent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"}



var j = "undefined" !== typeof e ? e : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : void 0;
(function () {
        var e = [];

        function t(e, t, n) {
            for (var r = [], i = 0; i++ < t;)
                r.push(e += n);
            return r
        }

        var n = t(0, 43, 0).concat([62, 0, 62, 0, 63]).concat(t(51, 10, 1)).concat(t(0, 8, 0)).concat(t(0, 25, 1)).concat([0, 0, 0, 0, 63, 0]).concat(t(25, 26, 1));

        function r(e) {
            for (var t, r, i = String(e).replace(/[=]+$/, ""), o = i.length, a = 0, u = 0, c = []; u < o; u++)
                ~(r = n[i.charCodeAt(u)]) && (t = a % 4 ? 64 * t + r : r,
                a++ % 4) && c.push(255 & t >> (-2 * a & 6));
            return c
        }

        function i(e) {
            return e >> 1 ^ -(1 & e)
        }

        var o = function (e) {
            for (var t = [], n = "undefined" != typeof Int8Array ? new Int8Array(r(e)) : r(e), o = n.length, a = 0; o > a;) {
                var u = n[a++]
                    , c = 127 & u;
                u >= 0 ? t.push(i(c)) : (c |= (127 & (u = n[a++])) << 7,
                u >= 0 || (c |= (127 & (u = n[a++])) << 14,
                u >= 0 || (c |= (127 & (u = n[a++])) << 21,
                u >= 0 || (c |= (u = n[a++]) << 28))),
                    t.push(i(c)))
            }
            return t
        };
        return function (t, n) {
            var r = o(t)
                , i = function (t, n, o, u, c) {
                return function s() {
                    for (var l, f, p = [o, u, n, this, arguments, s, r, 0], d = void 0, h = t, g = []; ;)
                        try {
                            for (; ;)
                                switch (r[++h]) {
                                    case 0:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 1:
                                        p[r[++h]] = !1;
                                        break;
                                    case 2:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 3:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 4:
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 5:
                                        p[r[++h]] = p[r[++h]] | p[r[++h]];
                                        break;
                                    case 6:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        break;
                                    case 7:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 8:
                                        p[r[++h]] = p[r[++h]] - 0;
                                        break;
                                    case 9:
                                        p[r[++h]] = p[r[++h]] ^ p[r[++h]];
                                        break;
                                    case 10:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            p[r[++h]] = r[++h],
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 11:
                                        p[r[++h]] = new p[r[++h]];
                                        break;
                                    case 12:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 13:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = a(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        break;
                                    case 14:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = Array(r[++h]),
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 15:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]];
                                        break;
                                    case 16:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]]);
                                        break;
                                    case 17:
                                        return p[r[++h]];
                                    case 18:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 19:
                                        p[r[++h]] = p[r[++h]] + p[r[++h]],
                                            p[r[++h]] = p[r[++h]];
                                        break;
                                    case 20:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 21:
                                        p[r[++h]] = p[r[++h]] + r[++h];
                                        break;
                                    case 22:
                                        p[r[++h]] = new p[r[++h]](p[r[++h]]);
                                        break;
                                    case 23:
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                            ++h)];
                                        break;
                                    case 24:
                                        p[r[++h]][p[r[++h]]] = p[r[++h]];
                                        break;
                                    case 25:
                                        p[r[++h]] = "",
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 26:
                                        p[r[++h]] = ++p[r[++h]];
                                        break;
                                    case 27:
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 28:
                                        p[r[++h]] = "";
                                        break;
                                    case 29:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = p[r[++h]].apply(p[r[++h]], l);
                                        break;
                                    case 30:
                                        p[r[++h]] = p[r[++h]].call(d);
                                        break;
                                    case 31:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]] >> r[++h],
                                            p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 32:
                                        p[r[++h]] = typeof p[r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 33:
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 34:
                                        p[r[++h]] = null;
                                        break;
                                    case 35:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 36:
                                        p[r[++h]] = d;
                                        break;
                                    case 37:
                                        for (p[r[++h]] = p[r[++h]][p[r[++h]]],
                                                 l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 38:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 39:
                                        p[r[++h]] = r[++h],
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 40:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 41:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]], p[r[++h]]);
                                        break;
                                    case 42:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = typeof p[r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 43:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = r[++h],
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 44:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 45:
                                        p[r[++h]] = p[r[++h]] << r[++h];
                                        break;
                                    case 46:
                                        return p[r[++h]] = d,
                                            p[r[++h]];
                                    case 47:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] < p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 48:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 49:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 50:
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 51:
                                        p[r[++h]] = !0;
                                        break;
                                    case 52:
                                        p[r[++h]] = p[r[++h]] === r[++h];
                                        break;
                                    case 53:
                                        p[r[++h]] = {};
                                        break;
                                    case 54:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]] === p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 55:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]]);
                                        break;
                                    case 56:
                                        p[r[++h]] = r[++h];
                                        break;
                                    case 57:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 58:
                                        p[r[++h]] = Array(r[++h]);
                                        break;
                                    case 59:
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 60:
                                        p[r[++h]] = p[r[++h]] % p[r[++h]];
                                        break;
                                    case 61:
                                        p[r[++h]] = p[r[++h]] < p[r[++h]];
                                        break;
                                    case 62:
                                        p[r[++h]] = -p[r[++h]];
                                        break;
                                    case 63:
                                        p[r[++h]] = p[r[++h]] === p[r[++h]];
                                        break;
                                    case 64:
                                        p[r[++h]] = r[++h],
                                            p[r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 65:
                                        p[r[++h]] = p[r[++h]] > p[r[++h]];
                                        break;
                                    case 66:
                                        p[r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 67:
                                        p[r[++h]] = !p[r[++h]];
                                        break;
                                    case 68:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]] + r[++h],
                                            p[r[++h]] = ""
                                }
                        } catch (t) {
                            if (g.length > 0 && (e = []),
                                e.push(h),
                            0 === g.length)
                                throw c ? c(t, p, e) : t;
                            h = g.pop(),
                                e.pop()
                        }
                }
            }
                , a = function (t, n, o, u, c) {
                return function s() {
                    for (var l, f, p = [o, u, n, this, arguments, s, r, 0], d = void 0, h = t, g = []; ;)
                        try {
                            for (; ;)
                                switch (r[++h]) {
                                    case 0:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 1:
                                        p[r[++h]] = !1;
                                        break;
                                    case 2:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 3:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 4:
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 5:
                                        p[r[++h]] = p[r[++h]] | p[r[++h]];
                                        break;
                                    case 6:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        break;
                                    case 7:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 8:
                                        p[r[++h]] = p[r[++h]] - 0;
                                        break;
                                    case 9:
                                        p[r[++h]] = p[r[++h]] ^ p[r[++h]];
                                        break;
                                    case 10:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            p[r[++h]] = r[++h],
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 11:
                                        p[r[++h]] = new p[r[++h]];
                                        break;
                                    case 12:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 13:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = a(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        break;
                                    case 14:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = Array(r[++h]),
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 15:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]];
                                        break;
                                    case 16:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]]);
                                        break;
                                    case 17:
                                        return p[r[++h]];
                                    case 18:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 19:
                                        p[r[++h]] = p[r[++h]] + p[r[++h]],
                                            p[r[++h]] = p[r[++h]];
                                        break;
                                    case 20:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 21:
                                        p[r[++h]] = p[r[++h]] + r[++h];
                                        break;
                                    case 22:
                                        p[r[++h]] = new p[r[++h]](p[r[++h]]);
                                        break;
                                    case 23:
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                            ++h)];
                                        break;
                                    case 24:
                                        p[r[++h]][p[r[++h]]] = p[r[++h]];
                                        break;
                                    case 25:
                                        p[r[++h]] = "",
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 26:
                                        p[r[++h]] = ++p[r[++h]];
                                        break;
                                    case 27:
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 28:
                                        p[r[++h]] = "";
                                        break;
                                    case 29:
                                        for (l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = p[r[++h]].apply(p[r[++h]], l);
                                        break;
                                    case 30:
                                        p[r[++h]] = p[r[++h]].call(d);
                                        break;
                                    case 31:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]] >> r[++h],
                                            p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 32:
                                        p[r[++h]] = typeof p[r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 33:
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 34:
                                        p[r[++h]] = null;
                                        break;
                                    case 35:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 36:
                                        p[r[++h]] = d;
                                        break;
                                    case 37:
                                        for (p[r[++h]] = p[r[++h]][p[r[++h]]],
                                                 l = [],
                                                 f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {
                                        }
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 38:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 39:
                                        p[r[++h]] = r[++h],
                                            p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 40:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 41:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]], p[r[++h]]);
                                        break;
                                    case 42:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = typeof p[r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 43:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = r[++h],
                                            p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 44:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 45:
                                        p[r[++h]] = p[r[++h]] << r[++h];
                                        break;
                                    case 46:
                                        return p[r[++h]] = d,
                                            p[r[++h]];
                                    case 47:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] < p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 48:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 49:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]][p[r[++h]]],
                                            p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 50:
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 51:
                                        p[r[++h]] = !0;
                                        break;
                                    case 52:
                                        p[r[++h]] = p[r[++h]] === r[++h];
                                        break;
                                    case 53:
                                        p[r[++h]] = {};
                                        break;
                                    case 54:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                            p[r[++h]] = p[r[++h]] === p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 55:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]]);
                                        break;
                                    case 56:
                                        p[r[++h]] = r[++h];
                                        break;
                                    case 57:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]][r[++h]],
                                            p[r[++h]] = "";
                                        break;
                                    case 58:
                                        p[r[++h]] = Array(r[++h]);
                                        break;
                                    case 59:
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 60:
                                        p[r[++h]] = p[r[++h]] % p[r[++h]];
                                        break;
                                    case 61:
                                        p[r[++h]] = p[r[++h]] < p[r[++h]];
                                        break;
                                    case 62:
                                        p[r[++h]] = -p[r[++h]];
                                        break;
                                    case 63:
                                        p[r[++h]] = p[r[++h]] === p[r[++h]];
                                        break;
                                    case 64:
                                        p[r[++h]] = r[++h],
                                            p[r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 65:
                                        p[r[++h]] = p[r[++h]] > p[r[++h]];
                                        break;
                                    case 66:
                                        p[r[++h]] = p[r[++h]],
                                            h += p[r[++h]] ? r[++h] : r[(++h,
                                                ++h)];
                                        break;
                                    case 67:
                                        p[r[++h]] = !p[r[++h]];
                                        break;
                                    case 68:
                                        p[r[++h]] = p[r[++h]],
                                            p[r[++h]] = p[r[++h]] + r[++h],
                                            p[r[++h]] = ""
                                }
                        } catch (t) {
                            if (g.length > 0 && (e = []),
                                e.push(h),
                            0 === g.length)
                                throw c ? c(t, p, e) : t;
                            h = g.pop(),
                                e.pop()
                        }
                }
            };
            return n ? i : a
        }
    }
)()("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", !1)(6151, [], j, [void 0, null, !0, !1], void 0)();
var N = j.__cgiDecrypt


function encrypt(encryp_data){
existingBuffer = Buffer.from(encryp_data);
arrayBuffer = existingBuffer.buffer.slice(
    existingBuffer.byteOffset,
    existingBuffer.byteOffset + existingBuffer.byteLength
);
return JSON.parse(N(arrayBuffer))}


function get_info(text){

return JSON.parse(N(base64.toByteArray(text)));}




Q音乐.js:


[JavaScript] 纯文本查看 复制代码
window=global


window.crypto=require("crypto")
location={

    "host": "y.qq.com",

}

navigator={'userAgent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"}

params='{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921505341343322","g_tk_new_20200303":814268477,"g_tk":814268477},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"004TEo4m1cwCtf","songID":202553248}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"202553248","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"000Vk6tG2kuHDU"}},"req_4":{"module":"music.vkey.GetEVkey","method":"GetUrl","param":{"guid":"225418138","songmid":["004TEo4m1cwCtf"],"songtype":[0],"uin":"1152921505341343322","loginflag":1,"platform":"20","xcdn":1,"qdesc":"lq96kOgg"}}}'
var G = "undefined" !== typeof e ? e : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : void 0
          , Y = function(e) {
            return e && "undefined" != typeof Symbol && e.constructor === Symbol ? "symbol" : typeof e
        };
        (function() {
            var e = function(e, t, n) {
                for (var r = [], i = 0; i++ < t; )
                    r.push(e += n);
                return r
            }
              , t = function(e) {
                for (var t, n, r = String(e).replace(/[=]+$/, ""), o = r.length, a = 0, u = 0, c = []; u < o; u++)
                    ~(n = i[r.charCodeAt(u)]) && (t = a % 4 ? 64 * t + n : n,
                    a++ % 4) && c.push(255 & t >> (-2 * a & 6));
                return c
            }
              , n = function(e) {
                return e >> 1 ^ -(1 & e)
            }
              , r = []
              , i = e(0, 43, 0).concat([62, 0, 62, 0, 63]).concat(e(51, 10, 1)).concat(e(0, 8, 0)).concat(e(0, 25, 1)).concat([0, 0, 0, 0, 63, 0]).concat(e(25, 26, 1))
              , o = function(e) {
                for (var r = [], i = new Int8Array(t(e)), o = i.length, a = 0; o > a; ) {
                    var u = i[a++]
                      , c = 127 & u;
                    u >= 0 ? r.push(n(c)) : (c |= (127 & (u = i[a++])) << 7,
                    u >= 0 || (c |= (127 & (u = i[a++])) << 14,
                    u >= 0 || (c |= (127 & (u = i[a++])) << 21,
                    u >= 0 || (c |= (u = i[a++]) << 28))),
                    r.push(n(c)))
                }
                return r
            };
            return function(e, t) {
                var n = o(e)
                  , i = function(e, t, o, u, c) {
                    return function s() {
                        for (var l, f, p = [o, u, t, this, arguments, s, n, 0], d = void 0, h = e, g = []; ; )
                            try {
                                for (; ; )
                                    switch (n[++h]) {
                                    case 0:
                                        p[n[++h]] = new p[n[++h]](p[n[++h]]);
                                        break;
                                    case 1:
                                        return p[n[++h]];
                                    case 2:
                                        for (l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = a(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (m) {}
                                        break;
                                    case 3:
                                        p[n[++h]] = p[n[++h]] < p[n[++h]];
                                        break;
                                    case 4:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 5:
                                        p[n[++h]] = p[n[++h]] >= n[++h];
                                        break;
                                    case 6:
                                        p[n[++h]] = p[n[++h]] >> n[++h],
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 7:
                                        p[n[++h]] = p[n[++h]] < n[++h];
                                        break;
                                    case 8:
                                        p[n[++h]] = p[n[++h]].call(d);
                                        break;
                                    case 9:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 10:
                                        p[n[++h]] = p[n[++h]] | n[++h];
                                        break;
                                    case 11:
                                        p[n[++h]] = p[n[++h]] & n[++h],
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 12:
                                        p[n[++h]] = {};
                                        break;
                                    case 13:
                                        p[n[++h]] = p[n[++h]] | p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 14:
                                        p[n[++h]] = d;
                                        break;
                                    case 15:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 16:
                                        p[n[++h]] = !0;
                                        break;
                                    case 17:
                                        p[n[++h]] = p[n[++h]] === p[n[++h]];
                                        break;
                                    case 18:
                                        p[n[++h]] = p[n[++h]] / p[n[++h]];
                                        break;
                                    case 19:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 20:
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 21:
                                        p[n[++h]] = p[n[++h]] * p[n[++h]];
                                        break;
                                    case 22:
                                        p[n[++h]] = ++p[n[++h]],
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 23:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 24:
                                        p[n[++h]] = p[n[++h]] << n[++h];
                                        break;
                                    case 25:
                                        p[n[++h]] = Y(p[n[++h]]);
                                        break;
                                    case 26:
                                        p[n[++h]] = p[n[++h]] | p[n[++h]];
                                        break;
                                    case 27:
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 28:
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 29:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 30:
                                        p[n[++h]] = p[n[++h]].call(d, p[n[++h]], p[n[++h]]);
                                        break;
                                    case 31:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 32:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 33:
                                        p[n[++h]] = p[n[++h]] === n[++h];
                                        break;
                                    case 34:
                                        p[n[++h]] = p[n[++h]] + n[++h];
                                        break;
                                    case 35:
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 36:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 37:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 38:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 39:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]] === p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 40:
                                        p[n[++h]] = p[n[++h]] > p[n[++h]];
                                        break;
                                    case 41:
                                        p[n[++h]] = p[n[++h]] - p[n[++h]];
                                        break;
                                    case 42:
                                        p[n[++h]] = p[n[++h]] << p[n[++h]];
                                        break;
                                    case 43:
                                        p[n[++h]] = p[n[++h]] & p[n[++h]];
                                        break;
                                    case 44:
                                        p[n[++h]] = p[n[++h]] & n[++h];
                                        break;
                                    case 45:
                                        p[n[++h]] = -p[n[++h]];
                                        break;
                                    case 46:
                                        for (l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = i(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (v) {}
                                        break;
                                    case 47:
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 48:
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 49:
                                        p[n[++h]] = ~p[n[++h]];
                                        break;
                                    case 50:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]]);
                                        break;
                                    case 51:
                                        p[n[++h]] = p[n[++h]] ^ p[n[++h]];
                                        break;
                                    case 52:
                                        p[n[++h]] = ++p[n[++h]];
                                        break;
                                    case 53:
                                        p[n[++h]] = !1;
                                        break;
                                    case 54:
                                        p[n[++h]] = p[n[++h]] >>> n[++h];
                                        break;
                                    case 55:
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 56:
                                        p[n[++h]] = Array(n[++h]);
                                        break;
                                    case 57:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 58:
                                        p[n[++h]] = p[n[++h]] % p[n[++h]];
                                        break;
                                    case 59:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 60:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 61:
                                        p[n[++h]] = p[n[++h]] - n[++h];
                                        break;
                                    case 62:
                                        p[n[++h]] = p[n[++h]] + p[n[++h]];
                                        break;
                                    case 63:
                                        p[n[++h]] = !p[n[++h]];
                                        break;
                                    case 64:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 65:
                                        for (p[n[++h]] += String.fromCharCode(n[++h]),
                                        l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = i(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (A) {}
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 66:
                                        p[n[++h]] = p[n[++h]] - 0;
                                        break;
                                    case 67:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]], p[n[++h]]);
                                        break;
                                    case 68:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]],
                                        p[n[++h]] = p[n[++h]] - 0;
                                        break;
                                    case 69:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]] + p[n[++h]];
                                        break;
                                    case 70:
                                        p[n[++h]] = n[++h] + p[n[++h]];
                                        break;
                                    case 71:
                                        p[n[++h]] = p[n[++h]] << p[n[++h]],
                                        p[n[++h]] = p[n[++h]] | p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 72:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]], p[n[++h]], p[n[++h]]);
                                        break;
                                    case 73:
                                        p[n[++h]] = p[n[++h]] >> n[++h];
                                        break;
                                    case 74:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 75:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 76:
                                        p[n[++h]] = p[n[++h]].call(d, p[n[++h]]);
                                        break;
                                    case 77:
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 78:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 79:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]] >> n[++h],
                                        p[n[++h]] = p[n[++h]] & n[++h];
                                        break;
                                    case 80:
                                        p[n[++h]] = "";
                                        break;
                                    case 81:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 82:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)]
                                    }
                            } catch (y) {
                                if (g.length > 0 && (r = []),
                                r.push(h),
                                0 === g.length)
                                    throw c ? c(y, p, r) : y;
                                h = g.pop(),
                                r.pop()
                            }
                    }
                }
                  , a = function(e, t, o, u, c) {
                    return function s() {
                        for (var l, f, p = [o, u, t, this, arguments, s, n, 0], d = void 0, h = e, g = []; ; )
                            try {
                                for (; ; )
                                    switch (n[++h]) {
                                    case 0:
                                        p[n[++h]] = new p[n[++h]](p[n[++h]]);
                                        break;
                                    case 1:
                                        return p[n[++h]];
                                    case 2:
                                        for (l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = a(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (m) {}
                                        break;
                                    case 3:
                                        p[n[++h]] = p[n[++h]] < p[n[++h]];
                                        break;
                                    case 4:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 5:
                                        p[n[++h]] = p[n[++h]] >= n[++h];
                                        break;
                                    case 6:
                                        p[n[++h]] = p[n[++h]] >> n[++h],
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 7:
                                        p[n[++h]] = p[n[++h]] < n[++h];
                                        break;
                                    case 8:
                                        p[n[++h]] = p[n[++h]].call(d);
                                        break;
                                    case 9:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 10:
                                        p[n[++h]] = p[n[++h]] | n[++h];
                                        break;
                                    case 11:
                                        p[n[++h]] = p[n[++h]] & n[++h],
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 12:
                                        p[n[++h]] = {};
                                        break;
                                    case 13:
                                        p[n[++h]] = p[n[++h]] | p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 14:
                                        p[n[++h]] = d;
                                        break;
                                    case 15:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 16:
                                        p[n[++h]] = !0;
                                        break;
                                    case 17:
                                        p[n[++h]] = p[n[++h]] === p[n[++h]];
                                        break;
                                    case 18:
                                        p[n[++h]] = p[n[++h]] / p[n[++h]];
                                        break;
                                    case 19:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 20:
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 21:
                                        p[n[++h]] = p[n[++h]] * p[n[++h]];
                                        break;
                                    case 22:
                                        p[n[++h]] = ++p[n[++h]],
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 23:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 24:
                                        p[n[++h]] = p[n[++h]] << n[++h];
                                        break;
                                    case 25:
                                        p[n[++h]] = Y(p[n[++h]]);
                                        break;
                                    case 26:
                                        p[n[++h]] = p[n[++h]] | p[n[++h]];
                                        break;
                                    case 27:
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 28:
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 29:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 30:
                                        p[n[++h]] = p[n[++h]].call(d, p[n[++h]], p[n[++h]]);
                                        break;
                                    case 31:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = n[++h],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 32:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 33:
                                        p[n[++h]] = p[n[++h]] === n[++h];
                                        break;
                                    case 34:
                                        p[n[++h]] = p[n[++h]] + n[++h];
                                        break;
                                    case 35:
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 36:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 37:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 38:
                                        p[n[++h]] = "",
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 39:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]] === p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 40:
                                        p[n[++h]] = p[n[++h]] > p[n[++h]];
                                        break;
                                    case 41:
                                        p[n[++h]] = p[n[++h]] - p[n[++h]];
                                        break;
                                    case 42:
                                        p[n[++h]] = p[n[++h]] << p[n[++h]];
                                        break;
                                    case 43:
                                        p[n[++h]] = p[n[++h]] & p[n[++h]];
                                        break;
                                    case 44:
                                        p[n[++h]] = p[n[++h]] & n[++h];
                                        break;
                                    case 45:
                                        p[n[++h]] = -p[n[++h]];
                                        break;
                                    case 46:
                                        for (l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = i(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (v) {}
                                        break;
                                    case 47:
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 48:
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 49:
                                        p[n[++h]] = ~p[n[++h]];
                                        break;
                                    case 50:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]]);
                                        break;
                                    case 51:
                                        p[n[++h]] = p[n[++h]] ^ p[n[++h]];
                                        break;
                                    case 52:
                                        p[n[++h]] = ++p[n[++h]];
                                        break;
                                    case 53:
                                        p[n[++h]] = !1;
                                        break;
                                    case 54:
                                        p[n[++h]] = p[n[++h]] >>> n[++h];
                                        break;
                                    case 55:
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 56:
                                        p[n[++h]] = Array(n[++h]);
                                        break;
                                    case 57:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]][n[++h]] = p[n[++h]];
                                        break;
                                    case 58:
                                        p[n[++h]] = p[n[++h]] % p[n[++h]];
                                        break;
                                    case 59:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]][n[++h]];
                                        break;
                                    case 60:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = n[++h];
                                        break;
                                    case 61:
                                        p[n[++h]] = p[n[++h]] - n[++h];
                                        break;
                                    case 62:
                                        p[n[++h]] = p[n[++h]] + p[n[++h]];
                                        break;
                                    case 63:
                                        p[n[++h]] = !p[n[++h]];
                                        break;
                                    case 64:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 65:
                                        for (p[n[++h]] += String.fromCharCode(n[++h]),
                                        l = [],
                                        f = n[++h]; f > 0; f--)
                                            l.push(p[n[++h]]);
                                        p[n[++h]] = i(h + n[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[n[h - 1]], "length", {
                                                value: n[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (A) {}
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 66:
                                        p[n[++h]] = p[n[++h]] - 0;
                                        break;
                                    case 67:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]], p[n[++h]]);
                                        break;
                                    case 68:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]],
                                        p[n[++h]] = p[n[++h]] - 0;
                                        break;
                                    case 69:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        p[n[++h]] = p[n[++h]] + p[n[++h]];
                                        break;
                                    case 70:
                                        p[n[++h]] = n[++h] + p[n[++h]];
                                        break;
                                    case 71:
                                        p[n[++h]] = p[n[++h]] << p[n[++h]],
                                        p[n[++h]] = p[n[++h]] | p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 72:
                                        p[n[++h]] = p[n[++h]].call(p[n[++h]], p[n[++h]], p[n[++h]]);
                                        break;
                                    case 73:
                                        p[n[++h]] = p[n[++h]] >> n[++h];
                                        break;
                                    case 74:
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]],
                                        p[n[++h]][p[n[++h]]] = p[n[++h]];
                                        break;
                                    case 75:
                                        p[n[++h]] = n[++h],
                                        p[n[++h]][n[++h]] = p[n[++h]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)];
                                        break;
                                    case 76:
                                        p[n[++h]] = p[n[++h]].call(d, p[n[++h]]);
                                        break;
                                    case 77:
                                        p[n[++h]] = p[n[++h]];
                                        break;
                                    case 78:
                                        p[n[++h]] = p[n[++h]][p[n[++h]]];
                                        break;
                                    case 79:
                                        p[n[++h]] = p[n[++h]][n[++h]],
                                        p[n[++h]] = p[n[++h]] >> n[++h],
                                        p[n[++h]] = p[n[++h]] & n[++h];
                                        break;
                                    case 80:
                                        p[n[++h]] = "";
                                        break;
                                    case 81:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] += String.fromCharCode(n[++h]);
                                        break;
                                    case 82:
                                        p[n[++h]] += String.fromCharCode(n[++h]),
                                        p[n[++h]] = p[n[++h]][p[n[++h]]],
                                        h += p[n[++h]] ? n[++h] : n[(++h,
                                        ++h)]
                                    }
                            } catch (y) {
                                if (g.length > 0 && (r = []),
                                r.push(h),
                                0 === g.length)
                                    throw c ? c(y, p, r) : y;
                                h = g.pop(),
                                r.pop()
                            }
                    }
                };
                return t ? i : a
            }
        }
        )()("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", !1)(3944, [], G, [void 0, 1732584193, 4023233417, 2562383102, 3285377520, !1, !0, 2147483648, 4294967295, 4294967296, 1518500249, 1859775393, 1894007588], void 0)();
        var P = G._getSecuritySign;

 var j = "undefined" !== typeof e ? e : "undefined" !== typeof window ? window : "undefined" !== typeof self ? self : void 0;
        (function() {
            var e = [];
            function t(e, t, n) {
                for (var r = [], i = 0; i++ < t; )
                    r.push(e += n);
                return r
            }
            var n = t(0, 43, 0).concat([62, 0, 62, 0, 63]).concat(t(51, 10, 1)).concat(t(0, 8, 0)).concat(t(0, 25, 1)).concat([0, 0, 0, 0, 63, 0]).concat(t(25, 26, 1));
            function r(e) {
                for (var t, r, i = String(e).replace(/[=]+$/, ""), o = i.length, a = 0, u = 0, c = []; u < o; u++)
                    ~(r = n[i.charCodeAt(u)]) && (t = a % 4 ? 64 * t + r : r,
                    a++ % 4) && c.push(255 & t >> (-2 * a & 6));
                return c
            }
            function i(e) {
                return e >> 1 ^ -(1 & e)
            }
            var o = function(e) {
                for (var t = [], n = "undefined" != typeof Int8Array ? new Int8Array(r(e)) : r(e), o = n.length, a = 0; o > a; ) {
                    var u = n[a++]
                      , c = 127 & u;
                    u >= 0 ? t.push(i(c)) : (c |= (127 & (u = n[a++])) << 7,
                    u >= 0 || (c |= (127 & (u = n[a++])) << 14,
                    u >= 0 || (c |= (127 & (u = n[a++])) << 21,
                    u >= 0 || (c |= (u = n[a++]) << 28))),
                    t.push(i(c)))
                }
                return t
            };
            return function(t, n) {
                var r = o(t)
                  , i = function(t, n, o, u, c) {
                    return function s() {
                        for (var l, f, p = [o, u, n, this, arguments, s, r, 0], d = void 0, h = t, g = []; ; )
                            try {
                                for (; ; )
                                    switch (r[++h]) {
                                    case 0:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 1:
                                        p[r[++h]] = !1;
                                        break;
                                    case 2:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 3:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 4:
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 5:
                                        p[r[++h]] = p[r[++h]] | p[r[++h]];
                                        break;
                                    case 6:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        break;
                                    case 7:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 8:
                                        p[r[++h]] = p[r[++h]] - 0;
                                        break;
                                    case 9:
                                        p[r[++h]] = p[r[++h]] ^ p[r[++h]];
                                        break;
                                    case 10:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        p[r[++h]] = r[++h],
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 11:
                                        p[r[++h]] = new p[r[++h]];
                                        break;
                                    case 12:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 13:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = a(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        break;
                                    case 14:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = Array(r[++h]),
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 15:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 16:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]]);
                                        break;
                                    case 17:
                                        return p[r[++h]];
                                    case 18:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 19:
                                        p[r[++h]] = p[r[++h]] + p[r[++h]],
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 20:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 21:
                                        p[r[++h]] = p[r[++h]] + r[++h];
                                        break;
                                    case 22:
                                        p[r[++h]] = new p[r[++h]](p[r[++h]]);
                                        break;
                                    case 23:
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 24:
                                        p[r[++h]][p[r[++h]]] = p[r[++h]];
                                        break;
                                    case 25:
                                        p[r[++h]] = "",
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 26:
                                        p[r[++h]] = ++p[r[++h]];
                                        break;
                                    case 27:
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 28:
                                        p[r[++h]] = "";
                                        break;
                                    case 29:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = p[r[++h]].apply(p[r[++h]], l);
                                        break;
                                    case 30:
                                        p[r[++h]] = p[r[++h]].call(d);
                                        break;
                                    case 31:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]] >> r[++h],
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 32:
                                        p[r[++h]] = typeof p[r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 33:
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 34:
                                        p[r[++h]] = null;
                                        break;
                                    case 35:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 36:
                                        p[r[++h]] = d;
                                        break;
                                    case 37:
                                        for (p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 38:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 39:
                                        p[r[++h]] = r[++h],
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 40:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 41:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]], p[r[++h]]);
                                        break;
                                    case 42:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = typeof p[r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 43:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = r[++h],
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 44:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 45:
                                        p[r[++h]] = p[r[++h]] << r[++h];
                                        break;
                                    case 46:
                                        return p[r[++h]] = d,
                                        p[r[++h]];
                                    case 47:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] < p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 48:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 49:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 50:
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 51:
                                        p[r[++h]] = !0;
                                        break;
                                    case 52:
                                        p[r[++h]] = p[r[++h]] === r[++h];
                                        break;
                                    case 53:
                                        p[r[++h]] = {};
                                        break;
                                    case 54:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]] === p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 55:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]]);
                                        break;
                                    case 56:
                                        p[r[++h]] = r[++h];
                                        break;
                                    case 57:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 58:
                                        p[r[++h]] = Array(r[++h]);
                                        break;
                                    case 59:
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 60:
                                        p[r[++h]] = p[r[++h]] % p[r[++h]];
                                        break;
                                    case 61:
                                        p[r[++h]] = p[r[++h]] < p[r[++h]];
                                        break;
                                    case 62:
                                        p[r[++h]] = -p[r[++h]];
                                        break;
                                    case 63:
                                        p[r[++h]] = p[r[++h]] === p[r[++h]];
                                        break;
                                    case 64:
                                        p[r[++h]] = r[++h],
                                        p[r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 65:
                                        p[r[++h]] = p[r[++h]] > p[r[++h]];
                                        break;
                                    case 66:
                                        p[r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 67:
                                        p[r[++h]] = !p[r[++h]];
                                        break;
                                    case 68:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]] + r[++h],
                                        p[r[++h]] = ""
                                    }
                            } catch (t) {
                                if (g.length > 0 && (e = []),
                                e.push(h),
                                0 === g.length)
                                    throw c ? c(t, p, e) : t;
                                h = g.pop(),
                                e.pop()
                            }
                    }
                }
                  , a = function(t, n, o, u, c) {
                    return function s() {
                        for (var l, f, p = [o, u, n, this, arguments, s, r, 0], d = void 0, h = t, g = []; ; )
                            try {
                                for (; ; )
                                    switch (r[++h]) {
                                    case 0:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 1:
                                        p[r[++h]] = !1;
                                        break;
                                    case 2:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 3:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 4:
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 5:
                                        p[r[++h]] = p[r[++h]] | p[r[++h]];
                                        break;
                                    case 6:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        break;
                                    case 7:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 8:
                                        p[r[++h]] = p[r[++h]] - 0;
                                        break;
                                    case 9:
                                        p[r[++h]] = p[r[++h]] ^ p[r[++h]];
                                        break;
                                    case 10:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        p[r[++h]] = r[++h],
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 11:
                                        p[r[++h]] = new p[r[++h]];
                                        break;
                                    case 12:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 13:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = a(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        break;
                                    case 14:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = Array(r[++h]),
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 15:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 16:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]]);
                                        break;
                                    case 17:
                                        return p[r[++h]];
                                    case 18:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 19:
                                        p[r[++h]] = p[r[++h]] + p[r[++h]],
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 20:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 21:
                                        p[r[++h]] = p[r[++h]] + r[++h];
                                        break;
                                    case 22:
                                        p[r[++h]] = new p[r[++h]](p[r[++h]]);
                                        break;
                                    case 23:
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 24:
                                        p[r[++h]][p[r[++h]]] = p[r[++h]];
                                        break;
                                    case 25:
                                        p[r[++h]] = "",
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 26:
                                        p[r[++h]] = ++p[r[++h]];
                                        break;
                                    case 27:
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 28:
                                        p[r[++h]] = "";
                                        break;
                                    case 29:
                                        for (l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = p[r[++h]].apply(p[r[++h]], l);
                                        break;
                                    case 30:
                                        p[r[++h]] = p[r[++h]].call(d);
                                        break;
                                    case 31:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]] >> r[++h],
                                        p[r[++h]] = p[r[++h]] & r[++h];
                                        break;
                                    case 32:
                                        p[r[++h]] = typeof p[r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 33:
                                        p[r[++h]] = p[r[++h]];
                                        break;
                                    case 34:
                                        p[r[++h]] = null;
                                        break;
                                    case 35:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 36:
                                        p[r[++h]] = d;
                                        break;
                                    case 37:
                                        for (p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        l = [],
                                        f = r[++h]; f > 0; f--)
                                            l.push(p[r[++h]]);
                                        p[r[++h]] = i(h + r[++h], l, o, u, c);
                                        try {
                                            Object.defineProperty(p[r[h - 1]], "length", {
                                                value: r[++h],
                                                configurable: !0,
                                                writable: !1,
                                                enumerable: !1
                                            })
                                        } catch (e) {}
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
                                        break;
                                    case 38:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 39:
                                        p[r[++h]] = r[++h],
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 40:
                                        p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]], p[r[++h]], p[r[++h]]);
                                        break;
                                    case 41:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]], p[r[++h]]);
                                        break;
                                    case 42:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = typeof p[r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 43:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = r[++h],
                                        p[r[++h]] += String.fromCharCode(r[++h]);
                                        break;
                                    case 44:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]][p[r[++h]]];
                                        break;
                                    case 45:
                                        p[r[++h]] = p[r[++h]] << r[++h];
                                        break;
                                    case 46:
                                        return p[r[++h]] = d,
                                        p[r[++h]];
                                    case 47:
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] < p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 48:
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 49:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]][p[r[++h]]],
                                        p[r[++h]] = p[r[++h]] + p[r[++h]];
                                        break;
                                    case 50:
                                        p[r[++h]][r[++h]] = p[r[++h]];
                                        break;
                                    case 51:
                                        p[r[++h]] = !0;
                                        break;
                                    case 52:
                                        p[r[++h]] = p[r[++h]] === r[++h];
                                        break;
                                    case 53:
                                        p[r[++h]] = {};
                                        break;
                                    case 54:
                                        p[r[++h]] += String.fromCharCode(r[++h]),
                                        p[r[++h]] = p[r[++h]] === p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 55:
                                        p[r[++h]] = p[r[++h]].call(d, p[r[++h]]);
                                        break;
                                    case 56:
                                        p[r[++h]] = r[++h];
                                        break;
                                    case 57:
                                        p[r[++h]][r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]][r[++h]],
                                        p[r[++h]] = "";
                                        break;
                                    case 58:
                                        p[r[++h]] = Array(r[++h]);
                                        break;
                                    case 59:
                                        p[r[++h]] = p[r[++h]][r[++h]];
                                        break;
                                    case 60:
                                        p[r[++h]] = p[r[++h]] % p[r[++h]];
                                        break;
                                    case 61:
                                        p[r[++h]] = p[r[++h]] < p[r[++h]];
                                        break;
                                    case 62:
                                        p[r[++h]] = -p[r[++h]];
                                        break;
                                    case 63:
                                        p[r[++h]] = p[r[++h]] === p[r[++h]];
                                        break;
                                    case 64:
                                        p[r[++h]] = r[++h],
                                        p[r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 65:
                                        p[r[++h]] = p[r[++h]] > p[r[++h]];
                                        break;
                                    case 66:
                                        p[r[++h]] = p[r[++h]],
                                        h += p[r[++h]] ? r[++h] : r[(++h,
                                        ++h)];
                                        break;
                                    case 67:
                                        p[r[++h]] = !p[r[++h]];
                                        break;
                                    case 68:
                                        p[r[++h]] = p[r[++h]],
                                        p[r[++h]] = p[r[++h]] + r[++h],
                                        p[r[++h]] = ""
                                    }
                            } catch (t) {
                                if (g.length > 0 && (e = []),
                                e.push(h),
                                0 === g.length)
                                    throw c ? c(t, p, e) : t;
                                h = g.pop(),
                                e.pop()
                            }
                    }
                };
                return n ? i : a
            }
        }
        )()("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", !1)(6151, [], j, [void 0, null, !0, !1], void 0)();
        var L = j.__cgiEncrypt


axx=process.argv[2]
// axx='{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":2509034534,"g_tk_new_20200303":264421996,"g_tk":264421996},"req_1":{"method":"DoSearchForQQMusicDesktop","module":"music.search.SearchCgiService","param":{"remoteplace":"txt.yqq.top","searchid":"57356518041915261","search_type":0,"query":"许嵩","page_num":1,"num_per_page":10}}}'
console.log(P(axx))

L(axx).then(res => {console.log(res)})

// console.log(P(params))
// L(params).then(res => {console.log(res)})



Python代码:


[Python] 纯文本查看 复制代码
import subprocess
import json
import execjs
from functools import  partial
import os
import requests
import base64
import time

from pprint import pprint
from prettytable import PrettyTable

os_path= os.getcwd() + '/QQ音乐歌曲/'
if not os.path.exists(os_path):
    os.mkdir(os_path)

subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")


headers = {
    "accept": "application/octet-stream",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "cache-control": "no-cache",
    "content-type": "text/plain",
    "origin": "https://y.qq.com",
    "pragma": "no-cache",
    "priority": "u=1, i",
    "referer": "https://y.qq.com/",
    "sec-ch-ua": "\"Microsoft Edge\";v=\"143\", \"Chromium\";v=\"143\", \"Not A(Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"
}
cookies = {
    "ts_uid": "885560536",
    "RK": "BOnZhaf75v",
    "ptcz": "504c023335c8bddd3c2a9b1afb43584bb8b2380b558ae34a8974c5ba8c4c87cc",
    "pgv_pvid": "781480164",
    "yyb_muid": "2EF66898AFD462E120A47B58AEFA63AC",
    "fqm_pvqid": "235cd264-b12b-4977-a9fb-256434e665ac",
    "fqm_sessionid": "da6ea88c-9aa6-46a9-a2f9-f21eb98e845d",
    "pgv_info": "ssid=s8015072296",
    "_qpsvr_localtk": "0.15622241581133678",
    "login_type": "2",
    "music_ignore_pskey": "202306271436Hn@vBj",
    "ts_refer": "i.y.qq.com/",
    "qqmusic_key": "W_X_63B0ataXp5fBXoD_L_6Bc67Bv4swfAXauZmHy5s3lKKovvPL8Usl0cYJcZHTJ3VAe-uZ0tg_bqgjHJ2sUKl_zFs7yvvqBkw",
    "tmeLoginType": "1",
    "wxunionid": "oqFLxstqDWJrzmvDXtoNyeziQ-Cg",
    "qm_keyst": "W_X_63B0ataXp5fBXoD_L_6Bc67Bv4swfAXauZmHy5s3lKKovvPL8Usl0cYJcZHTJ3VAe-uZ0tg_bqgjHJ2sUKl_zFs7yvvqBkw",
    "psrf_qqrefresh_token": "",
    "psrf_qqopenid": "",
    "wxuin": "1152921505341343322",
    "euin": "oK6kowEAoK4z7KoPoKoPoioAoc**",
    "psrf_qqunionid": "",
    "wxopenid": "opCFJw1cF6gdt60nT66JAN_22bgI",
    "wxrefresh_token": "99_HJzShyRDu4JZqjz-gBmv1gW8OtWBSEKM3cHAw3RI3tiRKGTlWzcJtropNRv3tMZMpC5oE5ROgq-hy11R6kxhK0xAOovWx0dH9V9cAv-ASXI",
    "psrf_qqaccess_token": "",
    "ts_last": "y.qq.com/n/ryqq_v2/search"
}


def getsign(form):
    form = json.dumps(form)
    cmd = ["node", "./Q音乐.js", form]
    text = subprocess.check_output(cmd).strip()
    sign = text.split('\n')[0]
    key = text.split('\n')[1]
    return sign ,key



def search(keyword,pagenum):
    form = {"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921505341343322","g_tk_new_20200303":814268477,"g_tk":814268477},"req_1":{"method":"DoSearchForQQMusicDesktop","module":"music.search.SearchCgiService","param":{"remoteplace":"txt.yqq.center","searchid":"70113558754813304","search_type":0,"query":keyword,"page_num":pagenum,"num_per_page":10}}}
    sign,key=getsign(form)
    params = {
        "_": "int(time.time() * 1000)",
        "encoding": "ag-1",
        "sign": sign
    }
    url = "https://u6.y.qq.com/cgi-bin/musics.fcg"
    response = requests.post(url, headers=headers, cookies=cookies, params=params, data=key)
    content = list(response.content)
    with open('jiemi.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    ctx = execjs.compile(js_code)
    result = ctx.call('encrypt', content)
    song_list=result['req_1']['data']['body']['song']['list']
    tb=PrettyTable()
    num=0
    tb.field_names = ["歌曲编号", "歌曲名称", "歌手名称"]
    info=[]
    for index in song_list[1:]:
        songMID=index['mid']
        songID=index['id']
        albumMid=index['album']['mid']
        title=index['title']
        name=index['singer'][0]['name']
        dit={"songMID":songMID,"songID":songID,"albumMid":albumMid,"title":title,"name":name}
        info.append(dit)
        tb.add_row([num,title,name])
        num+=1
    print(tb)
    return info


def get_audio(songMID,songID,albumMid):
    audio_data={"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921505341343322","g_tk_new_20200303":814268477,"g_tk":814268477},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":songMID,"songID":songID}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":f"{songID}","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":albumMid}},"req_4":{"module":"music.vkey.GetEVkey","method":"GetUrl","param":{"guid":"225418138","songmid":[songMID],"songtype":[0],"uin":"1152921505341343322","loginflag":1,"platform":"20","xcdn":1,"qdesc":"lq96kOgg"}}}
    linksign,linkkey=getsign(audio_data)
    link="https://u6.y.qq.com/cgi-bin/musics.fcg"
    link_params = {
        "_": "int(time.time() * 1000)",
        "encoding": "ag-1",
        "sign": linksign
    }
    response = requests.post(link, headers=headers, cookies=cookies, params=link_params, data=linkkey)
    content = list(response.content)
    with open('jiemi.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    ctx = execjs.compile(js_code)
    result = ctx.call('encrypt', content)
    # print( result)
    audio_url=result['req_4']['data']['midurlinfo'][0]['xcdnurl']
    print(audio_url)
    return audio_url



def sanitize_filename(filename):
    # 替换Windows不支持的字符
    illegal_chars = ['<', '>', ':', '"', '/', '\\', '|', '?', '*']
    for char in illegal_chars:
        filename = filename.replace(char, '_')
    return filename.strip()


def save_song( url, name,title):
    safe_name = sanitize_filename(name)
    safe_title = sanitize_filename(title)
    data = requests.get(url, headers=headers).content
    with open(os_path +  safe_name + '--'+ safe_title  + '.mp3', 'wb') as f:
        f.write(data)
    print(f"歌曲 :{safe_name} -{ safe_title } - - 下载完成")

def main():
    keyword = input("请输入你要搜索的内容( 00退出 ):")
    pagenum = input("请输入你要搜索的页数:")
    page = 1
    choose = input('批量( Y ) or 单个( N ) :')
    while True:
        info = search(keyword, page)
        if choose == 'Y' or choose == 'y' :
            for index in info:
                audio_url = get_audio(index['songMID'], index['songID'], index['albumMid'])
                name = index['name']
                title = index['title']
                print(f"歌曲 :{name} -{title} - - 开始下载")
                save_song(audio_url, name, title)

        if choose == 'N' or choose == 'n':
            if page == int(pagenum):
                num = int(input("请输入歌曲编号:"))
                audio_url = get_audio(info[num]['songMID'], info[num]['songID'], info[num]['albumMid'])
                name = info[num]['name']
                title = info[num]['title']
                print(f"歌曲 :{name} -{title} - - 开始下载")
                save_song(audio_url, name, title)
        page += 1
        if page > int(pagenum):
            break

# def main():
#     keyword = input("请输入你要搜索的内容( 00退出 ):")
#     pagenum = input("请输入你要搜索的页数:")
#     page = 1
#     while True:
#         info = search(keyword, page)
#         choose = input('批量( Y ) or 单个( N ) :')
#         if choose == 'Y' or choose == 'y' :
#             for index in info:
#                 audio_url = get_audio(index['songMID'], index['songID'], index['albumMid'])
#                 name = index['name']
#                 title = index['title']
#                 print(f"歌曲 :{name} -{title} - - 开始下载")
#                 save_song(audio_url, name, title)
#
#         if choose == 'N' or choose == 'n':
#             num = int(input("请输入歌曲编号:"))
#             audio_url = get_audio(info[num]['songMID'], info[num]['songID'], info[num]['albumMid'])
#             name = info[num]['name']
#             title = info[num]['title']
#             print(f"歌曲 :{name} -{title} - - 开始下载")
#             save_song(audio_url, name, title)
#         page += 1
#         if page > int(pagenum):
#             break



if __name__ == '__main__':
    main()





QQ音乐.zip

33.02 KB, 下载次数: 1283, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 72吾爱币 +64 热心值 +66 收起 理由
degas8888 + 1 + 1 热心回复!
zp999 + 1 + 1 谢谢@Thanks!
aagwai + 1 + 1 谢谢@Thanks!
美美木耶 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
街角转身 + 1 + 1 谢谢@Thanks!
lcylcylcy + 1 + 1 谢谢@Thanks!
cruz + 1 + 1 我很赞同!
purpleblue + 1 + 1 我很赞同!
qingne0130 + 1 + 1 热心回复!
theStyx + 1 + 1 谢谢@Thanks!
dafu + 1 + 1 热心回复!
yx69 + 1 + 1 我很赞同!
BINBINMANA + 1 + 1 谢谢@Thanks!
XYZZ987 + 1 + 1 我很赞同!
YK4237 + 1 我很赞同!
william0712 + 1 + 1 用心讨论,共获提升!
seven2024 + 1 谢谢@Thanks!
YYL7535 + 1 + 1 谢谢@Thanks!
gi204657 + 1 谢谢@Thanks!
qwertlinxiao137 + 1 谢谢@Thanks!
大衬衫 + 1 + 1 热心回复!
lanyun86 + 1 + 1 谢谢@Thanks!
tymydol + 1 + 1 鼓励转贴优秀软件安全工具和文档!
Kevencaz + 1 + 1 谢谢@Thanks!
hpoutnow + 1 + 1 谢谢@Thanks!
风若在 + 1 + 1 谢谢@Thanks!
yybaoyymmm + 1 + 1 谢谢@Thanks!
tvrcfdfe + 1 + 1 我很赞同!
study_bin + 1 + 1 谢谢@Thanks!
xiaolupaopao + 1 + 1 谢谢@Thanks!
QElite + 1 谢谢@Thanks!
paltan + 1 热心回复!
盼星星 + 1 + 1 谢谢@Thanks!
xingshizhuyi + 1 + 1 我很赞同!
barbison + 1 + 1 我很赞同!
fessicon + 1 + 1 我很赞同!
aabbcc123123 + 1 + 1 谢谢@Thanks!
lyxhs + 1 + 1 谢谢@Thanks!
rlaals0212 + 1 + 1 谢谢@Thanks!
chenggh438 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
清风弄月imge + 1 + 1 谢谢@Thanks!
s3nake + 1 + 1 我很赞同!
sw7057 + 1 + 1 我很赞同!
renzhen1997 + 1 + 1 我很赞同!
xoo52zh + 1 + 1 谢谢@Thanks!
瘦闹闹 + 1 + 1 谢谢@Thanks!
Itsnotme + 1 + 1 我很赞同!
Indra + 1 谢谢@Thanks!
xiaoka999 + 1 + 1 我很赞同!
0504yck + 1 热心回复!
taoqig + 1 + 1 谢谢@Thanks!
cick + 1 + 1 已食用真香,这个要是在建立个文件夹就更好了。建立个歌手的文件夹
xxutno + 1 + 1 感谢无私奉献
creazycar + 1 + 1 谢谢@Thanks!
RIKKIA + 1 + 1 我很赞同!
xlwllm + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
imfly + 1 + 1 我很赞同!
weidechan + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
rengui + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xtayspwk + 1 + 1 谢谢@Thanks!
carlshi + 1 + 1 谢谢@Thanks!
tomanpj + 1 + 1 谢谢@Thanks!
无尘浪子 + 1 谢谢@Thanks!
5210LYX + 1 + 1 我很赞同!
2022313 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
q1009 + 1 + 1 谢谢@Thanks!
fengzw + 1 用心讨论,共获提升!
white3zz + 1 + 1 谢谢@Thanks!
秋风之兮 + 1 + 1 谢谢@Thanks!
璃曦 + 1 + 1 热心回复!
haiyangnanzi + 1 + 1 谢谢@Thanks!
laotzudao0 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhu791023529 发表于 2026-1-2 22:40
小白问一下,怎么使用
cick 发表于 2026-1-5 13:16
13955925361 发表于 2026-1-5 12:11
对的,python代码找下有个cookies={一长串},改成自己的就好了,我回复里有截图,
等我今天回家把主贴也 ...

v1.0 在21页中 202楼
来来来,V1.1改版了点结合打家都说cookies的问题

v1.0 在21页中自己爬楼202楼

V1.1 增加  cookies点击文本框区域自动粘帖,需要打家去浏览器中F12点击network然后刷新下页面,找到第一个站点,然后点击下,在右侧的头问件中headers中往下找下cookies 双击复制下,然后打开软件,点击文本框区域替换为自己的即可。

增加 无效代码时间展示和农历展示,其余功能参照 202楼21页中功能。最后再次感谢楼主的奉献。

以上代码AI修改纯属交流学习。有兴趣的可以改写pyqt5或者pyqt6模块化写法tk不好用。界面太low。

import subprocess
import json
import execjs
from functools import partial
import os
import requests
import base64
import time
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
from threading import Thread
from datetime import datetime
import calendar

from pprint import pprint
from prettytable import PrettyTable

os_path = os.getcwd() + '/QQ音乐歌曲/'
if not os.path.exists(os_path):
    os.mkdir(os_path)

subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

headers = {
    "accept": "application/octet-stream",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "cache-control": "no-cache",
    "content-type": "text/plain",
    "origin": "https://y.qq.com",
    "pragma": "no-cache",
    "priority": "u=1, i",
    "referer": "https://y.qq.com/",
    "sec-ch-ua": "\"Microsoft Edge\";v=\"143\", \"Chromium\";v=\"143\", \"Not A(Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0"
}

def get_lunar_date():
    """简单的农历计算函数"""
    # 这里使用一个简化的农历计算方法
    # 实际应用中可以使用更精确的农历库如lunarcalendar
    current_date = datetime.now()

    # 农历月份和日期的简化计算(仅作为示例)
    # 这里使用一个近似算法,实际农历计算更复杂
    lunar_info = [
        0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
        0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
        0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
        0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
        0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557
    ]

    lunar_months = ["正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊"]
    lunar_days = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
                  "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
                  "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"]

    # 简化的农历计算,仅作为示例
    year = current_date.year
    month = current_date.month
    day = current_date.day

    # 这里使用一个简单的映射,实际农历计算更复杂
    # 为了演示,我们使用一个简化的方法
    offset = (year - 2000) % 50
    lunar_month = lunar_months[(month + offset) % 12]
    lunar_day = lunar_days[(day + offset) % 30]

    # 判断是否为闰月(简化处理)
    is_leap = (offset % 3 == 0) and (month > 6)
    leap_str = "闰" if is_leap else ""

    return f"农历{leap_str}{lunar_month}月{lunar_day}"

def getsign(form):
    form = json.dumps(form)
    cmd = ["node", "js/Q音乐.js", form]
    text = subprocess.check_output(cmd).strip()
    sign = text.split('\n')[0]
    key = text.split('\n')[1]
    return sign, key

def search(keyword, pagenum=1, use_cookies=None):
    # 使用传入的cookies,默认为空字典
    cookies_to_use = use_cookies if use_cookies is not None else {}

    form = {
        "comm": {"cv": 4747474, "ct": 24, "format": "json", "inCharset": "utf-8", "outCharset": "utf-8", "notice": 0,
                 "platform": "yqq.json", "needNewCode": 1, "uin": "1152921505341343322", "g_tk_new_20200303": 814268477,
                 "g_tk": 814268477},
        "req_1": {"method": "DoSearchForQQMusicDesktop", "module": "music.search.SearchCgiService",
                  "param": {"remoteplace": "txt.yqq.center", "search_type": 0,
                            "query": keyword, "page_num": pagenum, "num_per_page": 10}}}
    sign, key = getsign(form)
    params = {
        "_": str(int(time.time() * 1000)),
        "encoding": "ag-1",
        "sign": sign
    }
    url = "https://u6.y.qq.com/cgi-bin/musics.fcg"
    response = requests.post(url, headers=headers, cookies=cookies_to_use, params=params, data=key)

    # 检查响应状态
    if response.status_code != 200:
        raise Exception(f"API请求失败,状态码: {response.status_code}")

    # 检查响应内容
    if not response.content:
        raise Exception("API返回空响应")

    content = list(response.content)
    with open('js/jiemi.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    ctx = execjs.compile(js_code)
    result = ctx.call('encrypt', content)

    # 检查解密后结果
    if not result:
        raise Exception("解密结果为空")

    # 检查API返回错误信息
    if 'code' in result and result['code'] != 0:
        error_msg = result.get('code', '未知错误')
        raise Exception(f"API返回错误: {error_msg}")

    # 检查响应结构
    if 'req_1' not in result:
        raise Exception("API响应格式异常: 缺少req_1字段")

    if 'data' not in result['req_1'] or 'body' not in result['req_1']['data']:
        raise Exception("API响应格式异常: 缺少data或body字段")

    if 'song' not in result['req_1']['data']['body']:
        raise Exception("API响应格式异常: 缺少song字段")

    song_info = result['req_1']['data']['body']['song']

    # 检查是否有搜索结果
    if 'list' not in song_info or not song_info['list']:
        return [], 0  # 没有搜索结果,返回空列表和0页数

    # 获取总页数信息
    total_pages = 0
    total_songs = 0
    num_per_page = 10  # 默认值

    # 尝试从响应中获取总歌曲数和每页数量
    if 'totalnum' in song_info:
        total_songs = song_info['totalnum']
    if 'num_per_page' in song_info:
        num_per_page = song_info['num_per_page']

    # 如果能获取到total_songs和num_per_page,则计算总页数
    if total_songs > 0 and num_per_page > 0:
        total_pages = (total_songs + num_per_page - 1) // num_per_page
    else:
        # 如果无法获取到总数,我们可以尝试通过测试下一页来估算总页数
        # 但为了性能考虑,我们先设置为1页,让搜索函数更快
        total_pages = 1

    song_list = song_info['list']
    info = []
    # 遍历所有歌曲,不只是从索引1开始,以确保获取所有结果
    for index in song_list:
        # 检查必要字段是否存在
        if 'mid' not in index or 'id' not in index or 'title' not in index or 'singer' not in index or not index['singer']:
            continue  # 跳过不完整的歌曲信息

        songMID = index['mid']
        songID = index['id']
        albumMid = index.get('album', {}).get('mid', '')
        title = index['title']
        name = index['singer'][0]['name']

        dit = {"songMID": songMID, "songID": songID, "albumMid": albumMid, "title": title, "name": name}
        info.append(dit)

    return info, total_pages

def get_audio(songMID, songID, albumMid, use_cookies=None):
    # 使用传入的cookies,默认为空字典
    cookies_to_use = use_cookies if use_cookies is not None else {}

    audio_data = {
        "comm": {"cv": 4747474, "ct": 24, "format": "json", "inCharset": "utf-8", "outCharset": "utf-8", "notice": 0,
                 "platform": "yqq.json", "needNewCode": 1, "uin": "1152921505341343322", "g_tk_new_20200303": 814268477,
                 "g_tk": 814268477},
        "req_1": {"module": "music.musichallSong.PlayLyricInfo", "method": "GetPlayLyricInfo",
                  "param": {"songMID": songMID, "songID": songID}},
        "req_2": {"method": "GetCommentCount", "module": "music.globalComment.GlobalCommentRead",
                  "param": {"request_list": [{"biz_type": 1, "biz_id": f"{songID}", "biz_sub_type": 0}]}},
        "req_3": {"module": "music.musichallAlbum.AlbumInfoServer", "method": "GetAlbumDetail",
                  "param": {"albumMid": albumMid}}, "req_4": {"module": "music.vkey.GetEVkey", "method": "GetUrl",
                                                              "param": {"guid": "225418138", "songmid": [songMID],
                                                                        "songtype": [0], "uin": "1152921505341343322",
                                                                        "loginflag": 1, "platform": "20", "xcdn": 1,
                                                                        "qdesc": "lq96kOgg"}}}
    linksign, linkkey = getsign(audio_data)
    link = "https://u6.y.qq.com/cgi-bin/musics.fcg"
    link_params = {
        "_": str(int(time.time() * 1000)),
        "encoding": "ag-1",
        "sign": linksign
    }
    response = requests.post(link, headers=headers, cookies=cookies_to_use, params=link_params, data=linkkey)
    content = list(response.content)
    with open('js/jiemi.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    ctx = execjs.compile(js_code)
    result = ctx.call('encrypt', content)
    audio_url = result['req_4']['data']['midurlinfo'][0]['xcdnurl']
    return audio_url

def sanitize_filename(filename):
    # 替换Windows不支持的字符
    illegal_chars = ['<', '>', ':', '"', '/', '\\', '|', '?', '*']
    for char in illegal_chars:
        filename = filename.replace(char, '_')
    return filename.strip()

def save_song(url, name, title):
    safe_name = sanitize_filename(name)
    safe_title = sanitize_filename(title)

    # 创建歌手文件夹
    singer_folder = os_path + safe_name
    if not os.path.exists(singer_folder):
        os.makedirs(singer_folder)

    # 在歌手文件夹中保存歌曲
    file_path = os.path.join(singer_folder, f"{safe_name}--{safe_title}.mp3")
    data = requests.get(url, headers=headers).content
    with open(file_path, 'wb') as f:
        f.write(data)
    return f"歌曲 :{safe_name} -{safe_title} - - 下载完成"

class QQMusicDownloader:
    def __init__(self, root):
        self.root = root
        self.root.title("QQ音乐下载器")  # 设置固定标题
        self.root.geometry("850x750")
        # 初始化变量
        self.current_keyword = ""
        self.total_pages = 0
        self.search_results = {}

        # 创建界面
        self.create_widgets()

        # 设置定时器,每秒更新一次时间显示
        self.update_time_timer()

    def update_time_display(self):
        """更新时间显示,包含当前时间、星期和农历信息"""
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # 获取星期几
        weekday = datetime.now().weekday()
        weekdays = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
        weekday_str = weekdays[weekday]

        # 获取农历信息
        lunar_date = get_lunar_date()

        # 更新时间标签
        self.time_label.config(text=f"{current_time} {weekday_str} {lunar_date}")

    def update_time_timer(self):
        """定时更新时间显示"""
        self.update_time_display()
        # 每秒更新一次
        self.root.after(1000, self.update_time_timer)

    def create_widgets(self):
        # 创建顶部框架,用于显示时间信息
        top_frame = ttk.Frame(self.root)
        top_frame.pack(fill="x", padx=10, pady=5)

        # 创建时间标签,靠右显示
        self.time_label = ttk.Label(top_frame, text="", font=("Arial", 12))
        self.time_label.pack(side="right", padx=5)

        # 初始更新时间显示
        self.update_time_display()

        # Cookies输入区域
        cookies_frame = ttk.LabelFrame(self.root, text="Cookies设置-浏览器登录QQ音乐F12点击network刷新下页面,点击第一个页面,找到cookies双击复制下,点击文本框自动粘帖")
        cookies_frame.pack(fill="x", padx=10, pady=5)

        self.cookies_text = scrolledtext.ScrolledText(cookies_frame, width=100, height=2)
        self.cookies_text.pack(fill="x", padx=5, pady=5)
        # 设置默认cookies文本
        default_cookies = "ts_uid=885560536; RK=BOnZhaf75v; ptcz=504c023335c8bddd3c2a9b1afb43584bb8b2380b558ae34a8974c5ba8c4c87cc; pgv_pvid=781480164; yyb_muid=2EF66898AFD462E120A47B58AEFA63AC; fqm_pvqid=235cd264-b12b-4977-a9fb-256434e665ac; fqm_sessionid=da6ea88c-9aa6-46a9-a2f9-f21eb98e845d; pgv_info=ssid=s8015072296; login_type=2; music_ignore_pskey=202306271436Hn@vBj; ts_refer=i.y.qq.com/; qqmusic_key=W_X_63B0ataXp5fBXoD_L_6Bc67Bv4swfAXauZmHy5s3lKKovvPL8Usl0cYJcZHTJ3VAe-uZ0tg_bqgjHJ2sUKl_zFs7yvvqBkw; tmeLoginType=1; wxunionid=oqFLxstqDWJrzmvDXtoNyeziQ-Cg; qm_keyst=W_X_63B0ataXp5fBXoD_L_6Bc67Bv4swfAXauZmHy5s3lKKovvPL8Usl0cYJcZHTJ3VAe-uZ0tg_bqgjHJ2sUKl_zFs7yvvqBkw; psrf_qqrefresh_token=; psrf_qqopenid=; wxuin=1152921505341343322; euin=oK6kowEAoK4z7KoPoKoPoioAoc**; psrf_qqunionid=; wxopenid=opCFJw1cF6gdt60nT66JAN_22bgI; wxrefresh_token=99_HJzShyRDu4JZqjz-gBmv1gW8OtWBSEKM3cHAw3RI3tiRKGTlWzcJtropNRv3tMZMpC5oE5ROgq-hy11R6kxhK0xAOovWx0dH9V9cAv-ASXI; psrf_qqaccess_token=; ts_last=y.qq.com/n/ryqq_v2/search"
        self.cookies_text.insert(1.0, default_cookies)

        # 绑定鼠标点击事件
        self.cookies_text.bind("<Button-1>", self.paste_cookies)

        # 搜索区域
        search_frame = ttk.LabelFrame(self.root, text="搜索")
        search_frame.pack(fill="x", padx=10, pady=10)

        ttk.Label(search_frame, text="歌手名称:").pack(side="left", padx=5)
        self.keyword_entry = ttk.Entry(search_frame, width=20)
        self.keyword_entry.pack(side="left", padx=5)

        ttk.Label(search_frame, text="最大搜索页数:").pack(side="left", padx=5)
        self.max_pages_entry = ttk.Entry(search_frame, width=10)
        self.max_pages_entry.pack(side="left", padx=5)
        self.max_pages_entry.insert(0, "5")  # 默认值为5

        self.search_btn = ttk.Button(search_frame, text="搜索", command=self.search_music, style="Search.TButton")
        self.search_btn.pack(side="left", padx=5)

        # 搜索结果信息
        info_frame = ttk.Frame(self.root)
        info_frame.pack(fill="x", padx=10)

        ttk.Label(info_frame, text="总页数:").pack(side="left", padx=5)
        self.total_pages_label = ttk.Label(info_frame, text="0")
        self.total_pages_label.pack(side="left", padx=5)

        ttk.Label(info_frame, text="当前页:").pack(side="left", padx=5)
        self.page_combobox = ttk.Combobox(info_frame, width=10)
        self.page_combobox.pack(side="left", padx=5)
        self.page_combobox.bind("<<ComboboxSelected>>", self.show_page_songs)

        # 歌曲列表区域
        list_frame = ttk.LabelFrame(self.root, text="歌曲列表")
        list_frame.pack(fill="both", expand=True, padx=10, pady=10)

        self.songs_text = scrolledtext.ScrolledText(list_frame, width=100, height=13)
        self.songs_text.pack(fill="both", expand=True, padx=5, pady=5)

        # 下载区域
        download_frame = ttk.LabelFrame(self.root, text="下载")
        download_frame.pack(fill="x", padx=10, pady=10)

        # 批量下载
        batch_frame = ttk.Frame(download_frame)
        batch_frame.pack(fill="x", padx=5, pady=5)

        ttk.Label(batch_frame, text="批量下载(页码,用逗号分隔):").pack(side="left", padx=5)
        self.batch_entry = ttk.Entry(batch_frame, width=30)
        self.batch_entry.pack(side="left", padx=5)

        self.batch_download_btn = ttk.Button(batch_frame, text="批量下载", command=self.batch_download, style="Batch.TButton")
        self.batch_download_btn.pack(side="left", padx=5)

        # 全部下载
        self.all_download_btn = ttk.Button(download_frame, text="全部下载", command=self.all_download, style="All.TButton")
        # self.all_download_btn.pack(padx=5, pady=5)
        self.all_download_btn.pack( side='left', padx=5)

        # 下载日志
        log_frame = ttk.LabelFrame(self.root, text="下载日志")
        log_frame.pack(fill="both", expand=True, padx=10, pady=10)

        self.log_text = scrolledtext.ScrolledText(log_frame, width=100, height=10)
        self.log_text.pack(fill="both", expand=True, padx=5, pady=5)

    def paste_cookies(self, event):
        try:
            # 获取剪贴板内容
            clipboard_content = self.root.clipboard_get()
            if clipboard_content:
                # 清空当前内容并插入剪贴板内容
                self.cookies_text.delete(1.0, tk.END)
                self.cookies_text.insert(1.0, clipboard_content)
            else:
                messagebox.showwarning("警告", "剪贴板为空,请先在浏览器中复制cookies")
        except tk.TclError:
            messagebox.showwarning("警告", "剪贴板为空,请先在浏览器中复制cookies")

    def parse_cookies(self, cookies_str):
        """
        解析cookies字符串,支持多种格式
        """
        cookies_dict = {}

        # 按分号分割
        pairs = cookies_str.split(';')

        for pair in pairs:
            pair = pair.strip()
            if '=' in pair:
                key, value = pair.split('=', 1)
                cookies_dict[key.strip()] = value.strip()

        return cookies_dict

    def search_music(self):
        # 解析cookies
        cookies_str = self.cookies_text.get(1.0, tk.END).strip()
        use_cookies = self.parse_cookies(cookies_str) if cookies_str else {}

        keyword = self.keyword_entry.get().strip()
        if not keyword:
            messagebox.showwarning("警告", "请输入歌手名称")
            return

        # 获取用户设置的最大搜索页数
        max_pages_str = self.max_pages_entry.get().strip()
        if not max_pages_str or not max_pages_str.isdigit():
            max_pages = 10  # 默认值
        else:
            max_pages = min(int(max_pages_str), 100)  # 限制最大值不超过100,防止过度请求

        self.current_keyword = keyword
        self.search_btn.config(state="disabled")
        self.log_text.insert(tk.END, f"正在搜索歌手: {keyword}...\n")
        self.log_text.see(tk.END)

        # 使用线程进行搜索,避免界面卡顿
        def search_thread():
            try:
                # 先获取第一页结果以获取总页数
                songs, total_pages = search(keyword, 1, use_cookies=use_cookies)

                # 如果API返回的总页数是1,我们尝试检查是否还有更多页
                if total_pages == 1:
                    self.log_text.insert(tk.END, f"正在检查是否有更多搜索结果,最大搜索 {max_pages} 页...\n")
                    # 尝试获取第2页,看是否有结果
                    try:
                        next_page_songs, _ = search(keyword, 2, use_cookies=use_cookies)
                        if next_page_songs:  # 如果第2页有结果
                            # 继续检查第3页到用户设定的最大页数
                            additional_pages = 1
                            for page in range(3, max_pages + 1):  # 检查第3到最大页数
                                try:
                                    more_songs, _ = search(keyword, page, use_cookies=use_cookies)
                                    if more_songs:
                                        additional_pages += 1
                                    else:
                                        break  # 如果某页没有结果,就停止检查
                                except:
                                    break  # 如果请求失败,停止检查
                            total_pages = 1 + additional_pages
                    except:
                        pass  # 如果检查失败,保持原来的页数

                self.total_pages = total_pages
                self.total_pages_label.config(text=str(total_pages))

                # 更新页面选择下拉框
                self.page_combobox['values'] = [str(i) for i in range(1, total_pages + 1)]
                if total_pages > 0:
                    self.page_combobox.current(0)
                    self.search_results[1] = songs  # 缓存第一页结果
                    self.show_page_songs(None)

                self.log_text.insert(tk.END, f"搜索完成,共找到 {total_pages} 页结果,{len(songs)} 首歌曲\n")
            except Exception as e:
                messagebox.showerror("错误", f"搜索失败: {str(e)}")
                self.log_text.insert(tk.END, f"搜索失败: {str(e)}\n")
                # 打印详细错误信息以便调试
                import traceback
                traceback.print_exc()
            finally:
                self.search_btn.config(state="normal")
                self.log_text.see(tk.END)

        Thread(target=search_thread).start()

    def show_page_songs(self, event):
        # 解析cookies
        cookies_str = self.cookies_text.get(1.0, tk.END).strip()
        use_cookies = self.parse_cookies(cookies_str) if cookies_str else {}

        page_str = self.page_combobox.get()
        if not page_str:
            return

        page = int(page_str)

        # 检查是否已经缓存了该页的结果
        if page not in self.search_results:
            self.log_text.insert(tk.END, f"正在加载第 {page} 页歌曲...\n")
            self.log_text.see(tk.END)

            try:
                songs, _ = search(self.current_keyword, page, use_cookies=use_cookies)
                self.search_results[page] = songs
            except Exception as e:
                messagebox.showerror("错误", f"加载页面失败: {str(e)}")
                self.log_text.insert(tk.END, f"加载页面失败: {str(e)}\n")
                # 打印详细错误信息以便调试
                import traceback
                traceback.print_exc()
                return

        songs = self.search_results[page]

        # 显示歌曲列表
        self.songs_text.delete(1.0, tk.END)
        self.songs_text.insert(tk.END, f"第 {page} 页歌曲列表 (共{len(songs)}首):\n\n")
        if songs:
            for i, song in enumerate(songs):
                self.songs_text.insert(tk.END, f"{i + 1}. {song['title']} - {song['name']}\n")
        else:
            self.songs_text.insert(tk.END, "没有找到相关歌曲\n")

    def batch_download(self):
        # 解析cookies
        cookies_str = self.cookies_text.get(1.0, tk.END).strip()
        use_cookies = self.parse_cookies(cookies_str) if cookies_str else {}

        pages_str = self.batch_entry.get().strip()
        if not pages_str:
            messagebox.showwarning("警告", "请输入要下载的页码")
            return

        # 解析页码,支持中文逗号和英文逗号
        pages = []
        # 将中文逗号替换为英文逗号,然后分割
        pages_str = pages_str.replace(',', ',')
        for page_str in pages_str.split(","):
            page_str = page_str.strip()
            if page_str.isdigit():
                page = int(page_str)
                if 1 <= page <= self.total_pages:
                    pages.append(page)

        if not pages:
            messagebox.showwarning("警告", "请输入有效的页码")
            return

        self.batch_download_btn.config(state="disabled")
        self.all_download_btn.config(state="disabled")

        def download_thread():
            try:
                for page in pages:
                    # 检查是否已经缓存了该页的结果
                    if page not in self.search_results:
                        self.log_text.insert(tk.END, f"正在加载第 {page} 页歌曲...\n")
                        self.log_text.see(tk.END)
                        songs, _ = search(self.current_keyword, page, use_cookies=use_cookies)
                        self.search_results[page] = songs
                    else:
                        songs = self.search_results[page]

                    # 下载该页的所有歌曲
                    for song in songs:
                        self.log_text.insert(tk.END, f"正在下载: {song['title']} - {song['name']}...\n")
                        self.log_text.see(tk.END)

                        try:
                            audio_url = get_audio(song['songMID'], song['songID'], song['albumMid'], use_cookies=use_cookies)
                            result = save_song(audio_url, song['name'], song['title'])
                            self.log_text.insert(tk.END, f"{result}\n")
                        except Exception as e:
                            self.log_text.insert(tk.END, f"下载失败: {str(e)}\n")

                        self.log_text.see(tk.END)
                        time.sleep(1)  # 避免请求过快
            except Exception as e:
                messagebox.showerror("错误", f"批量下载失败: {str(e)}")
                self.log_text.insert(tk.END, f"批量下载失败: {str(e)}\n")
            finally:
                self.batch_download_btn.config(state="normal")
                self.all_download_btn.config(state="normal")
                self.log_text.see(tk.END)

        Thread(target=download_thread).start()

    def all_download(self):
        # 解析cookies
        cookies_str = self.cookies_text.get(1.0, tk.END).strip()
        use_cookies = self.parse_cookies(cookies_str) if cookies_str else {}

        if self.total_pages == 0:
            messagebox.showwarning("警告", "请先搜索歌曲")
            return

        self.batch_download_btn.config(state="disabled")
        self.all_download_btn.config(state="disabled")

        def download_thread():
            try:
                for page in range(1, self.total_pages + 1):
                    # 检查是否已经缓存了该页的结果
                    if page not in self.search_results:
                        self.log_text.insert(tk.END, f"正在加载第 {page} 页歌曲...\n")
                        self.log_text.see(tk.END)
                        songs, _ = search(self.current_keyword, page, use_cookies=use_cookies)
                        self.search_results[page] = songs
                    else:
                        songs = self.search_results[page]

                    # 下载该页的所有歌曲
                    for song in songs:
                        self.log_text.insert(tk.END, f"正在下载: {song['title']} - {song['name']}...\n")
                        self.log_text.see(tk.END)

                        try:
                            audio_url = get_audio(song['songMID'], song['songID'], song['albumMid'], use_cookies=use_cookies)
                            result = save_song(audio_url, song['name'], song['title'])
                            self.log_text.insert(tk.END, f"{result}\n")
                        except Exception as e:
                            self.log_text.insert(tk.END, f"下载失败: {str(e)}\n")

                        self.log_text.see(tk.END)
                        time.sleep(1)  # 避免请求过快
            except Exception as e:
                messagebox.showerror("错误", f"全部下载失败: {str(e)}")
                self.log_text.insert(tk.END, f"全部下载失败: {str(e)}\n")
            finally:
                self.batch_download_btn.config(state="normal")
                self.all_download_btn.config(state="normal")
                self.log_text.see(tk.END)

        Thread(target=download_thread).start()
if __name__ == "__main__":
    root = tk.Tk()
    app = QQMusicDownloader(root)
    root.mainloop()
cc3fc23e1f17d62e8e2cf4973278ecb3.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lyh7733 + 1 + 1 大佬能不能打包一个能自定义cookies的版本,整半天一直报错。谢谢

查看全部评分

 楼主| 13955925361 发表于 2026-1-5 21:00
本帖最后由 13955925361 于 2026-1-5 21:11 编辑

此贴完结,账号已被风控,访问403,是各位下的太多太快了么,热情我感受到了,代码没问题可以借鉴。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Edward0524 + 1 + 1 我很赞同!

查看全部评分

江男 发表于 2026-1-3 16:49
我的运行总是出错:
PS D:\Users\Admin\Desktop\QQmusic> & C:/Python312/python.exe d:/Users/Admin/Desktop/QQmusic/qqmusic.py
请输入你要搜索的内容( 00退出 ):邓紫棋
请输入你要搜索的页数:2
批量( Y ) or 单个( N ) :Y
Exception in thread Thread-1 (_readerthread):
Traceback (most recent call last):
  File "C:\Python312\Lib\threading.py", line 1075, in _bootstrap_inner
    self.run()
  File "C:\Python312\Lib\threading.py", line 1012, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python312\Lib\subprocess.py", line 1599, in _readerthread
    buffer.append(fh.read())
                  ^^^^^^^^^
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 1520: illegal multibyte sequence
Traceback (most recent call last):
  File "d:\Users\Admin\Desktop\QQmusic\qqmusic.py", line 206, in <module>
    main()
  File "d:\Users\Admin\Desktop\QQmusic\qqmusic.py", line 156, in main
    info = search(keyword, page)
           ^^^^^^^^^^^^^^^^^^^^^
  File "d:\Users\Admin\Desktop\QQmusic\qqmusic.py", line 92, in search
    result = ctx.call('encrypt', content)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call
    return self._call(name, *args)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_external_runtime.py", line 92, in _call
    return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_external_runtime.py", line 78, in _eval
    return self.exec_(code)
           ^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_
    return self._exec_(source)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_external_runtime.py", line 88, in _exec_
    return self._extract_result(output)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python312\Lib\site-packages\execjs\_external_runtime.py", line 156, in _extract_result
    output = output.replace("\r\n", "\n").replace("\r", "\n")
             ^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'replace'

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
q1009 + 1 + 1 同样问题

查看全部评分

zhu791023529 发表于 2026-1-5 15:36
dudu2021120 发表于 2026-1-5 15:31
很复杂,不适合小白使用,你看看有没有打包好的

确实,好像没有打包好的
du6885386 发表于 2026-1-3 07:09
这个就厉害了,可惜对于俺这种小白不会用
t711s 发表于 2026-1-2 23:35
没有flac吗
 楼主| 13955925361 发表于 2026-1-3 23:13
q1009 发表于 2026-1-3 23:01
大佬,你 是用的PyExecJS-1.5.1么,感觉很多错误都是execjs 引起的,能分享一下你execjs 版本么

破案了,我有一次也是一直调用不成功,原因是没装PyExecjS2
https://youke3.picui.cn/s1/2026/01/03/6959312600644.png
素梳999 发表于 2026-1-3 10:38
下了,一看不会用
 楼主| 13955925361 发表于 2026-1-2 23:13
zt185 发表于 2026-1-2 23:09
这个厉害了,方便下载音乐了!

等我绿钻过期,付费的就下不到了,且用且珍惜吧,一次性下完比较好。
STLucifer 发表于 2026-1-2 22:15
这么好的东西 ,拿下了
jupiter2008 发表于 2026-1-2 22:16
多谢哪。
PXF1990 发表于 2026-1-2 22:20
感谢分享!
yepulu9 发表于 2026-1-2 22:20
谢谢分享。
yjg95 发表于 2026-1-2 22:28
我去 好人呀~~哈哈
long88888888 发表于 2026-1-2 22:33
备用吧,谢谢
 楼主| 13955925361 发表于 2026-1-2 22:48
本帖最后由 13955925361 于 2026-1-2 22:52 编辑
zhu791023529 发表于 2026-1-2 22:40
小白问一下,怎么使用

Python代码按终端提示运行即可,前提是安装了node环境
xuanyuzaixian 发表于 2026-1-2 22:52
这个好,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-1-7 15:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表