如何将 ViolentMokey userScript 制作成浏览器扩展?

How to make a ViolentMokey userScript into a Browser Extension?

我一直在尝试将 userScript 迁移到我自己的扩展程序中,但由于某些原因我无法 运行 以下代码:

// ==/UserScript==
console.info('BEFORE Hooked! MONKEY');
(function() {
    'use strict';
    // Reference [Augular loaded detect]: 
    var initWatcher = setInterval(function () {
        if (window.MegaUtils) {
            console.info(window.MegaUtils);
            clearInterval(initWatcher);
            hookImport();
            hookFull();
            console.info('FUNtions Hooked! MONKEY');
        }
    }, 500);
})();

但由于某种原因,IF 语句永远不会为真,但来自 ViolentMonkey 的 运行 完全相同的代码,它立即起作用。

所以 window.MegaUtils 根本没有被检测到,我也不知道为什么。 我被告知我的扩展程序可能无法访问 DOM 对象,但为什么 ViolentMonkey 确实可以访问它。

这是我在 Chrome 中导入扩展时使用的清单:

{
    "manifest_version": 2,
    "content_scripts": [ {
        "exclude_globs":    [  ],
        "include_globs":    [ "*" ],
        "js":               [ "mega.user.js" ],
        "matches":          [   "https://mega.nz/*",
                                "http://mega.nz/*" ],
        "run_at": "document_end"
    } ],
    "converted_from_user_script": true,
    "description":  "testing extension",
    "permissions": [],
    "name":         "MegaByPass",
    "icons": {
        "16": "images/mega-cloud-icon.png",
        "32": "images/mega-cloud-icon.png",
        "48": "images/download.png",
        "128": "images/873133.png"
      },
    "version":      "1.0"
}

source

提前致谢。

首先,删除 glob,因为它可能会导致问题。

"content_scripts": [
  {
    "matches": ["http://mega.nz/*", "https://mega.nz/*"],
    "js": ["mega.user.js"]
  }
]

ViolentMonkey 默认在 document-end 注入。但是,GM/VM/TM 手动注入用户脚本,而不是使用专用的 API(FireMonkey 在 Firefox 中使用专用的 API),因此注入时间可能会晚于浏览器 API注入。

尝试使用默认值 "document_idle"(您可以将其省略)。

使用 "document_end" 可能会导致在加载外部 Angualr 之前执行脚本 运行ning,这可能是问题的原因。

为了正确测试,需要实际的扩展。

更新 1

内容脚本被注入到与其所在页面不同的scope/context。因此它们不能直接与页面上的 JS 交互,反之亦然。

全局 window 行为在不同浏览器之间不统一(例如 chrome 中的 eval() 在内容脚本的上下文中总是 运行 但在 Firefox eval() 运行s 在内容范围内,但 window.eval() 在页面范围内)。

经过快速测试,内容脚本无法访问全局 windowwindow.MegaUtils。有一些方法可以解决这个问题,但用户脚本起作用的原因可能与 ViolentMonkey 注入它或授予访问 window 对象而不使用 unsafewindow.

的方式有关

您是否使用其他脚本管理器测试过该脚本?!!该脚本适用于所有脚本管理器还是仅适用于 ViolentMonkey?

更多信息:

Insert code into the page context using a content script

PS。我只在 Firefox 上测试过,因为我不使用 Chrome.

更新 2

查看 Can't find page variables when used GM_ functions,似乎 GM|TM|VM 可能在 @grant none 时将用户脚本注入页面内容(需要适当确认).这可以解释为什么上面带有 @grant none 的用户脚本可以工作并且可以在 GM|TM|VM(不是 FM)中获得 window.MegaUtils。在这种情况下,您需要在页面 JS 中注入脚本。

这是一个例子:

const script = document.createElement('script');
script.textContent = `(function() {
    'use strict';
    // Reference [Augular loaded detect]: 
    var initWatcher = setInterval(function () {
        if (window.MegaUtils) {
            clearInterval(initWatcher);
            hookImport();
            hookFull();
            console.info('FUNtions Hooked!');
        }
    }, 500);
})();

....`;
document.body.appendChild(script);

更新 3 CSP

目前,浏览器遵守页面 CSP(内容安全策略),这是您在评论中提到的问题。
参考:
[meta] Page CSP should not apply to content inserted by content scripts (V2 issue)
CSP 'sandbox' directive prevents content scripts from matching, due to unique origin, breaking also browser features [Screenshots]

有很多解决方法,但它们不是标准的,扩展不应绕过浏览器或页面 CSP。

我很确定 user_script 而不是 content_script 是正确的选择。

This API offers similar capabilities to contentScripts but with features suited to handling third-party scripts:

  • access to the window and document global values related to the webpage the user script is attached to.

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/userScripts

虽然它的工作原理有点不同,但仍在尝试理解它:)