Javascript 这个窗口[“obvInit”]({…})在脚本中做什么?

Javascript 这个窗口[“obvInit”]({…})在脚本中做什么?,javascript,json,medium.com,Javascript,Json,Medium.com,我对复杂的javascript不是特别熟悉。我试图从媒体URL中提取一些信息,我注意到每个页面都以JSON格式存储了完整的帖子内容。页面上的内容如下所示: <script>// <![CDATA[ window["obvInit"]({"value":{"id":"e389ba1d8f57","versionId":"1b74... /它的作用是调用函数。在全局窗口名称空间上,它很可能(但并非必然)被声明为函数obvInit(…){…}。现在解决您的问题:您可以通过如下方式覆

我对复杂的javascript不是特别熟悉。我试图从媒体URL中提取一些信息,我注意到每个页面都以JSON格式存储了完整的帖子内容。页面上的内容如下所示:

<script>// <![CDATA[
window["obvInit"]({"value":{"id":"e389ba1d8f57","versionId":"1b74...

/它的作用是调用函数。在全局窗口名称空间上,它很可能(但并非必然)被声明为
函数obvInit(…){…}
。现在解决您的问题:您可以通过如下方式覆盖函数来轻松提取传递的对象:

var _oldObvInit = window.obvInit;
window.obvInit = function(){
        console.log(arguments[0]); //use this to extract the object
        console.log(JSON.stringify(arguments[0])); //use this to extract JSON
        return _oldObvInit.apply(window, arguments);
}
functionName({ /* ...data... */ });
将它放在您在此处发布的脚本标记之前和函数obvInit声明之后


位上下文:在每个javascript函数中都有一个隐式变量
arguments
,它将参数作为数组存储到函数中。和
apply
调用函数,设置上下文(
this
),并将参数作为数组。这正是您需要包装的东西。

这是一种称为。基本上,由于一些较旧的浏览器不太支持使用跨源AJAX,您可以在页面中插入
标记,以获取所需的资源,但包装方式如下:

var _oldObvInit = window.obvInit;
window.obvInit = function(){
        console.log(arguments[0]); //use this to extract the object
        console.log(JSON.stringify(arguments[0])); //use this to extract JSON
        return _oldObvInit.apply(window, arguments);
}
functionName({ /* ...data... */ });
所以它调用一个名为
functionName
的函数,并将数据作为参数。在插入脚本之前,您可以在自己的代码中提供此函数,如下所示:

function functionName(data) {
    // use the data
}
window[“obvInit”]()
相当于
window.obvInit()
,这相当于在全局级别调用定义为
obvInit
的函数


由于脚本不受限制,您现在可以从任何域获取类似JSON的数据,这些数据将以这种格式返回。

这只是一个函数调用,将一个字符串传递给函数(
window.obvInit
)。这与JSON无关。如何将其放入外部托管页面中的脚本中?除非您想执行诸如XSS之类的讨厌操作,否则Greasemonkey/Tampermonkey可能值得一看。如果用户交互是一个选项,那么您也可以将代码放入bookmarklet,让用户执行它。不过,时机可能是个问题。如果不了解更多的上下文,很难说。