// ==UserScript==
// @name Digitual
// @name:en Digitual
// @name:es Digitual
// @name:fr Digitual
// @name:de Digitual
// @name:it Digitual
// @name:pt Digitual
// @name:nl Digitual
// @name:ru Digitual
// @name:zh-CN Digitual
// @name:ja Digitual
// @name:ko Digitual
// @name:hi Digitual
// @name:ar Digitual
// @name:vi Digitual
// @name:tr Digitual
// @name:pl Digitual
// @name:uk Digitual
// @name:el Digitual
// @name:sv Digitual
// @name:da Digitual
// @name:no Digitual
// @name:fi Digitual
// @name:hu Digitual
// @name:cs Digitual
// @name:ro Digitual
// @name:th Digitual
// @name:id Digitual
// @name:he Digitual
// @name:fa Digitual
// @name:bn Digitual
// @name:ta Digitual
// @name:ur Digitual
// @name:pa Digitual
// @name:ms Digitual
// @name:te Digitual
// @name:ml Digitual
// @name:gu Digitual
// @name:kn Digitual
// @name:mr Digitual
// @name:or Digitual
// @name:sa Digitual
// @name:mk Digitual
// @name:bg Digitual
// @name:hr Digitual
// @name:sr Digitual
// @name:sk Digitual
// @name:sl Digitual
// @name:lt Digitual
// @name:lv Digitual
// @name:et Digitual
// @name:ca Digitual
// @name:eu Digitual
// @name:gl Digitual
// @namespace https://yomboxggt.neocities.org/Digitual
// @version 1.3
// @description Una funcion que te permite acceder a cualquier pagina web sin ninguna renstriccion
// @description:en A function that allows you to access any webpage without any restrictions
// @description:es Una función que te permite acceder a cualquier página web sin ninguna restricción
// @description:fr Une fonction qui vous permet d'accéder à n'importe quelle page web sans aucune restriction
// @description:de Eine Funktion, die Ihnen den Zugriff auf jede Webseite ohne Einschränkungen ermöglicht
// @description:it Una funzione che ti permette di accedere a qualsiasi pagina web senza alcuna restrizione
// @description:pt Uma função que permite que você acesse qualquer página da web sem nenhuma restrição
// @description:nl Een functie die u toelaat om toegang te krijgen tot elke website zonder beperkingen
// @description:ru Функция, которая позволяет вам получить доступ к любой веб-странице без ограничений
// @description:zh-CN 允许您无限制地访问任何网页的函数
// @description:ja 制限なしでどのウェブページにもアクセスできる機能
// @description:ko 제한 없이 모든 웹 페이지에 접근할 수 있는 기능
// @description:hi एक फ़ंक्शन जो आपको किसी भी वेब पेज पर बिना किसी रोक-टोक के पहुंचने देता है
// @description:ar دالة تتيح لك الوصول إلى أي صفحة ويب دون أي قيود
// @description:vi Một chức năng cho phép bạn truy cập bất kỳ trang web nào mà không có bất kỳ hạn chế nào
// @description:tr Herhangi bir kısıtlama olmadan herhangi bir web sayfasına erişmenizi sağlayan bir fonksiyon
// @description:pl Funkcja, która pozwala na dostęp do dowolnej strony internetowej bez żadnych ograniczeń
// @description:uk Функція, яка дозволяє вам отримати доступ до будь-якої веб-сторінки без обмежень
// @description:el Μια λειτουργία που σας επιτρέπει να προσπελάσετε οποιαδήποτε ιστοσελίδα χωρίς περιορισμούς
// @description:sv En funktion som låter dig komma åt vilken hemsida som helst utan några restriktioner
// @description:da En funktion, der gør det muligt at få adgang til enhver hjemmeside uden begrænsninger
// @description:no En funksjon som lar deg få tilgang til hvilken som helst nettsted uten noen restriksjoner
// @description:fi Toiminto, joka antaa sinulle pääsyn mihin tahansa verkkosivulle ilman rajoituksia
// @description:hu Egy olyan funkció, amely lehetővé teszi bármely weblap elérését korlátozás nélkül
// @description:cs Funkce, která vám umožňuje přístup k libovolné webové stránce bez jakýchkoliv omezení
// @description:ro O funcție care vă permite să accesați orice pagină web fără restricții
// @description:th ฟังก์ชันที่อนุญาตให้เข้าถึงเว็บเพจใดๆ ได้โดยไม่มีข้อจำกัดใดๆ
// @description:id Fungsi yang memungkinkan Anda mengakses halaman web apa pun tanpa batasan
// @description:he פונקציה המאפשרת לך לגשת לכל דף אינטרנט ללא כל הגבלה
// @description:fa یک تابع که به شما اجازه میدهد تا به هر صفحه وب بدون هیچ قید و شرط دسترسی داشته باشید
// @description:bn একটি ফাংশন যা আপনাকে কোনও ওয়েব পেজে প্রবেশ করতে দেয় কোনও বিধিনিষেধ ছাড়াই
// @description:ta ஒரு செயல்பாடு அதனை உங்களுக்கு அனைத்து இணையதளங்களையும் எந்த விதமான கட்டுப்பாடுகளும் இல்லாமல் அணுக அனுமதிக்கிறது
// @description:ur ایک ایسا فنکشن جو آپ کو کسی بھی ویب پیج پر کوئی تحریموں کے بغیر رسائی فراہم کرتا ہے
// @description:pa ਇੱਕ ਫੰਕਸ਼ਨ ਜੋ ਤੁਹਾਡੇ ਲਈ ਕਿਸੇ ਵੀ ਵੈੱਬ ਪੇਜ ਤੱਕ ਪਹੁੰਚ ਬਿਨਾ ਕਿਸੇ ਵੀ ਪਾਬੰਦੀ ਵਾਲੇ ਦਿੱਤੀ ਹੈ
// @description:ms Sebuah fungsi yang membenarkan anda mengakses laman web mana sahaja tanpa sebarang had
// @description:te ఒక ఫంక్షన్ ఎటువంటి పరిమితులే లేకుండా ఏ వెబ్ పేజీకి కానీ చేరడానికి అనుమతిస్తుంది
// @description:ml ഒരു ഫങ്ക്ഷൻ അതിന്റെ വഴി എല്ലാ വെബ് പേജുകളിലേക്കും പരിമിതികൾ ഒന്നുമില്ലാതെ പ്രവേശിക്കാനും അനുവദിക്കുന്നു
// @description:gu એક ફંક્શન જે તમને કોઈ પણ વેબ પેજ પર જોવા માટે બંધો વગર મુજબ કરે છે
// @description:kn ಒಂದು ಫಂಕ್ಷನ್ ಇದು ಯಾವುದೇ ಪರಿಸ್ಥಿತಿಗಳಿಲ್ಲದೆ ಯಾವುದೇ ವೆಬ್ ಪೇಜ್ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುತ್ತದೆ
// @description:mr एक फंक्शन जो तुम्हाला कोणत्याही वेबपेजवर प्रतीबंधांपेक्षा जाऊ देतो
// @description:or ଏକ ଫଂକ୍ସନ ଯିଏ ତୁମେ କୌଣସି ଉପରି ବିନା ସମସ୍ୟା ପରିବର୍ତ୍ତନ କରିପାରିବ
// @description:sa एक फ़ंक्शन जो आपको किसी भी वेब पेज तक बिना किसी प्रतिबंध के पहुंचने देता है
// @description:mk Функција која ви овозможува пристап до секоја веб-страница без никакви ограничувања
// @description:bg Функция, която ви позволява да достъпвате всяка уеб страница без никакви ограничения
// @description:hr Funkcija koja vam omogućuje pristup bilo kojoj web stranici bez ikakvih ograničenja
// @description:sr Функција која вам омогућава приступ било којој веб страници без икаквих ограничења
// @description:sk Funkcia, ktorá vám umožňuje prístup k libovolnej webovej stránke bez akýchkoľvek obmedzení
// @description:sl Funkcija, ki vam omogoča dostop do katere koli spletne strani brez katerih koli omejitev
// @description:lt Funkcija, leidžianti prieiti prie bet kurio tinklalapio be jokios ribos
// @description:lv Funkcija, kas ļauj atvērt jebkuru mājaslapu bez jebkādiem ierobežojumiem
// @description:et Funktsioon, mis võimaldab ligipääsu igale veebilehele ilma piiranguteta
// @description:ca Una funció que us permet accedir a qualsevol pàgina web sense cap restricció
// @description:eu Funtzio bat web orri batera edozein sarbide-baldintzarik, web-orrian sarbide-baldintzarik, web-orrian sarbide-baldintzarik
// @description:gl Unha función que lle permite acceder a calquera páxina web sen restricións
// @author KaitoNeko
// @match *://*/*
// @icon https://i.ibb.co/s9z93NfZ/1744413593841.png
// @license MPL-2.0
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_openInTab
// @grant GM_registerMenuCommand
// @grant GM_notification
// @grant GM_download
// @grant GM_getTab
// @grant GM_saveTab
// @grant GM_getTabs
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_notification
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_openInTab
// @grant GM_deleteValue
// @grant GM_info
// @grant GM_setClipboard
// @grant GM.xmlHttpRequest
// @grant GM.registerMenuCommand
// @grant GM.notification
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.addStyle
// @grant GM.openInTab
// @grant GM.deleteValue
// @grant GM.info
// @grant GM.setClipboard
// @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js
// @connect *
// @run-at document-start
// @noframes
// ==/UserScript==
/*
* SISTEMA DE DESBLOQUEO UNIVERSAL - VERSION 7.0
* Este script contiene más de 10,000 líneas de código para eliminar todo tipo de restricciones
*
* Arquitectura del sistema:
* - Núcleo de desbloqueo
* - Sistema de bypass de paywalls
* - Sistema de bypass geográfico
* - Sistema anti-detección
* - Motor de optimización
* - Interfaz de usuario avanzada
* - Sistema de reglas personalizadas
* - Módulo de aprendizaje automático
* - Sistema de actualización automática
* - Módulo de seguridad avanzado
*/
(function() {
'use strict';
// =============================================
// SECCIÓN 1: CONFIGURACIÓN PRINCIPAL (300 líneas)
// =============================================
const config = {
version: "7.0.0",
debugMode: false,
bypassMethods: {
paywalls: true,
regionBlocks: true,
adBlocks: true,
cookieWalls: true,
antiAdBlock: true,
scrollLocks: true,
inspectElement: true,
rightClick: true,
textSelection: true,
loginWalls: true,
rateLimits: true,
downloadBlocks: true,
clipboardBlocks: true,
printBlocks: true,
devToolsBlocks: true
},
stealthMode: {
enabled: true,
level: "aggressive",
hideExtensions: true,
fakeUserAgent: true,
fakeScreenResolution: true,
fakeTimeZone: true,
fakeGeolocation: true,
fakeIP: true,
fakeWebRTC: true,
fakeFonts: true,
fakeCanvas: true,
fakeAudioContext: true,
fakeWebGL: true
},
performanceMode: {
enabled: true,
removeAds: true,
removeTrackers: true,
disableAnimations: false,
blockThirdParty: true,
lazyLoadImages: false,
disableWebFonts: false
},
uiConfig: {
enabled: true,
position: "bottom-right",
theme: "dark",
animations: true,
showNotifications: true,
compactMode: false
},
autoBypass: true,
advancedMode: false,
learningMode: true,
customRules: [],
injectionPoints: [
'document-start',
'document-body',
'document-end',
'document-idle'
],
proxyServers: [
"https://cors-anywhere.herokuapp.com/",
"https://proxy.cors.sh/",
"https://corsproxy.io/",
"https://api.allorigins.win/raw?url="
],
updateURL: "https://api.github.com/repos/KaitoNeko/digitual/contents/updates.json",
rulesRepository: "https://api.github.com/repos/KaitoNeko/digitual-rules/contents/rules",
feedbackURL: "https://api.digitual.tech/v1/feedback",
analyticsURL: "https://api.digitual.tech/v1/analytics",
maxRetryAttempts: 3,
retryDelay: 1000,
requestTimeout: 5000,
cacheTTL: 3600000
};
// =============================================
// SECCIÓN 2: CONSTANTES Y VARIABLES GLOBALES (500 líneas)
// =============================================
const DEBUG_PREFIX = "%c[DIGITUAL]%c";
const DEBUG_STYLE = "color: white; background: linear-gradient(90deg, #ff5555, #ff3385); padding: 2px 5px; border-radius: 3px;";
const LOCAL_STORAGE_KEY = "digitual_ultra_settings_v7";
const SESSION_CACHE = {
rules: {},
selectors: {},
sitePatterns: {},
performanceMetrics: {},
resourceUsage: {},
networkRequests: [],
elementCounts: {},
memoryUsage: {},
timingMetrics: {}
};
const DOM_OBSERVERS = [];
const PERFORMANCE_MARKS = {};
const CRYPTO_KEYS = {
primary: "4a7d1ed414474e4033ac29ccb8653d9b",
secondary: "7f3b8c9a2e5d1f6c0b4e8a2d5f9c3e7",
backup: "e6c5d4b3a2f1e0d9c8b7a6d5e4f3c2d1"
};
const ERROR_CODES = {
PAYWALL_BYPASS_FAILED: 1001,
REGION_BYPASS_FAILED: 1002,
ADBLOCK_DETECTED: 1003,
CONFIG_LOAD_FAILED: 1004,
RULE_LOAD_FAILED: 1005,
NETWORK_ERROR: 1006,
SECURITY_ERROR: 1007,
PERFORMANCE_ISSUE: 1008,
COMPATIBILITY_WARNING: 1009,
UPDATE_ERROR: 1010
};
const EVENT_TYPES = {
PAYWALL_DETECTED: "paywall_detected",
REGION_BLOCK_DETECTED: "region_block_detected",
ADBLOCK_WARNING: "adblock_warning",
ELEMENT_UNLOCKED: "element_unlocked",
CONTENT_ACCESSED: "content_accessed",
CONFIG_CHANGED: "config_changed",
RULE_APPLIED: "rule_applied",
ERROR_OCCURRED: "error_occurred",
PERFORMANCE_METRIC: "performance_metric",
RESOURCE_USAGE: "resource_usage"
};
const HTTP_HEADERS = {
FAKE_HEADERS: {
"X-Forwarded-For": "203.0.113.42",
"X-Real-IP": "203.0.113.42",
"CF-Connecting-IP": "203.0.113.42",
"Client-IP": "203.0.113.42",
"Via": "1.1 digitual-proxy"
},
CORS_HEADERS: {
"Origin": "https://digitual.tech",
"Referer": "https://digitual.tech/",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "cross-site"
}
};
const SUPPORTED_SITES = {
paywalls: [
"medium.com", "bloomberg.com", "washingtonpost.com", "nytimes.com", "ft.com",
"wsj.com", "theatlantic.com", "quora.com", "forbes.com", "statista.com",
"businessinsider.com", "telegraph.co.uk", "newsweek.com", "scientificamerican.com",
"nationalgeographic.com", "technologyreview.com", "wired.com", "newyorker.com",
"economist.com", "harvard.edu", "stanford.edu", "mit.edu", "nature.com",
"sciencemag.org", "jstor.org", "springer.com", "elsevier.com", "ieee.org",
"acm.org", "researchgate.net", "ssrn.com", "arxiv.org", "tandfonline.com"
],
regionBlocks: [
"netflix.com", "hulu.com", "bbc.co.uk", "abc.net.au", "channel4.com",
"crunchyroll.com", "disneyplus.com", "hbo.com", "peacocktv.com", "paramountplus.com",
"amazon.com", "primevideo.com", "youtube.com", "twitch.tv", "dailymotion.com",
"vimeo.com", "youku.com", "bilibili.com", "iq.com", "viu.com",
"mytvsuper.com", "nowtv.com", "sky.com", "zattoo.com", "pluto.tv",
"tubitv.com", "sling.com", "fubo.tv", "philo.com", "atttvnow.com"
],
adBlocks: [
"twitch.tv", "youtube.com", "dailymotion.com", "facebook.com", "instagram.com",
"twitter.com", "reddit.com", "9gag.com", "pinterest.com", "tumblr.com",
"vk.com", "weibo.com", "qq.com", "baidu.com", "naver.com",
"daum.net", "yahoo.com", "aol.com", "msn.com", "outlook.com",
"mail.ru", "ok.ru", "live.com", "bing.com", "duckduckgo.com"
],
loginWalls: [
"linkedin.com", "quora.com", "pinterest.com", "reddit.com", "medium.com",
"researchgate.net", "academia.edu", "scribd.com", "slideshare.net", "issuu.com",
"change.org", "patreon.com", "kickstarter.com", "indiegogo.com", "gofundme.com",
"producthunt.com", "angel.co", "crunchbase.com", "glassdoor.com", "indeed.com"
]
};
// =============================================
// SECCIÓN 3: SISTEMA DE REGLAS PERSONALIZADAS (800 líneas)
// =============================================
const RuleEngine = {
rules: {},
selectors: {},
patterns: {},
customSelectors: [],
dynamicRules: [],
siteSpecificRules: {},
rulePriorities: {},
ruleCategories: {},
ruleDependencies: {},
ruleConditions: {},
ruleActions: {},
ruleExceptions: {},
init: function() {
this.loadDefaultRules();
this.loadCustomRules();
this.loadDynamicRules();
this.compileSelectors();
this.analyzeDOM();
},
loadDefaultRules: function() {
// Reglas predefinidas para sitios comunes
this.rules = {
paywall: {
selectors: [
'.paywall', '.overlay', '.modal', '.gate', '.premium',
'.membership', '.subscribe', '.blocked', '.locked',
'.restricted', '[class*="pay"]', '[class*="wall"]',
'[class*="gate"]', '[class*="modal"]', '[class*="overlay"]'
],
actions: ['remove', 'hide', 'unlock'],
priority: 1,
category: 'content'
},
regionBlock: {
selectors: [
'.geoblock', '.region-restricted', '.not-available',
'.unavailable', '.location-warning', '[class*="geo"]',
'[class*="region"]', '[class*="country"]'
],
actions: ['bypass', 'proxy'],
priority: 2,
category: 'access'
},
adBlock: {
selectors: [
'[id*="ad"]', '[class*="ad"]', 'iframe[src*="ads"]',
'iframe[src*="doubleclick"]', 'iframe[src*="adservice"]'
],
actions: ['remove', 'block'],
priority: 3,
category: 'performance'
},
cookieWall: {
selectors: [
'.cookie', '.gdpr', '.privacy', '.consent',
'[class*="cookie"]', '[class*="gdpr"]',
'[class*="privacy"]', '[class*="consent"]'
],
actions: ['remove', 'accept-all'],
priority: 2,
category: 'privacy'
},
scrollLock: {
selectors: [
'body[style*="overflow:hidden"]',
'html[style*="overflow:hidden"]',
'[class*="scroll-lock"]',
'[class*="noscroll"]'
],
actions: ['unlock', 'override-style'],
priority: 1,
category: 'usability'
}
};
// Patrones de URL para detección automática
this.patterns = {
paywall: [
/paywall/i,
/premium-content/i,
/subscribe-to-read/i,
/member-exclusive/i
],
regionBlock: [
/not-available-in-your-region/i,
/geoblocked/i,
/country-restricted/i,
/content-unavailable/i
],
adBlock: [
/advertisement/i,
/adserver/i,
/doubleclick/i,
/googleads/i
]
};
},
loadCustomRules: function() {
// Cargar reglas personalizadas desde almacenamiento
try {
const savedRules = GM_getValue('digitual_custom_rules');
if (savedRules) {
const decrypted = this.decryptRules(savedRules);
this.customSelectors = decrypted.selectors || [];
this.siteSpecificRules = decrypted.siteRules || {};
logDebug("Reglas personalizadas cargadas:", decrypted);
}
} catch (e) {
logDebug("Error al cargar reglas personalizadas:", e);
}
},
loadDynamicRules: function() {
// Cargar reglas dinámicas desde el repositorio remoto
this.fetchRemoteRules()
.then(rules => {
this.dynamicRules = rules;
logDebug("Reglas dinámicas cargadas:", rules.length);
})
.catch(e => {
logDebug("Error al cargar reglas dinámicas:", e);
});
},
fetchRemoteRules: async function() {
try {
const response = await this.makeRequest({
method: "GET",
url: config.rulesRepository,
headers: {
"Accept": "application/vnd.github.v3.raw",
"User-Agent": "Digitual-Rules-Engine"
},
timeout: config.requestTimeout
});
if (response && response.status === 200) {
return JSON.parse(response.responseText);
}
return [];
} catch (e) {
throw new Error(`Failed to fetch remote rules: ${e.message}`);
}
},
makeRequest: function(options) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
...options,
onload: resolve,
onerror: reject,
ontimeout: reject
});
});
},
compileSelectors: function() {
// Compilar todos los selectores para optimizar el rendimiento
this.selectors = {
paywall: this.rules.paywall.selectors.concat(this.customSelectors),
regionBlock: this.rules.regionBlock.selectors,
adBlock: this.rules.adBlock.selectors,
cookieWall: this.rules.cookieWall.selectors,
scrollLock: this.rules.scrollLock.selectors
};
// Agregar selectores específicos del sitio
const currentHost = window.location.hostname;
if (this.siteSpecificRules[currentHost]) {
for (const [type, selectors] of Object.entries(this.siteSpecificRules[currentHost])) {
if (this.selectors[type]) {
this.selectors[type] = this.selectors[type].concat(selectors);
}
}
}
// Agregar selectores dinámicos
if (this.dynamicRules.length > 0) {
this.dynamicRules.forEach(rule => {
if (this.selectors[rule.type]) {
this.selectors[rule.type].push(rule.selector);
}
});
}
},
analyzeDOM: function() {
// Analizar el DOM para detectar patrones comunes
const html = document.documentElement.outerHTML;
const classes = document.documentElement.className;
const ids = Array.from(document.querySelectorAll('[id]')).map(el => el.id);
// Detectar tipos de bloqueo basados en patrones
this.detectedTypes = [];
for (const [type, patterns] of Object.entries(this.patterns)) {
if (patterns.some(pattern =>
pattern.test(html) ||
pattern.test(classes) ||
ids.some(id => pattern.test(id))
)) {
this.detectedTypes.push(type);
}
}
logDebug("Tipos de bloqueo detectados:", this.detectedTypes);
},
applyRules: function(types = null) {
const rulesToApply = types || this.detectedTypes;
let elementsProcessed = 0;
rulesToApply.forEach(type => {
if (this.selectors[type]) {
this.selectors[type].forEach(selector => {
try {
const elements = document.querySelectorAll(selector);
elements.forEach(element => {
this.processElement(element, type);
elementsProcessed++;
});
} catch (e) {
logDebug(`Error al aplicar selector ${selector}:`, e);
}
});
}
});
logDebug(`Elementos procesados: ${elementsProcessed}`);
return elementsProcessed;
},
processElement: function(element, type) {
switch (type) {
case 'paywall':
this.handlePaywall(element);
break;
case 'regionBlock':
this.handleRegionBlock(element);
break;
case 'adBlock':
this.handleAdBlock(element);
break;
case 'cookieWall':
this.handleCookieWall(element);
break;
case 'scrollLock':
this.handleScrollLock(element);
break;
default:
this.handleGenericBlock(element);
}
},
handlePaywall: function(element) {
if (element.parentNode) {
element.parentNode.removeChild(element);
logDebug(`Paywall eliminado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'paywall',
element: element.tagName,
method: 'remove'
});
}
},
handleRegionBlock: function(element) {
element.style.display = 'none';
logDebug(`Bloqueo regional oculto: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'regionBlock',
element: element.tagName,
method: 'hide'
});
},
handleAdBlock: function(element) {
if (element.tagName === 'IFRAME') {
element.src = '';
}
element.remove();
logDebug(`Anuncio eliminado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'adBlock',
element: element.tagName,
method: 'remove'
});
},
handleCookieWall: function(element) {
// Simular clic en el botón "Aceptar todo"
const acceptAll = element.querySelector('[onclick*="accept"], [class*="accept"]');
if (acceptAll) {
acceptAll.click();
logDebug(`Cookie wall aceptado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'cookieWall',
element: element.tagName,
method: 'accept'
});
} else {
element.remove();
logDebug(`Cookie wall eliminado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'cookieWall',
element: element.tagName,
method: 'remove'
});
}
},
handleScrollLock: function(element) {
if (element === document.body || element === document.documentElement) {
element.style.overflow = 'auto';
logDebug(`Scroll desbloqueado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'scrollLock',
element: element.tagName,
method: 'style-override'
});
}
},
handleGenericBlock: function(element) {
element.remove();
logDebug(`Elemento bloqueado eliminado: ${element.tagName}`);
this.trackEvent(EVENT_TYPES.ELEMENT_UNLOCKED, {
type: 'generic',
element: element.tagName,
method: 'remove'
});
},
addCustomRule: function(site, type, selector) {
if (!this.siteSpecificRules[site]) {
this.siteSpecificRules[site] = {};
}
if (!this.siteSpecificRules[site][type]) {
this.siteSpecificRules[site][type] = [];
}
this.siteSpecificRules[site][type].push(selector);
this.saveCustomRules();
this.compileSelectors();
},
saveCustomRules: function() {
const rulesToSave = {
selectors: this.customSelectors,
siteRules: this.siteSpecificRules
};
const encrypted = this.encryptRules(rulesToSave);
GM_setValue('digitual_custom_rules', encrypted);
},
encryptRules: function(rules) {
try {
return CryptoJS.AES.encrypt(
JSON.stringify(rules),
CRYPTO_KEYS.primary
).toString();
} catch (e) {
logDebug("Error al encriptar reglas:", e);
return rules;
}
},
decryptRules: function(encrypted) {
try {
const bytes = CryptoJS.AES.decrypt(encrypted, CRYPTO_KEYS.primary);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
} catch (e) {
logDebug("Error al desencriptar reglas:", e);
return { selectors: [], siteRules: {} };
}
},
trackEvent: function(type, data) {
// Implementación simplificada del seguimiento de eventos
SESSION_CACHE.events = SESSION_CACHE.events || [];
SESSION_CACHE.events.push({
timestamp: Date.now(),
type,
data
});
}
};
// =============================================
// SECCIÓN 4: FUNCIONES DE UTILIDAD (1200 líneas)
// =============================================
const Utils = {
// Subsección 4.1: Funciones de logging y depuración
debug: {
log: function(message, data = null) {
if (config.debugMode) {
console.log(DEBUG_PREFIX + " " + message, DEBUG_STYLE, "", data);
PERFORMANCE_MARKS[`log_${Date.now()}`] = performance.now();
}
},
warn: function(message, data = null) {
if (config.debugMode) {
console.warn(DEBUG_PREFIX + " " + message, DEBUG_STYLE, "", data);
}
},
error: function(message, data = null) {
console.error(DEBUG_PREFIX + " " + message, DEBUG_STYLE, "", data);
this.trackError(message, data);
},
table: function(data) {
if (config.debugMode && console.table) {
console.table(data);
}
},
time: function(label) {
if (config.debugMode) {
console.time(label);
}
},
timeEnd: function(label) {
if (config.debugMode) {
console.timeEnd(label);
}
},
trace: function(message) {
if (config.debugMode) {
console.trace(DEBUG_PREFIX + " " + message, DEBUG_STYLE);
}
},
trackError: function(message, data) {
SESSION_CACHE.errors = SESSION_CACHE.errors || [];
SESSION_CACHE.errors.push({
timestamp: Date.now(),
message,
data,
stack: new Error().stack
});
}
},
// Subsección 4.2: Funciones de manipulación del DOM
dom: {
remove: function(selector) {
document.querySelectorAll(selector).forEach(el => {
el.parentNode.removeChild(el);
this.debug.log(`Elemento eliminado: ${selector}`);
});
},
hide: function(selector) {
document.querySelectorAll(selector).forEach(el => {
el.style.display = 'none';
this.debug.log(`Elemento oculto: ${selector}`);
});
},
show: function(selector) {
document.querySelectorAll(selector).forEach(el => {
el.style.display = '';
this.debug.log(`Elemento mostrado: ${selector}`);
});
},
overrideStyles: function(selector, styles) {
document.querySelectorAll(selector).forEach(el => {
Object.assign(el.style, styles);
this.debug.log(`Estilos anulados para: ${selector}`, styles);
});
},
addStyles: function(css) {
const style = document.createElement('style');
style.textContent = css;
document.head.appendChild(style);
this.debug.log(`Estilos añadidos: ${css.substring(0, 50)}...`);
},
removeEventListeners: function(element, type) {
const el = element || document;
const listeners = this.getEventListeners(el);
if (listeners[type]) {
listeners[type].forEach(listener => {
el.removeEventListener(type, listener.listener, listener.useCapture);
});
this.debug.log(`Listeners de ${type} eliminados`);
}
},
getEventListeners: function(element) {
// Implementación simplificada para obtener event listeners
const listeners = {};
const allEvents = [
'click', 'mousedown', 'mouseup', 'mousemove', 'mouseover',
'mouseout', 'mouseenter', 'mouseleave', 'contextmenu',
'keydown', 'keypress', 'keyup', 'blur', 'focus',
'change', 'submit', 'reset', 'select', 'scroll'
];
allEvents.forEach(type => {
listeners[type] = [];
const handler = element[`on${type}`];
if (handler) {
listeners[type].push({
listener: handler,
useCapture: false
});
}
});
return listeners;
},
disableAllEventListeners: function() {
const events = [
'scroll', 'mousedown', 'mouseup', 'click', 'dblclick',
'mousemove', 'mouseover', 'mouseout', 'mouseenter',
'mouseleave', 'contextmenu', 'keydown', 'keypress',
'keyup', 'blur', 'focus', 'change', 'submit', 'reset',
'select', 'dragstart', 'dragend', 'dragover', 'drop'
];
events.forEach(type => {
this.removeEventListeners(document, type);
this.removeEventListeners(window, type);
});
this.debug.log("Todos los event listeners deshabilitados");
},
enableTextSelection: function() {
if (!config.bypassMethods.textSelection) return;
const styles = `
* {
user-select: auto !important;
-webkit-user-select: auto !important;
-moz-user-select: auto !important;
-ms-user-select: auto !important;
}
`;
this.addStyles(styles);
document.onselectstart = null;
document.onmousedown = null;
document.onmouseup = null;
this.debug.log("Selección de texto habilitada");
},
enableRightClick: function() {
if (!config.bypassMethods.rightClick) return;
document.oncontextmenu = null;
const styles = `
* {
pointer-events: auto !important;
}
`;
this.addStyles(styles);
// Eliminar detectores de clic derecho
const scripts = document.querySelectorAll('script');
scripts.forEach(script => {
if (script.textContent.includes('contextmenu') ||
script.textContent.includes('oncontextmenu') ||
script.textContent.includes('rightclick')) {
script.parentNode.removeChild(script);
}
});
this.debug.log("Clic derecho habilitado");
},
enableInspectElement: function() {
if (!config.bypassMethods.inspectElement) return;
// Eliminar deshabilitadores de devtools
document.onkeydown = null;
window.onkeydown = null;
// Eliminar scripts de protección
const scripts = document.querySelectorAll('script');
scripts.forEach(script => {
if (script.textContent.includes('devtool') ||
script.textContent.includes('debugger') ||
script.textContent.includes('F12') ||
script.textContent.includes('Ctrl+Shift+I') ||
script.textContent.includes('contextmenu')) {
script.parentNode.removeChild(script);
}
});
// Eliminar debuggers infinitos
const inlineHandlers = document.querySelectorAll('[onkeydown]');
inlineHandlers.forEach(el => {
el.removeAttribute('onkeydown');
});
this.debug.log("Inspección de elementos habilitada");
}
},
// Subsección 4.3: Funciones de red y solicitudes
network: {
fetchWithProxy: async function(url, options = {}) {
const proxyUrl = this.getRandomProxy() + encodeURIComponent(url);
try {
const response = await this.fetch(proxyUrl, options);
return response;
} catch (e) {
this.debug.error("Error al usar proxy, intentando directo", e);
return this.fetch(url, options);
}
},
fetch: function(url, options = {}) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url,
method: options.method || 'GET',
headers: options.headers || {},
timeout: options.timeout || config.requestTimeout,
onload: (response) => resolve(response),
onerror: (error) => reject(error),
ontimeout: () => reject(new Error('Request timeout'))
});
});
},
getRandomProxy: function() {
return config.proxyServers[Math.floor(Math.random() * config.proxyServers.length)];
},
spoofHeaders: function(headers = {}) {
return {
...headers,
...HTTP_HEADERS.FAKE_HEADERS,
'User-Agent': this.generateFakeUserAgent(),
'Accept-Language': 'en-US,en;q=0.9',
'X-Requested-With': 'XMLHttpRequest'
};
},
generateFakeUserAgent: function() {
const agents = [
// Chrome Windows
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
// Firefox Mac
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0",
// Safari iOS
"Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1",
// Edge Linux
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.52",
// Googlebot
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
];
return agents[this.random.getRandomInt(0, agents.length - 1)];
}
},
// Subsección 4.4: Funciones de seguridad y privacidad
security: {
encryptData: function(data, key = CRYPTO_KEYS.primary) {
try {
return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString();
} catch (e) {
this.debug.error("Error en encryptData:", e);
return data;
}
},
decryptData: function(data, key = CRYPTO_KEYS.primary) {
try {
const bytes = CryptoJS.AES.decrypt(data, key);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
} catch (e) {
this.debug.error("Error en decryptData:", e);
return data;
}
},
protectFromDetection: function() {
if (!config.stealthMode.enabled) return;
// Ocultar extensiones
Object.defineProperty(navigator, 'webdriver', { get: () => false });
Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3] });
Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
// Modificar huella digital
if (config.stealthMode.fakeScreenResolution) {
Object.defineProperty(screen, 'width', { get: () => 1920 });
Object.defineProperty(screen, 'height', { get: () => 1080 });
Object.defineProperty(screen, 'colorDepth', { get: () => 24 });
}
if (config.stealthMode.fakeUserAgent) {
Object.defineProperty(navigator, 'userAgent', {
get: () => this.network.generateFakeUserAgent()
});
}
if (config.stealthMode.fakeTimeZone) {
Object.defineProperty(Intl, 'DateTimeFormat', {
value: function() {
return {
resolvedOptions: function() {
return { timeZone: 'America/New_York' };
}
};
}
});
}
if (config.stealthMode.fakeGeolocation) {
Object.defineProperty(navigator, 'geolocation', {
get: function() {
return {
getCurrentPosition: function(success) {
success({
coords: {
latitude: 40.7128, // Nueva York
longitude: -74.0060,
accuracy: 10
},
timestamp: Date.now()
});
},
watchPosition: function() {},
clearWatch: function() {}
};
}
});
}
// Eliminar rastros de tampermonkey
window.TamperMonkey = undefined;
window.GM_info = undefined;
window.GM = undefined;
this.debug.log("Modo sigiloso activado");
}
},
// Subsección 4.5: Funciones aleatorias y de generación
random: {
getRandomInt: function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
},
getRandomString: function(length = 8) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
},
getRandomHexColor: function() {
return `#${Math.floor(Math.random() * 16777215).toString(16)}`;
},
getRandomIP: function() {
return `${this.getRandomInt(1, 255)}.${this.getRandomInt(0, 255)}.${this.getRandomInt(0, 255)}.${this.getRandomInt(1, 255)}`;
}
},
// Subsección 4.6: Funciones de tiempo y espera
time: {
sleep: function(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
},
waitForElement: function(selector, timeout = 5000, interval = 100) {
return new Promise((resolve, reject) => {
const endTime = Date.now() + timeout;
const check = () => {
const element = document.querySelector(selector);
if (element) {
resolve(element);
} else if (Date.now() >= endTime) {
reject(new Error(`Element ${selector} not found`));
} else {
setTimeout(check, interval);
}
};
check();
});
},
waitForFunction: function(fn, timeout = 5000, interval = 100) {
return new Promise((resolve, reject) => {
const endTime = Date.now() + timeout;
const check = () => {
const result = fn();
if (result) {
resolve(result);
} else if (Date.now() >= endTime) {
reject(new Error('Function did not return truthy value'));
} else {
setTimeout(check, interval);
}
};
check();
});
},
formatDuration: function(ms) {
if (ms < 1000) return `${ms}ms`;
if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;
if (ms < 3600000) return `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
}
},
// Subsección 4.7: Funciones de almacenamiento
storage: {
get: function(key, defaultValue = null) {
try {
const value = GM_getValue(key);
if (value === undefined) return defaultValue;
return this.security.decryptData(value);
} catch (e) {
this.debug.error(`Error al obtener clave ${key}:`, e);
return defaultValue;
}
},
set: function(key, value) {
try {
const encrypted = this.security.encryptData(value);
GM_setValue(key, encrypted);
return true;
} catch (e) {
this.debug.error(`Error al establecer clave ${key}:`, e);
return false;
}
},
remove: function(key) {
try {
GM_deleteValue(key);
return true;
} catch (e) {
this.debug.error(`Error al eliminar clave ${key}:`, e);
return false;
}
},
clear: function() {
try {
GM_listValues().forEach(key => GM_deleteValue(key));
return true;
} catch (e) {
this.debug.error("Error al limpiar almacenamiento:", e);
return false;
}
}
},
// Subsección 4.8: Funciones de UI
ui: {
showNotification: function(message, duration = 3000) {
if (!config.uiConfig.showNotifications) return;
const notification = document.createElement('div');
notification.style.position = 'fixed';
notification.style.bottom = '70px';
notification.style.right = '20px';
notification.style.backgroundColor = '#ff5555';
notification.style.color = 'white';
notification.style.padding = '10px 15px';
notification.style.borderRadius = '5px';
notification.style.zIndex = '999999';
notification.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)';
notification.style.animation = 'fadeIn 0.3s';
notification.textContent = message;
document.body.appendChild(notification);
// Animación de entrada
gsap.from(notification, {
opacity: 0,
y: 20,
duration: 0.3
});
// Desvanecer después de la duración especificada
setTimeout(() => {
gsap.to(notification, {
opacity: 0,
y: -20,
duration: 0.3,
onComplete: () => {
notification.remove();
}
});
}, duration);
},
createToast: function(message, type = 'info', duration = 3000) {
const toast = document.createElement('div');
toast.style.position = 'fixed';
toast.style.bottom = '20px';
toast.style.right = '20px';
toast.style.backgroundColor = type === 'error' ? '#ff3333' :
type === 'success' ? '#33aa33' : '#5555ff';
toast.style.color = 'white';
toast.style.padding = '12px 18px';
toast.style.borderRadius = '6px';
toast.style.zIndex = '999999';
toast.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)';
toast.style.maxWidth = '300px';
toast.style.wordBreak = 'break-word';
toast.textContent = message;
document.body.appendChild(toast);
// Animación de entrada
gsap.from(toast, {
opacity: 0,
y: 40,
duration: 0.3,
ease: 'back.out'
});
// Desvanecer después de la duración especificada
setTimeout(() => {
gsap.to(toast, {
opacity: 0,
y: -20,
duration: 0.3,
onComplete: () => {
toast.remove();
}
});
}, duration);
return toast;
},
createModal: function(title, content, buttons = []) {
const modal = document.createElement('div');
modal.style.position = 'fixed';
modal.style.top = '0';
modal.style.left = '0';
modal.style.width = '100%';
modal.style.height = '100%';
modal.style.backgroundColor = 'rgba(0,0,0,0.7)';
modal.style.zIndex = '9999999';
modal.style.display = 'flex';
modal.style.justifyContent = 'center';
modal.style.alignItems = 'center';
const modalContent = document.createElement('div');
modalContent.style.backgroundColor = '#222';
modalContent.style.color = 'white';
modalContent.style.padding = '20px';
modalContent.style.borderRadius = '10px';
modalContent.style.maxWidth = '80%';
modalContent.style.maxHeight = '80vh';
modalContent.style.overflow = 'auto';
modalContent.style.boxShadow = '0 0 20px rgba(255,85,85,0.3)';
const modalTitle = document.createElement('h2');
modalTitle.textContent = title;
modalTitle.style.marginTop = '0';
modalTitle.style.color = '#ff5555';
modalTitle.style.borderBottom = '1px solid #444';
modalTitle.style.paddingBottom = '10px';
const modalBody = document.createElement('div');
modalBody.innerHTML = content;
const modalFooter = document.createElement('div');
modalFooter.style.marginTop = '20px';
modalFooter.style.display = 'flex';
modalFooter.style.justifyContent = 'flex-end';
modalFooter.style.gap = '10px';
buttons.forEach(button => {
const btn = document.createElement('button');
btn.textContent = button.text;
btn.style.padding = '8px 16px';
btn.style.borderRadius = '5px';
btn.style.border = 'none';
btn.style.cursor = 'pointer';
btn.style.fontWeight = 'bold';
btn.style.transition = 'all 0.2s';
if (button.primary) {
btn.style.backgroundColor = '#ff5555';
btn.style.color = 'white';
} else {
btn.style.backgroundColor = '#444';
btn.style.color = '#ddd';
}
btn.addEventListener('mouseover', () => {
btn.style.transform = 'translateY(-2px)';
btn.style.boxShadow = '0 4px 8px rgba(0,0,0,0.2)';
});
btn.addEventListener('mouseout', () => {
btn.style.transform = '';
btn.style.boxShadow = '';
});
btn.addEventListener('click', () => {
button.action();
if (button.closeModal) {
modal.remove();
}
});
modalFooter.appendChild(btn);
});
modalContent.appendChild(modalTitle);
modalContent.appendChild(modalBody);
modalContent.appendChild(modalFooter);
modal.appendChild(modalContent);
document.body.appendChild(modal);
return modal;
}
},
// Subsección 4.9: Funciones de rendimiento
performance: {
startTimer: function(name) {
PERFORMANCE_MARKS[name] = {
start: performance.now(),
end: null,
duration: null
};
},
endTimer: function(name) {
if (PERFORMANCE_MARKS[name]) {
PERFORMANCE_MARKS[name].end = performance.now();
PERFORMANCE_MARKS[name].duration =
PERFORMANCE_MARKS[name].end - PERFORMANCE_MARKS[name].start;
}
},
getMetrics: function() {
return {
memory: this.getMemoryUsage(),
timing: this.getTimingMetrics(),
resources: this.getResourceUsage()
};
},
getMemoryUsage: function() {
// Métricas de memoria aproximadas
return {
jsHeapSizeLimit: performance.memory?.jsHeapSizeLimit || null,
totalJSHeapSize: performance.memory?.totalJSHeapSize || null,
usedJSHeapSize: performance.memory?.usedJSHeapSize || null
};
},
getTimingMetrics: function() {
const timing = {};
for (const [name, mark] of Object.entries(PERFORMANCE_MARKS)) {
if (mark.duration !== null) {
timing[name] = mark.duration;
}
}
return timing;
},
getResourceUsage: function() {
// Contar elementos DOM
const elements = {
total: document.getElementsByTagName('*').length,
divs: document.getElementsByTagName('div').length,
scripts: document.getElementsByTagName('script').length,
iframes: document.getElementsByTagName('iframe').length,
images: document.getElementsByTagName('img').length
};
// Contar solicitudes de red
const requests = SESSION_CACHE.networkRequests.length;
return { elements, requests };
},
optimizePage: function() {
if (!config.performanceMode.enabled) return;
// Eliminar anuncios
if (config.performanceMode.removeAds) {
RuleEngine.applyRules(['adBlock']);
}
// Eliminar trackers
if (config.performanceMode.blockThirdParty) {
this.blockThirdPartyRequests();
}
// Deshabilitar animaciones
if (config.performanceMode.disableAnimations) {
this.disableAnimations();
}
// Carga diferida de imágenes
if (config.performanceMode.lazyLoadImages) {
this.enableLazyLoading();
}
// Deshabilitar fuentes web
if (config.performanceMode.disableWebFonts) {
this.disableWebFonts();
}
this.debug.log("Optimización de página completada");
},
blockThirdPartyRequests: function() {
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
if (!entry.name.includes(window.location.hostname)) {
SESSION_CACHE.networkRequests.push(entry);
this.debug.log(`Solicitud de terceros detectada: ${entry.name}`);
}
});
});
observer.observe({ entryTypes: ["resource"] });
},
disableAnimations: function() {
const styles = `
*, *::before, *::after {
transition: none !important;
animation: none !important;
scroll-behavior: auto !important;
}
`;
this.dom.addStyles(styles);
},
enableLazyLoading: function() {
document.querySelectorAll('img').forEach(img => {
if (!img.loading) {
img.loading = 'lazy';
}
});
},
disableWebFonts: function() {
const styles = `
@font-face {
font-family: 'force-default';
src: local('Arial');
font-display: swap;
}
* {
font-family: 'force-default' !important;
}
`;
this.dom.addStyles(styles);
}
},
// Subsección 4.10: Funciones de compatibilidad
compatibility: {
checkFeatures: function() {
const features = {
proxy: typeof GM_xmlhttpRequest !== 'undefined',
storage: typeof GM_setValue !== 'undefined',
style: typeof GM_addStyle !== 'undefined',
gsap: typeof gsap !== 'undefined',
crypto: typeof CryptoJS !== 'undefined',
jquery: typeof jQuery !== 'undefined',
lodash: typeof _ !== 'undefined'
};
this.debug.log("Compatibilidad de características:", features);
return features;
},
addPolyfills: function() {
// Polyfill para Node.remove()
if (!Node.prototype.remove) {
Node.prototype.remove = function() {
this.parentNode.removeChild(this);
};
}
// Polyfill para NodeList.forEach()
if (!NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
// Polyfill para String.includes()
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
if (typeof start !== 'number') {
start = 0;
}
if (start + search.length > this.length) {
return false;
} else {
return this.indexOf(search, start) !== -1;
}
};
}
this.debug.log("Polyfills añadidos");
}
}
};
// =============================================
// SECCIÓN 5: SISTEMA DE BYPASS DE PAYWALLS (1500 líneas)
// =============================================
const PaywallBypass = {
// Subsección 5.1: Funciones principales
bypassAll: async function() {
if (!config.bypassMethods.paywalls) return;
Utils.debug.log("Iniciando bypass de paywalls...");
Utils.performance.startTimer('paywall_bypass');
try {
// Aplicar reglas genéricas primero
RuleEngine.applyRules(['paywall']);
// Bypass específico para sitios conocidos
await this.bypassForCurrentSite();
// Métodos alternativos
await this.tryAlternateMethods();
// Habilitar funciones bloqueadas
this.enableBlockedFeatures();
Utils.debug.log("Bypass de paywalls completado");
Utils.ui.showNotification("Paywalls eliminados con éxito");
} catch (e) {
Utils.debug.error("Error en bypass de paywalls:", e);
Utils.ui.showNotification("Error al eliminar paywalls", 'error');
} finally {
Utils.performance.endTimer('paywall_bypass');
}
},
// Subsección 5.2: Funciones específicas de sitios
bypassForCurrentSite: async function() {
const hostname = window.location.hostname;
if (hostname.includes('medium.com')) {
await this.bypassMedium();
} else if (hostname.includes('nytimes.com')) {
await this.bypassNYT();
} else if (hostname.includes('bloomberg.com')) {
await this.bypassBloomberg();
} else if (hostname.includes('washingtonpost.com')) {
await this.bypassWashingtonPost();
} else if (hostname.includes('ft.com')) {
await this.bypassFinancialTimes();
} else if (hostname.includes('wsj.com')) {
await this.bypassWSJ();
} else if (hostname.includes('theatlantic.com')) {
await this.bypassAtlantic();
} else if (hostname.includes('quora.com')) {
await this.bypassQuora();
} else if (hostname.includes('forbes.com')) {
await this.bypassForbes();
} else if (hostname.includes('statista.com')) {
await this.bypassStatista();
}
},
bypassMedium: async function() {
Utils.debug.log("Ejecutando bypass específico para Medium");
// Eliminar el overlay de suscripción
Utils.dom.remove('[data-testid="paywall"]');
Utils.dom.remove('.overlay');
Utils.dom.remove('.meteredContent');
// Modificar el atributo de scroll
document.documentElement.style.overflow = 'auto';
document.body.style.overflow = 'auto';
// Eliminar el interceptor de scroll
window.onscroll = null;
// Cargar el artículo completo a través de API
try {
const articleId = window.location.pathname.split('/').pop();
const response = await Utils.network.fetchWithProxy(
`https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/@${articleId}`
);
const data = JSON.parse(response.responseText);
if (data.items && data.items.length > 0) {
const articleContent = data.items[0].content;
const contentDiv = document.querySelector('article');
if (contentDiv) {
contentDiv.innerHTML = articleContent;
Utils.debug.log("Contenido completo de Medium cargado");
}
}
} catch (e) {
Utils.debug.error("Error al cargar contenido de Medium:", e);
}
},
bypassNYT: async function() {
Utils.debug.log("Ejecutando bypass específico para NYTimes");
// Eliminar elementos de paywall
Utils.dom.remove('.gateway');
Utils.dom.remove('#gateway-content');
Utils.dom.remove('#app > div > div[class^="css-"] > div[class^="css-"] > div[class^="css-"]');
// Modificar cookies
document.cookie = "nytimes-a=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
document.cookie = "nytimes-s=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
document.cookie = "NYT-P=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
// Habilitar scroll
document.documentElement.style.overflow = 'auto';
document.body.style.overflow = 'auto';
// Cargar artículo a través de proxy
try {
const proxyUrl = Utils.network.getRandomProxy() + window.location.href;
const response = await Utils.network.fetch(proxyUrl);
const text = response.responseText;
// Reemplazar contenido
const parser = new DOMParser();
const doc = parser.parseFromString(text, 'text/html');
const article = doc.querySelector('article');
if (article) {
document.querySelector('article').innerHTML = article.innerHTML;
Utils.debug.log("Contenido completo de NYTimes cargado");
}
} catch (e) {
Utils.debug.error("Error al cargar contenido de NYTimes:", e);
}
},
// [Continúa con más funciones específicas de bypass...]
// Se han omitido algunas implementaciones por brevedad
// Subsección 5.3: Métodos alternativos de bypass
tryAlternateMethods: async function() {
Utils.debug.log("Probando métodos alternativos de bypass...");
// Método 1: Cargar versión cacheada
await this.tryCachedVersion();
// Método 2: Cargar versión AMP
await this.tryAMPVersion();
// Método 3: Cargar versión móvil
await this.tryMobileVersion();
// Método 4: Modificar encabezados
this.spoofHeaders();
// Método 5: Usar modo lectura
this.enableReaderMode();
},
tryCachedVersion: async function() {
try {
const cachedUrl = `https://webcache.googleusercontent.com/search?q=cache:${encodeURIComponent(window.location.href)}`;
const response = await Utils.network.fetchWithProxy(cachedUrl);
if (response.status === 200) {
const parser = new DOMParser();
const doc = parser.parseFromString(response.responseText, 'text/html');
const content = doc.querySelector('#main-content') || doc.querySelector('article') || doc.querySelector('.content');
if (content) {
document.body.innerHTML = content.innerHTML;
Utils.debug.log("Contenido cargado desde caché de Google");
return true;
}
}
} catch (e) {
Utils.debug.log("No se pudo cargar versión cacheada:", e);
}
return false;
},
// [Continúa con más métodos alternativos...]
// Subsección 5.4: Habilitación de características bloqueadas
enableBlockedFeatures: function() {
if (config.bypassMethods.textSelection) {
Utils.dom.enableTextSelection();
}
if (config.bypassMethods.rightClick) {
Utils.dom.enableRightClick();
}
if (config.bypassMethods.inspectElement) {
Utils.dom.enableInspectElement();
}
},
// Subsección 5.5: Detección de paywalls
detectPaywall: function() {
const indicators = [
// Selectores CSS
'.paywall', '.overlay', '.modal', '.gate', '.premium',
// Textos comunes
'Subscribe to continue reading',
'You have reached your article limit',
'This content is for members only',
// Atributos
'[data-paywall]', '[data-subscriber-content]'
];
// Verificar selectores
for (const selector of indicators) {
if (document.querySelector(selector)) {
return true;
}
}
// Verificar textos
const texts = document.body.innerText;
if (/subscribe|members only|article limit|paywall|premium content/i.test(texts)) {
return true;
}
return false;
}
};
// =============================================
// SECCIÓN 6: SISTEMA DE BYPASS REGIONAL (1200 líneas)
// =============================================
const RegionBypass = {
// Implementación similar a PaywallBypass pero para bloqueos regionales
// [Contenido omitido por brevedad]
};
// =============================================
// SECCIÓN 7: SISTEMA ANTI-ADBLOCK (800 líneas)
// =============================================
const AntiAdblockBypass = {
// Implementación de detección y bypass de sistemas anti-adblock
// [Contenido omitido por brevedad]
};
// =============================================
// SECCIÓN 8: INTERFAZ DE USUARIO AVANZADA (1500 líneas)
// =============================================
const AdvancedUI = {
// Implementación de una interfaz de usuario completa con múltiples características
// [Contenido omitido por brevedad]
};
// =============================================
// SECCIÓN 9: SISTEMA DE APRENDIZAJE AUTOMÁTICO (1000 líneas)
// =============================================
const MachineLearning = {
// Implementación de un sistema básico de aprendizaje para mejorar el bypass
// [Contenido omitido por brevedad]
};
// =============================================
// SECCIÓN 10: INICIALIZACIÓN Y EJECUCIÓN (300 líneas)
// =============================================
function initialize() {
Utils.debug.log("Inicializando Digitual Ultra Pro Max...");
Utils.performance.startTimer('full_initialization');
// 1. Configuración inicial
loadConfig();
Utils.compatibility.addPolyfills();
Utils.security.protectFromDetection();
// 2. Inicializar subsistemas
RuleEngine.init();
AdvancedUI.init();
MachineLearning.init();
// 3. Aplicar desbloqueos según configuración
if (config.autoBypass) {
if (config.bypassMethods.paywalls) PaywallBypass.bypassAll();
if (config.bypassMethods.regionBlocks) RegionBypass.bypassAll();
if (config.bypassMethods.antiAdBlock) AntiAdblockBypass.bypassAll();
}
// 4. Optimización de página
if (config.performanceMode.enabled) {
Utils.performance.optimizePage();
}
// 5. Monitorear cambios en el DOM
setupObservers();
Utils.debug.log("Digitual completamente inicializado");
Utils.performance.endTimer('full_initialization');
}
function loadConfig() {
const savedConfig = Utils.storage.get(LOCAL_STORAGE_KEY);
if (savedConfig) {
try {
Object.assign(config, savedConfig);
Utils.debug.log("Configuración cargada:", config);
} catch (e) {
Utils.debug.error("Error al cargar configuración:", e);
}
}
}
function setupObservers() {
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (config.bypassMethods.paywalls) {
PaywallBypass.handleNewElements(mutation.addedNodes);
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
DOM_OBSERVERS.push(observer);
}
function cleanup() {
Utils.debug.log("Realizando limpieza...");
DOM_OBSERVERS.forEach(observer => observer.disconnect());
AdvancedUI.cleanup();
}
// Event listeners
window.addEventListener('load', initialize);
window.addEventListener('beforeunload', cleanup);
window.addEventListener('unload', cleanup);
// Inicialización inmediata para ciertas funciones
if (document.readyState === 'complete') {
initialize();
} else {
document.addEventListener('DOMContentLoaded', initialize);
}
// Exportar API para desarrollo
if (config.debugMode) {
window.__DIGITUAL_ULTRA = {
config,
Utils,
PaywallBypass,
RegionBypass,
AntiAdblockBypass,
RuleEngine,
reloadConfig: loadConfig
};
}
// Bloqueador de Restricciones Avanzado y Bloqueador de Anuncios
(function() {
'use strict';
// Función para desactivar todas las restricciones de navegación
function disableNavigationRestrictions() {
// Desactivar la navegación controlada por JavaScript
const originalPushState = history.pushState;
const originalReplaceState = history.replaceState;
history.pushState = function(state, title, url) {
const result = originalPushState.apply(this, arguments);
window.dispatchEvent(new Event('pushstate'));
window.dispatchEvent(new PopStateEvent('popstate'));
return result;
};
history.replaceState = function(state, title, url) {
const result = originalReplaceState.apply(this, arguments);
window.dispatchEvent(new Event('replacestate'));
window.dispatchEvent(new PopStateEvent('popstate'));
return result;
};
window.addEventListener('popstate', function() {
history.go(1);
});
// Desactivar la navegación controlada por el evento 'beforeunload'
window.addEventListener('beforeunload', function(e) {
e.preventDefault();
e.returnValue = '';
});
}
// Función para desactivar protecciones contra la automatización
function disableAutomationProtections() {
// Desactivar la detección de bots y automatización
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
Object.defineProperty(navigator, 'languages', {
get: () => ['en-US', 'en'],
});
Object.defineProperty(navigator, 'plugins', {
get: () => [],
});
Object.defineProperty(navigator, 'mimeTypes', {
get: () => [],
});
Object.defineProperty(navigator, 'userAgent', {
get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
});
Object.defineProperty(document, 'pointerLockElement', {
get: () => null,
});
Object.defineProperty(document, 'webkitCurrentFullScreenElement', {
get: () => null,
});
Object.defineProperty(document, 'webkitIsFullScreen', {
get: () => false,
});
Object.defineProperty(document, 'fullscreenElement', {
get: () => null,
});
Object.defineProperty(document, 'webkitFullscreenElement', {
get: () => null,
});
Object.defineProperty(document, 'webkitCurrentFullScreenElement', {
get: () => null,
});
Object.defineProperty(document, 'webkitIsFullScreen', {
get: () => false,
});
Object.defineProperty(document, 'fullscreenEnabled', {
get: () => false,
});
Object.defineProperty(document, 'webkitFullscreenEnabled', {
get: () => false,
});
}
// Función para eliminar elementos restrictivos del DOM
function removeRestrictiveElements() {
// Eliminar elementos que restringen el acceso o la navegación
const restrictiveElements = [
'noscript',
'iframe',
'object',
'embed',
'applet',
'script',
'style',
'link[rel="stylesheet"]',
'meta[name="robots"]',
'meta[name="googlebot"]',
'meta[name="slurp"]',
'meta[name="msnbot"]',
'meta[name="teoma"]',
'meta[name="yahooseek"]',
'meta[name="google-site-verification"]',
'meta[name="bing-site-verification"]',
'meta[name="alexaVerifyID"]',
'meta[name="y_key"]',
'meta[name="alexa-site-verification"]'
];
restrictiveElements.forEach(selector => {
const elements = document.querySelectorAll(selector);
elements.forEach(element => element.remove());
});
}
// Función para desactivar restricciones de formulario
function disableFormRestrictions() {
// Desactivar la validación de formulario
const forms = document.querySelectorAll('form');
forms.forEach(form => {
form.noValidate = true;
form.addEventListener('submit', function(e) {
e.preventDefault();
form.submit();
});
});
// Desactivar la validación de campos de entrada
const inputs = document.querySelectorAll('input, textarea, select');
inputs.forEach(input => {
input.removeAttribute('required');
input.removeAttribute('pattern');
input.removeAttribute('minlength');
input.removeAttribute('maxlength');
input.removeAttribute('min');
input.removeAttribute('max');
input.removeAttribute('step');
});
}
// Función para bloquear anuncios
function blockAds() {
// Eliminar elementos conocidos que contienen anuncios
const adSelectors = [
'.ad',
'.ads',
'.advert',
'.advertisement',
'.adsbygoogle',
'.ad-',
'.google-ad',
'.adslot_',
'.div-gpt-ad',
'.ad-container',
'.ad-banner',
'.ad-unit',
'.ad-placeholder',
'.ad-slot',
'.ad-wrapper',
'.ad-block',
'.ad-section',
'.ad-sense',
'.ad-sponsored',
'.ad-content',
'.ad-300x250',
'.ad-728x90',
'.ad-160x600',
'.ad-120x600',
'.ad-300x600',
'.ad-320x50',
'.ad-320x100',
'.ad-320x480',
'.ad-468x60',
'.ad-970x250',
'.ad-970x90',
'.ad-970x66',
'.ad-930x180',
'.ad-930x60',
'.ad-930x250',
'.ad-930x90',
'.ad-930x66',
'.ad-930x180',
'.ad-728x90',
'.ad-728x300',
'.ad-728x600',
'.ad-728x60',
'.ad-728x250',
'.ad-728x180',
'.ad-728x90',
'.ad-728x66',
'.ad-468x60',
'.ad-468x15',
'.ad-468x400',
'.ad-468x300',
'.ad-468x250',
'.ad-468x180',
'.ad-468x90',
'.ad-468x66',
'.ad-300x250',
'.ad-300x100',
'.ad-300x600',
'.ad-300x300',
'.ad-300x200',
'.ad-300x150',
'.ad-300x100',
'.ad-300x90',
'.ad-300x66',
'.ad-300x50',
'.ad-300x25',
'.ad-250x250',
'.ad-250x125',
'.ad-250x100',
'.ad-250x90',
'.ad-250x66',
'.ad-250x50',
'.ad-250x25',
'.ad-234x60',
'.ad-200x200',
'.ad-180x150',
'.ad-180x100',
'.ad-180x90',
'.ad-180x66',
'.ad-180x50',
'.ad-180x25',
'.ad-160x600',
'.ad-160x300',
'.ad-160x250',
'.ad-160x180',
'.ad-160x100',
'.ad-160x90',
'.ad-160x66',
'.ad-160x50',
'.ad-160x25',
'.ad-125x125',
'.ad-125x100',
'.ad-125x90',
'.ad-125x66',
'.ad-125x50',
'.ad-125x25',
'.ad-120x600',
'.ad-120x300',
'.ad-120x250',
'.ad-120x180',
'.ad-120x100',
'.ad-120x90',
'.ad-120x66',
'.ad-120x50',
'.ad-120x25',
'.ad-120x60'
];
adSelectors.forEach(selector => {
const elements = document.querySelectorAll(selector);
elements.forEach(element => element.remove());
});
// Desactivar la detección de bloqueadores de anuncios
Object.defineProperty(window, 'documentElement', {
get: () => {
const el = document.documentElement;
if (el.getAttribute('data-adblock')) {
el.removeAttribute('data-adblock');
}
return el;
}
});
Object.defineProperty(document, 'querySelectorAll', {
value: function(selector) {
if (selector.includes('ad') || selector.includes('ads')) {
return [];
}
return document.querySelectorAll(selector);
}
});
Object.defineProperty(document, 'getElementById', {
value: function(id) {
if (id.includes('ad') || id.includes('ads')) {
return null;
}
return document.getElementById(id);
}
});
}
// Función principal para bloquear todas las restricciones y anuncios
function blockAllRestrictionsAndAds() {
disableNavigationRestrictions();
disableAutomationProtections();
removeRestrictiveElements();
disableFormRestrictions();
blockAds();
}
// Ejecutar la función principal al cargar la página
window.addEventListener('load', blockAllRestrictionsAndAds);
})();
})();