【发布时间】:2021-09-24 19:57:05
【问题描述】:
在我使用的网站中,有一个超时,它会在控制台中记录一些内容并再次调用自身。示例:
(function(){
var times = 0;
var myInterval = function(){
setTimeout(()=>{
console.log("my log " + (times++));
myInterval();
}, 1000);
}
myInterval();
})();
通过使用这个无名函数,该站点使其变量无法通过控制台访问。
问题是每次重新加载页面时都需要完成这个过程,我想制作一个 UserScript 或类似的东西来自动完成这个过程。不久前,有人告诉我有一个东西可以在页面加载之前编辑脚本,我只是忘记了它的名字。
解决方案:
让您在加载之前编辑脚本的“东西”是 Resource Override 但我只是在一段时间后才想起,所以这次我没有使用它,而是创建了自己的用户脚本和这个结果是:
在@TheBombSquad 的帮助下,我找到了一种编辑setTimeout 本机代码的方法。有了它,我可以检查函数并只停止我想要的特定函数,而不会破坏依赖于 setTimeout 的其余代码。
为此,我需要创建自己的 setTimeout 函数并在该函数是我要编辑的函数时调用它:
(function(){
var times = 0;
var myInterval = function(){
setTimeout(()=>{
console.log("my log " + (times++));
myInterval();
}, 1000);
}
myInterval();
var myOtherInterval = function(){
setTimeout(()=>{
console.log("my unedited log " + (times++));
myOtherInterval();
}, 1000);
}
myOtherInterval();
})();
/* Thru my UserScript */
var mySetTimeout = (myFunction, timeOut) => {
var timer;
var currentTime = new Date().getTime();
var runFunction = () => {
if (new Date().getTime() >= currentTime + timeOut) {
clearInterval(timer);
myFunction();
}
}
timer = setInterval(runFunction, 100);
}
setTimeout = function(myFunction, timeOut){
var boole = (myFunction + "").includes('console.log("my log "');
if(!boole){ /* if its not the function that i need */
mySetTimeout(myFunction, timeOut);
} else {
var myInterval = function(){
mySetTimeout(()=>{
console.log("My edited log YEY!");
myInterval();
}, timeOut);
}
myInterval();
}
};
谢谢大家!
【问题讨论】:
-
也许“很久以前”是 Firefox 出现的时候......我们可以使用 beforescriptexecute 事件
-
有.. 考虑劫持函数使用的全局变量 ;3
-
我假设你想惹
times对吧? -
@bravo,我在greasemonkey userscript 中使用该方法删除部分脚本或在执行之前阻止脚本。
-
@vanowm - 是的,当然 - 你是仍在使用 Firefox 的 6 个人之一吗,现在我们需要找到另外 4 个
标签: javascript html greasemonkey tampermonkey userscripts