Javascript 如何将ViolentMokey用户脚本制作成浏览器扩展?
我一直在尝试将userScript迁移到我自己的扩展中,但由于某些原因,我无法运行以下代码: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==
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。。虽然问题还没有解决。谢谢你的尝试,这很奇怪。我期待着一个非常直接的整合。