如何将 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"
}
提前致谢。
首先,删除 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()
在页面范围内)。
经过快速测试,内容脚本无法访问全局 window
和 window.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
虽然它的工作原理有点不同,但仍在尝试理解它:)
我一直在尝试将 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"
}
提前致谢。
首先,删除 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()
在页面范围内)。
经过快速测试,内容脚本无法访问全局 window
和 window.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
虽然它的工作原理有点不同,但仍在尝试理解它:)