您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Quita el paywall de varios medios de "descomunicación" de España. Información por la que no se debería pagar, ya que está manipulada en gran medida por lobbies.
// ==UserScript== // @name PayWall Buster - Spain Newspapers // @version 0.5.7 // @description Quita el paywall de varios medios de "descomunicación" de España. Información por la que no se debería pagar, ya que está manipulada en gran medida por lobbies. // @match https://elpais.com/* // @match https://*.elcorreo.com/* // @match https://*.canarias7.es/* // @match https://*.elnortedecastilla.es/* // @match https://*.larioja.com/* // @match https://*.abc.es/* // @match https://*.diariosur.es/* // @match https://*.diariovasco.com/* // @match https://*.lavanguardia.com/* // @match https://*.mujerhoy.com/* // @match https://*.hoy.es/* // @match https://*.leonoticias.com/* // @match https://*.elcomercio.es/* // @match https://*.lasprovincias.es/* // @match https://*.eldiariomontanes.es/* // @match https://*.laverdad.es/* // @match https://*.burgosconecta.es/* // @match https://*.niusdiario.es/* // @match https://*.20minutos.es/* // @match https://*.ideal.es/* // @match https://*.elperiodico.com/* // @grant none // @run-at document-start // jshint esversion: 6 // @namespace https://greasyfork.org/users/161767 // @license MIT // ==/UserScript== // Blocks paywall scripts function needsToBeBlacklisted(value, type){ let response = false; if(value !== undefined && value !== null && value.search(/p\.js/) > -1){ response = true; } return response; } const createElementBackup = document.createElement document.createElement = function(...args) { // If this is not a script tag, bypass if(args[0].toLowerCase() !== 'script') // Binding to document is essential return createElementBackup.bind(document)(...args) const scriptElt = createElementBackup.bind(document)(...args) // Backup the original setAttribute function const originalSetAttribute = scriptElt.setAttribute.bind(scriptElt) // Define getters / setters to ensure that the script type is properly set Object.defineProperties(scriptElt, { 'src': { get() { return scriptElt.getAttribute('src') }, set(value) { if(scriptElt.type !== undefined && scriptElt.type !== null && needsToBeBlacklisted(value, scriptElt.type)) { originalSetAttribute('type', 'javascript/blocked') } if(scriptElt.src !== null && scriptElt.src !== undefined) { originalSetAttribute('src', value) } return true } }, 'type': { set(value) { const src = scriptElt.src !== undefined ? scriptElt.src : ''; const type = scriptElt.type !== undefined ? scriptElt.type : ''; const typeValue = needsToBeBlacklisted(src, type) ? 'javascript/blocked' : value if(scriptElt.type !== undefined){ originalSetAttribute('type', typeValue) } return true } } }) // Monkey patch the setAttribute function so that the setter is called instead. // Otherwise, setAttribute('type', 'whatever') will bypass our custom descriptors! scriptElt.setAttribute = function(name, value) { if(name === 'type' || name === 'src') scriptElt[name] = value else HTMLScriptElement.prototype.setAttribute.call(scriptElt, name, value) } return scriptElt }