通过页面JS访问soundcloud的lib/audiomanager

Dit*_*ndt 5 javascript soundcloud webpack

我维护一个greasemonkey脚本,监视当前的音轨播放以及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");
        };
    }
});
Run Code Online (Sandbox Code Playgroud)

该代码将执行并允许我访问webpack中该编号的对象.在clientside webpack'd 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))
},
Run Code Online (Sandbox Code Playgroud)

那么,我能想到的解决方案:

  • 找到一个webpack编号没有改变的对象,我可以使用它来获取这个对象的句柄
  • 迭代每个webpack编号并查找与此方法具有相同方法集的对象.

后者看起来很乱,第一个似乎不可能.有任何想法吗?

我试过的事情:

  • 制作一个像所需对象一样的新n(53),因为它似乎在更新中保持不变.给了我一个audiomanager,但肯定是与页面的正常audiomanager分开,所以我看不到正在播放的内容.

hac*_*cfi 1

据我所知,您只能从另一个包访问这些包。Soundcloud 不\xe2\x80\x99 不使用 ProvidePlugin,因此全局空间中没有任何库和模块可用。

\n\n

更新:

\n\n

我知道它\xe2\x80\x99是一个丑陋的黑客,但它有效:

\n\n

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

\n