使用扩展名或其他方式编辑无名函数内的变量

Edit variable inside nameless function using extension or by other ways

在我使用的网站中,超时会在控制台中记录一些内容并再次调用自身。示例:

(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();
    }
};

谢谢大家!

我所能做的就是 运行 当我想重塑 setTimeout 全局函数时的函数

const s=setTimeout; let c=0
setTimeout=function(fn){
  if(!c){window.addToTimes=fn}
}

;(function(){
  var times = 0;
  var myInterval = function(){
    setTimeout(()=>{
      console.log("my log " + (times++));
      myInterval();
    }, 1000);
  }
  myInterval();
})();

//example usage(it just runs the embedded function)
addToTimes(); addToTimes()