Estoy tratando de omitir un temporizador de cuenta regresiva de 60 segundos usando Tampermonkey. Este es el JavaScript de la fuente de la página:
var sec = 60, sInt, s = 'Please wait %s before downloading.'; function countDown() { var f = $('#download'); if (sec < 0) { d.html('<div style="margin: 10px auto" class="center"><form action="" method="post">\ <input type="hidden" name="hash" value="REMOVED">\ <div id="REMOVED" style="width:450px;margin:5px auto"></div> \ <input type="submit" class="submit" value="Get download link" name="download"> \ </form></div>'); hcaptcha.render('REMOVED', { 'sitekey': 'REMOVED' }); clearInterval(sInt); return; } d.html(s.replace('%s', sec +' second'+ (sec != 1 ? 's' : ''))); sec--; } $(function() { sInt = setInterval(countDown, 1150); });(algunos elementos fueron sustituidos con 'ELIMINAR' pero no deberían tener efecto, no creo)
Hasta ahora he intentado lo siguiente pero no funcionó:
// ==/UserScript== (function() { 'use strict'; var sec = 0; })();¿Alguna sugerencia para hacer que esto funcione? Creo que cualquiera de estos dos métodos funcionaría, pero no estoy seguro de cómo hacerlo:
Entonces, ¿se puede hacer cualquiera de los dos? Si es así, ¿cómo puedes hacerlo?
El problema probable es que la declaración de sec esté en un ámbito diferente al declarado en el sec del sitio web. Como resultado, no está configurando el valor en el mismo sec .
sec mutante Deberá averiguar si es posible realizar manipulaciones en el mismo ámbito en el que el sitio web declara sec . Esto solo es realmente posible si el autor del sitio web ha declarado sec en el ámbito global. Si lo han declarado en el alcance global haciendo window.sec = -1; Deberia trabajar. De lo contrario, es posible que deba manipular el temporizador.
La manipulación de temporizadores puede ser una gran tarea. Eche un vistazo a sinonjs/fake-timers para ver qué complejidad podría estar involucrada. No creo que una solución tan compleja sea necesaria para lo que quiere aquí, así que simplemente manipulemos el temporizador secuestándolo. Lo siguiente secuestrará setInterval y hará que los intervalos se ejecuten (lo más cerca posible) de inmediato. Se debe tener cuidado al usar esto porque si hay un intervalo que nunca se borra y realiza tareas intensivas de memoria, entonces podría bloquear su navegador/computadora.
const hijackedInterval = window.setInterval; window.setInterval = (fn) => { return hijackedInterval(fn, 0); }; A continuación se muestra una demostración. Hay dos expresiones de función invocadas inmediatamente para demostrar diferentes ámbitos. El primero realiza el secuestro de setInterval . El segundo es un contador que se incrementa cada segundo. Una vez que hayan pasado 10 segundos DONE! debe registrarse en la consola. Sin embargo, como hemos secuestrado setInterval , el registro se produce de inmediato.
(() => { const hijackedInterval = window.setInterval; window.setInterval = (fn) => { return hijackedInterval(fn, 0); }; })(); (() => { let counter = 0; let intervalId; intervalId = setInterval(() => { if (counter === 10) { clearInterval(intervalId); console.log('DONE!'); return; } else { counter++; } }, 1000); })();