Редактировать переменную внутри безымянной функции с помощью расширения или другими способами

#javascript #html #greasemonkey #tampermonkey #userscripts

Вопрос:

На веб-сайте, который я использую, есть тайм-аут, который регистрирует что-то в консоли и снова вызывает себя. Пример:

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

Используя эту безымянную функцию, сайт делает свои переменные недоступными через консоль.

Единственный способ обойти это-зайти на вкладку «Источник» и отредактировать сам сценарий: введите описание изображения здесь

Проблема в том, что этот процесс необходимо выполнять каждый раз, когда страница загружается, и я хочу создать пользовательский скрипт или что-то в этом роде, чтобы сделать это автоматически. Некоторое время назад кто-то сказал мне, что есть вещь, которая может редактировать сценарий до загрузки страницы, и я просто забыл ее название.

разрешение:

«Вещь», которая позволяет редактировать сценарии до их загрузки, — это переопределение ресурсов, но через некоторое время я просто переназначил, поэтому на этот раз я не использовал его, вместо этого я создал свой собственный пользовательский скрипт, и вот результат:

С помощью @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();
    }
}; 

Спасибо всем!

Комментарии:

1. Возможно, «давным-давно» было, когда Firefox был вещью… мы могли бы использовать событие beforescriptexecute

2. есть … подумайте о том, чтобы захватить глобалы, которые использует функция ;3

3. я предполагаю, что ты пытаешься вмешаться, times верно?

4. @bravo, я использовал этот метод в пользовательском скрипте greasemonkey, чтобы удалить часть сценариев или заблокировать сценарии до их выполнения.

5. @vanowm — да, конечно — вы один из 6 человек, которые все еще используют Firefox, теперь нам нужно найти остальных 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() 

Комментарии:

1. это остановило интервал, но отчасти нарушило остальную часть кода, что я хочу, чтобы я мог отредактировать сценарий перед загрузкой страницы

2. Потому что другие вещи в коде, выходящие за рамки этой функции, зависят от параметра setTimeout

3. Есть ли способ выполнить функцию внутри ремоделирования setTimeout без создания самоцикла? я просто попробовал: setTimeout=function(fn){if(!c){fn()}} но это просто бесконечно зацикливает журнал

4. Я изобразил это, создав свой собственный setTimeout, я могу отредактировать функцию и запустить ее через свой setTimeout, THX!