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

Posted

技术标签:

【中文标题】使用扩展名或其他方式在无名函数中编辑变量【英文标题】:Edit variable inside nameless function using extension or by other ways 【发布时间】: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 个 【参考方案1】:

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

【讨论】:

这停止了间隔,但有点破坏了其余代码,我想要一种在加载页面之前编辑脚本的方法 因为其他东西在代码上超出这个函数依赖于setTimeout 有没有办法在不进行自循环的情况下执行 setTimeout 重构中的函数?我刚试过:setTimeout=function(fn)if(!c)fn() 但它只是无限循环日志 我想通了,通过创建我自己的 setTimeout 我可以编辑函数并通过我的 setTimeout 运行它,谢谢!

以上是关于使用扩展名或其他方式在无名函数中编辑变量的主要内容,如果未能解决你的问题,请参考以下文章

EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他

DLL文件怎么打开?

使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件

JavaScript自执行函数和jquery扩展方法

在缓冲模式下打开行编辑器时检测网格上的单击

Pyhton 模块和包