Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将ViolentMokey用户脚本制作成浏览器扩展?_Javascript_Greasemonkey_Userscripts - Fatal编程技术网

Javascript 如何将ViolentMokey用户脚本制作成浏览器扩展?

Javascript 如何将ViolentMokey用户脚本制作成浏览器扩展?,javascript,greasemonkey,userscripts,Javascript,Greasemonkey,Userscripts,我一直在尝试将userScript迁移到我自己的扩展中,但由于某些原因,我无法运行以下代码: /==/UserScript== console.info('BEFORE Hooked!MONKEY'); (功能(){ "严格使用",; //参考[Augular loaded detect]:https://stackoverflow.com/a/31970556/9182265 var initWatcher=setInterval(函数(){ if(window.MegaUtils){ co

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

/==/UserScript==
console.info('BEFORE Hooked!MONKEY');
(功能(){
"严格使用",;
//参考[Augular loaded detect]:https://stackoverflow.com/a/31970556/9182265
var initWatcher=setInterval(函数(){
if(window.MegaUtils){
console.info(window.MegaUtils);
clearInterval(initWatcher);
hookImport();
hookFull();
console.info('FUNtions Hooked!MONKEY');
}
}, 500);

})();首先,请删除glob,因为它可能会导致问题

“内容脚本”:[
{
“匹配项”:[“http://mega.nz/*", "https://mega.nz/*"],
“js”:[“mega.user.js”]
}
]
ViolentMonkey默认情况下在
文档末尾注入。但是,GM/VM/TM手动注入用户脚本,并且不使用专用API(Firefox中的FireMonkey使用专用API),因此注入时间可能晚于浏览器API注入时

尝试使用默认的
“document\u idle”
(您可以不使用它)

使用
“document\u end”
可能会导致脚本在加载外部角度之前运行,这可能是问题的原因

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

更新1

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

不同浏览器之间的全局
window
行为并不一致(例如,chrome中的
eval()
始终在内容脚本的上下文中运行,而Firefox中的
eval()
在内容范围中运行,但在页面范围中运行
window.eval()

快速测试后,内容脚本无法访问全局
窗口
窗口.MegaUtils
。有很多方法可以解决这一问题,但用户脚本工作的原因可能与ViolentMonkey注入它或在不使用
unsafewindow
的情况下授予对
window
对象的访问权的方式有关

您是否与其他脚本管理器一起测试过该脚本?!!脚本是在所有脚本管理器上工作还是仅在ViolentMonkey上工作

更多信息:

另外,我只在Firefox上测试过,因为我不使用Chrome

更新2

看一下,当存在
@grant none
(需要正确确认)时,GM | TM | VM可能正在向页面内容中注入用户脚本。这就解释了为什么上面带有
@grant none
的用户脚本可以工作,并且可以在GM | TM | VM(而不是FM)中获取
window.MegaUtils
。在这种情况下,需要将脚本注入页面JS中

以下是一个例子:

const script=document.createElement('script');
script.textContent=`(函数(){
"严格使用",;
//参考[Augular loaded detect]:https://stackoverflow.com/a/31970556/9182265
var initWatcher=setInterval(函数(){
if(window.MegaUtils){
clearInterval(initWatcher);
hookImport();
hookFull();
console.info('FUNtions hocked!');
}
}, 500);
})();
....`;
document.body.appendChild(脚本);
更新3 CSP

目前,浏览器遵守页面CSP(内容安全策略),这是您在评论中提到的问题。
参考:


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

我非常确定用户脚本而不是内容脚本是一种方法

此API提供了与contentScripts类似的功能,但具有适合处理第三方脚本的功能:

  • 访问与用户脚本附加到的网页相关的窗口和文档全局值


不过,它的工作原理有点不同,仍然试图理解它:)

上面的代码在哪里运行?背景脚本还是内容脚本?它是如何注入的?我相信这就是你要问的://@runat-document-end-full-source in:No。我在问adon是如何注入上述脚本的?通过
manifest.json
tabs.executeScript
contentScripts.register()
userScripts.register()
等?这是一个好问题,我正在使用manifest.json,但不确定ViolentMonkey是如何做到的。如何找到答案?我在问题中添加了我的清单。回复再次更新,包含更多信息。Chrome会抱怨删除了匹配项和js字段,因此它们必须在那里才能导入。我尝试使用document_idle,但它从未检测到window.MegaUtils.@ChopLabalagun要进行正确的测试,需要实际的扩展名。您可以从这里获得:@ChopLabalagun-Answer-updated。。虽然问题还没有解决。谢谢你的尝试,这很奇怪。我期待着一个非常直接的整合。