Neu: MuchoHentai: Popup-Blocker
This commit is contained in:
149
muchohentai-popup-blocker.user.js
Normal file
149
muchohentai-popup-blocker.user.js
Normal file
@@ -0,0 +1,149 @@
|
||||
// ==UserScript==
|
||||
// @name MuchoHentai: Popup-Blocker
|
||||
// @namespace https://git.ponywave.de/Akamaru/Userscripts
|
||||
// @version 1.0
|
||||
// @description Blockiert nervige Popup-Werbung die sich bei jedem Klick öffnet
|
||||
// @author Akamaru
|
||||
// @match *://muchohentai.com/*
|
||||
// @match *://*.muchohentai.com/*
|
||||
// @grant none
|
||||
// @run-at document-start
|
||||
// @updateURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/muchohentai-popup-blocker.user.js
|
||||
// @downloadURL https://git.ponywave.de/Akamaru/Userscripts/raw/branch/master/muchohentai-popup-blocker.user.js
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// Liste der bekannten Ad-Domains die blockiert werden sollen
|
||||
const adDomains = [
|
||||
'browsecoherentunrefined.com',
|
||||
'guidepaparazzisurface.com',
|
||||
'earmuffpostnasalrisotto.com',
|
||||
'szubtepzaka.com'
|
||||
];
|
||||
|
||||
// ===== STRATEGIE 1: Globale Ad-Funktionen überschreiben =====
|
||||
// Diese Funktionen werden von den Ad-Scripts aufgerufen
|
||||
window.kjjzn = function() { console.log('[Popup-Blocker] kjjzn blocked'); };
|
||||
window.inwwhfk = function() { console.log('[Popup-Blocker] inwwhfk blocked'); };
|
||||
window.vaujj = function() { console.log('[Popup-Blocker] vaujj blocked'); };
|
||||
|
||||
// ===== STRATEGIE 2: window.open() überschreiben =====
|
||||
const originalOpen = window.open;
|
||||
window.open = function(url, name, features) {
|
||||
// Prüfe ob die URL zu einer Ad-Domain gehört
|
||||
if (url) {
|
||||
const urlStr = url.toString().toLowerCase();
|
||||
for (const domain of adDomains) {
|
||||
if (urlStr.includes(domain)) {
|
||||
console.log('[Popup-Blocker] Blocked popup to:', url);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Erlaube nur window.open() Aufrufe mit explizitem User-Intent
|
||||
// (z.B. wenn es keine Features angegeben sind, ist es vermutlich ein Popup)
|
||||
if (!features && name !== '_blank') {
|
||||
console.log('[Popup-Blocker] Blocked suspicious window.open()');
|
||||
return null;
|
||||
}
|
||||
|
||||
// Erlaube legitime window.open() Aufrufe
|
||||
return originalOpen.call(window, url, name, features);
|
||||
};
|
||||
|
||||
// ===== STRATEGIE 3: Click-Event-Schutz =====
|
||||
// Fange alle Click-Events in der Capture-Phase ab und prüfe auf verdächtiges Verhalten
|
||||
let lastClickTime = 0;
|
||||
let clickCount = 0;
|
||||
|
||||
document.addEventListener('click', function(event) {
|
||||
const now = Date.now();
|
||||
|
||||
// Reset Counter nach 1 Sekunde
|
||||
if (now - lastClickTime > 1000) {
|
||||
clickCount = 0;
|
||||
}
|
||||
|
||||
lastClickTime = now;
|
||||
clickCount++;
|
||||
|
||||
// Wenn mehrere window.open() Aufrufe in kurzer Zeit erfolgen, blockiere sie
|
||||
const originalOpen = window.open;
|
||||
let openCallCount = 0;
|
||||
|
||||
window.open = function(...args) {
|
||||
openCallCount++;
|
||||
|
||||
if (openCallCount > 1) {
|
||||
console.log('[Popup-Blocker] Multiple window.open() calls detected and blocked');
|
||||
window.open = originalOpen;
|
||||
return null;
|
||||
}
|
||||
|
||||
// Wiederherstellung nach kurzem Timeout
|
||||
setTimeout(() => {
|
||||
window.open = originalOpen;
|
||||
openCallCount = 0;
|
||||
}, 100);
|
||||
|
||||
return originalOpen.apply(this, args);
|
||||
};
|
||||
}, true); // true = Capture-Phase (vor normalen Event-Handlern)
|
||||
|
||||
// ===== STRATEGIE 4: Ad-Scripts blockieren =====
|
||||
// MutationObserver um dynamisch eingefügte Scripts zu entfernen
|
||||
const observer = new MutationObserver(function(mutations) {
|
||||
mutations.forEach(function(mutation) {
|
||||
mutation.addedNodes.forEach(function(node) {
|
||||
if (node.nodeName === 'SCRIPT' && node.src) {
|
||||
const src = node.src.toLowerCase();
|
||||
|
||||
// Prüfe ob das Script von einer Ad-Domain kommt
|
||||
for (const domain of adDomains) {
|
||||
if (src.includes(domain)) {
|
||||
console.log('[Popup-Blocker] Blocked script from:', node.src);
|
||||
node.remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Prüfe auf verdächtige Data-Attribute (von Ad-Networks verwendet)
|
||||
if (node.hasAttribute('data-clocid') || node.hasAttribute('data-clbaid')) {
|
||||
console.log('[Popup-Blocker] Blocked ad script with data attributes');
|
||||
node.remove();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Starte Observer sobald das DOM verfügbar ist
|
||||
if (document.documentElement) {
|
||||
observer.observe(document.documentElement, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
} else {
|
||||
window.addEventListener('DOMContentLoaded', function() {
|
||||
observer.observe(document.documentElement, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ===== STRATEGIE 5: Popunder-Schutz =====
|
||||
// Verhindere dass das aktuelle Fenster im Hintergrund verschoben wird (Popunder-Technik)
|
||||
window.addEventListener('blur', function() {
|
||||
// Wenn ein neues Fenster geöffnet wurde und das aktuelle in den Hintergrund geht,
|
||||
// hole den Fokus zurück
|
||||
setTimeout(function() {
|
||||
window.focus();
|
||||
}, 100);
|
||||
});
|
||||
|
||||
console.log('[Popup-Blocker] MuchoHentai Popup-Blocker aktiviert');
|
||||
})();
|
||||
Reference in New Issue
Block a user