我维护着一个acobsmonkey脚本,该脚本监视当前的轨道播放以及Soundcloud上的进度。以前,我可以执行require("lib/audiomanager")来访问一个对象,该对象使我可以查看整个页面的状态,例如播放轨道信息。

问题是,Soundcloud已转向使用webpack为其客户端Javascript。据我了解,这会将所有这些类存储为一个特定的数字包。每当客户端JS更新并重新编译时,它们存储的数字似乎会更改

如下所示,访问webpack中存储的对象的唯一方法似乎是通过全局webpackJsonp。包装的编号只需要是唯一的。

webpackJsonp([6060], {
    0: function (e, t, n) {
        window.aman = n(726);
        e.exports = function (abc) {
            console.log("Exports called");
        };
    }
});

该代码将执行,并允许我访问webpack中该编号的对象。在客户端Webpack的JS中定义的对象是:
726: function (e, t, n) {
    (function (t) {
        function i(e) {
            var n = t(e.getContainerElement()),
                i = e.getState() === r.States.ERROR;
            n.toggleClass('blocked', i)
        }
        var r,
            s = n(53),
            o = n(14),
            a = 1000 / 60;
        e.exports = r = new s({
                flashAudioPath: n(2181),
                flashObjectID: 'flashAudioObject',
                updateInterval: a,
                debug: !1
            }),
            r.Errors = s.Errors,
            r.States = s.States,
            r.UPDATE_INTERVAL = a,
            o.once('audio:flash_block audio:flash_unblock', i)
    })
    .call(t, n(1))
},

因此,我能想到的解决方案是:
  • 查找一个Webpack编号不变的对象,我可以使用该对象来获取该对象的句柄
  • 遍历每个Webpack编号,并查找具有与此方法相同的方法集的对象。

  • 后者看起来很杂乱,而第一个似乎是不可能的。有任何想法吗?

    我尝试过的事情:
  • 使新的n(53)像所需的对象一样,因为在更新过程中似乎保持不变。给我一个音频管理器,但是肯定与页面的普通音频管理器是分开的,所以我看不到正在播放什么。
  • 最佳答案

    Afaik您只能从另一个程序包访问这些程序包。 Soundcloud不使用ProvidePlugin,因此全局空间中都没有可用的库和模块。

    更新:

    我知道这是一个丑陋的骇客,但确实有效:

    webpackJsonp([6060], {
        0: function (e, t, n) {
            var i = 0,
            found = false,
            lib;
            while (i < 2000 && !found) {
                try {
                    lib = n(i);
                }
                catch (err) {
                    lib = null;
                }
    
                if (lib && typeof lib._mute !== 'undefined') {
                    found = true;
                    console.log('found', lib, i);
                }
                console.log(i, lib);
                i++;
            }
            window.aman = lib;
        }
    });

    关于javascript - 通过页面JS访问soundcloud的lib/audiomanager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26578745/

    10-11 06:25
    查看更多