Javascript with Grease Monkey : @grant messes up Youtube API

Javascript with Grease Monkey : @grant messes up Youtube API

本文关键字:messes up Youtube API @grant with Grease Monkey Javascript      更新时间:2023-09-26

我使用GM为网站编写自定义脚本。脚本将一个嵌入Youtube播放器添加到页面中,所以我调用Youtube API。下面是代码的开头:

// ==UserScript==
// @author       mens
// @match        http://thewebsite.com
// @grant        none
// ==/UserScript==
///////////// YOUTUBE
// API
var player;
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// API loaded
window.onYouTubeIframeAPIReady = function()
{
    console.log("API loaded");
}

有了这段代码,一切都很好。前几行调用API,加载后触发onYouTubeIframeAPIReady,然后我的脚本生成player

您会注意到@grant被设置为none。问题是当我改变这条线的时候,哪怕是一点点。我使用GM_getResourceURL来访问外部文件(如图形)。

所以当我设置:

// @grant        GM_getResourceURL

…API不再工作:onYouTubeIframeAPIReady永远不会被调用!

从我在GM文档中收集到的信息来看,@grant none是默认模式,这意味着对代码中使用的所有api的最大访问。当更改@grant时,可能会出现更多限制…我认为这是问题的一部分,但我不知道如何解决它。

谢谢你的帮助!

所以技巧很简单(但相当神秘):我通过重命名函数将window更改为unsafeWindow:

unsafeWindow.onYouTubeIframeAPIReady = function()
{
    console.log("API loaded");
}

GM文件:

unsafeWindow

unsafeWindow对象提供了对页面javascript函数和变量的完全访问。

似乎除了none之外,任何@grant都将window对象放入限制外部api访问的沙箱中。我仍然不确定如何正确设置这些限制,但unsafeWindow完全绕过它们。

代替

// API loaded
window.onYouTubeIframeAPIReady = function()
{
    console.log("API loaded");
}

这样做

function apiReady() {
    console.log("API loaded");
}
exportFunction(apiReady, unsafeWindow, {defineAs: "onYouTubeIframeAPIReady"});

查看Mozilla文档中的exportFunction

说明

然而,我自己还没有100%确信这比直接使用unsafeWindow更"安全"(在greasemonkey中)

根据我在GM文档中收集到的信息,@grant none是默认模式,这意味着对代码中使用的所有api的最大访问权限。

这是不正确的。@grant none所做的是显式地关闭所有 greasemonkey API (GM*函数)并在没有沙箱的情况下运行脚本,因为没有恶意网站使用greasemonkey针对您的可能性。