首页 > 解决方案 > 使用扩展名或其他方式在无名函数中编辑变量

问题描述

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

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

通过使用这个无名函数,该站点使其变量无法通过控制台访问。

我解决它的唯一方法是进入“源”选项卡并编辑脚本本身: 在此处输入图像描述

问题是每次重新加载页面时都需要完成这个过程,我想制作一个 UserScript 或类似的东西来自动完成这个过程。不久前,有人告诉我有一个东西可以在页面加载之前编辑脚本,我只是忘记了它的名字。

解析度:

让您在加载脚本之前编辑脚本的“东西”是资源覆盖,但我只是在一段时间后才想起,所以这次我没有使用它,而是创建了自己的用户脚本,结果如​​下:

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

谢谢大家!

标签: javascripthtmlgreasemonkeytampermonkeyuserscripts

解决方案


我所能做的就是在我想重构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()


推荐阅读