#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!