您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
🚫Blockiert Werbung/Tracking, 🔍Zoomt bei Bild-Hover mit HighRes🖼️, 💾speichert eingestellte Sortierung, ⌨️A&D für Seitennavigation, 🖥️passt die Hauptseite optisch an einen großen Monitor an
// ==UserScript== // @name Kleinanzeigen: Endlich SCHÖN & SCHNELL 🚀 // @namespace http://tampermonkey.net/ // @version 1.24 // Versionsnummer erhöht // @description 🚫Blockiert Werbung/Tracking, 🔍Zoomt bei Bild-Hover mit HighRes🖼️, 💾speichert eingestellte Sortierung, ⌨️A&D für Seitennavigation, 🖥️passt die Hauptseite optisch an einen großen Monitor an // @author just bob (mit Erweiterungen) // @match https://www.kleinanzeigen.de/* // @grant GM_setValue // @grant GM_getValue // @icon https://t1.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://kleinanzeigen.de&size=64 // @license MIT // @run-at document-start // Beibehalten, um so früh wie möglich zu starten // ==/UserScript== (function() { 'use strict'; // --- Definiere blockScriptPatterns, bevor es verwendet wird --- const blockScriptPatterns = [ /criteo\.net/, /theadex\.com/, /clarity\.ms/, /teads\.tv/, /taboola\.com/, /bing\.com/, /facebook\.net/, /creativecdn\.com/, /doubleclick\.net/, /google\.com\/adsense/, /amazon-adsystem\.com/, /fastclick\.net/, /id5-sync\.com/, /promotion-frontend/, /advertisingWebRenderer\.min\.js/, /prebid\.js/, /adblock-detection/, /liberty\.min\.js/, /GATrackingDispatcher/, /GoogleAnalyticsTags/, /gtag\/js/, /gtm\.js/, /bffstatic/, /ats-wrapper\.privacymanager\.io/, /FuEHlC\/Yum\/94H\/ZRG4AA\/uOX72DYDt9Qm\/YEZIU28\/YFAK\/LyEBG3s/ ]; // --- CSS direkt in den <head> einfügen --- const style = document.createElement('style'); style.textContent = ` /* Deine bestehenden CSS-Regeln bleiben hier unverändert */ .site-base--left-banner, .site-base--right-banner, #btf-billboard, div[data-liberty-position-name="home-billboard"], div[data-liberty-position-name="srpb-middle"], .mb-large.flex.flex-col.bg-utilityNonessential.p-small, li.ad-listitem div[data-liberty-position-name], li.ad-listitem.badge-topad.is-topad, section.rounded-xsmall.bg-surface.p-small { display: none !important; } .w-\\[700px\\] { width: 2213px !important; } .w-full { width: 173% !important; } ul.mb-large.flex.flex-wrap.justify-around.gap-small, #brws_banner-supersize, #viewad-sidebar-banner, #vip-billboard, #pstrads-atf-728x90, div.mb-medium.flex.justify-between, #feature-offer-section, #srp-skyscraper-btf { display: none !important; } div.flex.min-w-\\[_255px_\\].flex-col.gap-medium { display: block !important; } section.rounded-xsmall.bg-surface.p-small.px-xsmall.text-onSurfaceSubdued { display: block !important; } `; document.documentElement.appendChild(style); console.log("[Kleinanzeigen Script] CSS injected."); const selectorsToHideFallBack = [ '.site-base--left-banner', '.site-base--right-banner' ]; const hideDynamicElements = () => { selectorsToHideFallBack.forEach(selector => { document.querySelectorAll(selector).forEach(element => { element.style.display = 'none'; }); }); const skyscraperBtf = document.getElementById('srp-skyscraper-btf'); if (skyscraperBtf) { skyscraperBtf.style.display = 'none'; } }; const scriptObserver = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if ( node.tagName === 'SCRIPT' && node.src && blockScriptPatterns.some(pattern => pattern.test(node.src)) ) { console.log("[Kleinanzeigen Script] Blockiere Skript:", node.src); node.type = 'javascript/blocked'; if (node.parentNode) node.parentNode.removeChild(node); } }); }); }); scriptObserver.observe(document.documentElement, { childList: true, subtree: true }); const blockAlreadyLoadedScripts = () => { document.querySelectorAll('script[src]').forEach(node => { if ( blockScriptPatterns.some(pattern => pattern.test(node.src)) ) { node.type = 'javascript/blocked'; if (node.parentNode) node.parentNode.removeChild(node); } }); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runLateScripts); } else { runLateScripts(); } function runLateScripts() { blockAlreadyLoadedScripts(); function debounce(func, wait) { let timeout; return function executedFunction(...args) { clearTimeout(timeout); timeout = setTimeout(() => func(...args), wait); }; } // --- START: VERBESSERTE LOGIK FÜR "MEHR ANZEIGEN" BUTTON (schnellstmögliche Aktivierung) --- let moreButtonObserver = null; function attemptClickMoreButton() { const button = document.querySelector('div.flex.justify-center.p-small button'); console.log("[Kleinanzeigen Script] Suche nach 'Mehr anzeigen' Button."); if (button && getComputedStyle(button).display !== 'none') { console.log("[Kleinanzeigen Script] 'Mehr anzeigen' Button gefunden und geklickt (sofort)."); button.click(); // Nach dem ersten Klick den Observer trennen, da wir ihn nicht mehr brauchen if (moreButtonObserver) { moreButtonObserver.disconnect(); } return true; // Button wurde gefunden und geklickt } console.log("[Kleinanzeigen Script] 'Mehr anzeigen' Button nicht gefunden oder nicht sichtbar."); return false; // Button noch nicht gefunden } // MutationObserver, um auf das Erscheinen des Buttons zu warten moreButtonObserver = new MutationObserver(() => { console.log("[Kleinanzeigen Script] MutationObserver ausgelöst."); if (attemptClickMoreButton()) { // Wenn der Button gefunden und geklickt wurde, den Observer trennen console.log("[Kleinanzeigen Script] Button gefunden und geklickt, Observer wird getrennt."); moreButtonObserver.disconnect(); } }); // Starte den Observer so früh wie möglich moreButtonObserver.observe(document.body, { childList: true, subtree: true }); console.log("[Kleinanzeigen Script] MutationObserver gestartet."); // Versuche, den Button auch sofort zu klicken, falls er schon da ist attemptClickMoreButton(); // --- ENDE: VERBESSERTE LOGIK FÜR "MEHR ANZEIGEN" BUTTON (schnellstmögliche Aktivierung) --- const debouncedHideDynamicElements = debounce(hideDynamicElements, 300); const dynamicElementObserver = new MutationObserver(debouncedHideDynamicElements); dynamicElementObserver.observe(document.body, { childList: true, subtree: true }); // 🔍 HOCHAUFLÖSENDE BILDER ERZWINGEN function forceHighResImages() { document.querySelectorAll('li.ad-listitem img[src*="kleinanzeigen.de/api/v1/prod-ads/images/"]').forEach(img => { if (!img.src.includes('rule=$_57.AUTO')) { img.src = img.src.replace(/rule=\$_\d+\.AUTO/, 'rule=$_57.AUTO'); if (img.srcset) { img.removeAttribute('srcset'); } } }); } forceHighResImages(); const imageObserver = new MutationObserver(forceHighResImages); const adListContainer = document.querySelector('#srchrslt-adtable, .itemlist'); if (adListContainer) { imageObserver.observe(adListContainer, { childList: true, subtree: true }); } // --- NEU: Tastaturkürzel für Seitenwechsel (noch robuster, wartet auf Pagination) --- function activateKeyboardShortcuts() { document.addEventListener('keydown', function(event) { console.log("[Kleinanzeigen Script] Keydown Event ausgelöst."); const targetTagName = event.target.tagName.toLowerCase(); if (targetTagName === 'input' || targetTagName === 'textarea' || event.target.isContentEditable) { return; } const key = event.key.toLowerCase(); if (key === 'a') { // Vorherige Seite let prevElement = document.querySelector('.pagination-prev'); if (prevElement) { console.log("[Kleinanzeigen Script] 'A' gedrückt, klicke auf .pagination-prev."); console.log("[Kleinanzeigen Script] Element vor dem Klick:", prevElement); prevElement.click(); // Einfach klicken! console.log("[Kleinanzeigen Script] Element nach dem Klick:", prevElement); } } else if (key === 'd') { // Nächste Seite let nextElement = document.querySelector('.pagination-next'); if (nextElement) { console.log("[Kleinanzeigen Script] 'D' gedrückt, klicke auf .pagination-next."); console.log("[Kleinanzeigen Script] Element vor dem Klick:", nextElement); nextElement.click(); // Einfach klicken! console.log("[Kleinanzeigen Script] Element nach dem Klick:", nextElement); } } }); console.log("[Kleinanzeigen Script] Tastaturkürzel aktiviert."); } // MutationObserver, um auf das Erscheinen der Pagination-Elemente zu warten const paginationObserver = new MutationObserver((mutations, observer) => { const next = document.querySelector('.pagination-next'); if (next) { console.log("[Kleinanzeigen Script] Pagination-Element gefunden, aktiviere Tastaturkürzel."); activateKeyboardShortcuts(); observer.disconnect(); // Stoppe den Observer, sobald die Pagination gefunden wurde } }); // Starte den Observer so früh wie möglich paginationObserver.observe(document.body, { childList: true, subtree: true }); // --- NEU: Sortierung speichern und anwenden mit besserer Kontrolle --- const SORT_STORAGE_KEY = 'kleinanzeigen_preferredSortOrder'; function applySortingIfNoManualOverride() { const savedSortValue = GM_getValue(SORT_STORAGE_KEY, null); const aktuellesSortierfeldInput = document.querySelector('#sortingField-selector-value'); if (savedSortValue && aktuellesSortierfeldInput && aktuellesSortierfeldInput.value !== savedSortValue) { const zielOption = document.querySelector(`.srchresult-sorting li.selectbox-option[data-value="${savedSortValue}"]`); if (zielOption) { console.log("[Kleinanzeigen Script] Setze Sortierung auf gespeicherten Wert."); zielOption.click(); } } } function setupSortListeners() { const sortOptionsContainer = document.querySelector('.srchresult-sorting ul.selectbox-list'); if (!sortOptionsContainer || sortOptionsContainer.dataset.listenerAttached) { return; } sortOptionsContainer.dataset.listenerAttached = 'true'; const sortOptions = sortOptionsContainer.querySelectorAll('li.selectbox-option'); sortOptions.forEach(option => { option.addEventListener('click', function() { const newSortValue = this.getAttribute('data-value'); GM_setValue(SORT_STORAGE_KEY, newSortValue); console.log('[Kleinanzeigen Script] Sortierung manuell geändert und gespeichert:', newSortValue); }); }); } function initSorting() { setupSortListeners(); applySortingIfNoManualOverride(); } // Initiale Anwendung und Observer für Sortierung erst nach dem Laden window.addEventListener('load', () => { console.log("[Kleinanzeigen Script] window.load Event ausgelöst (Sortierung)."); initSorting(); const sortContainer = document.querySelector('.srchresult-sorting'); if (sortContainer) { const sortObserver = new MutationObserver(() => { console.log("[Kleinanzeigen Script] Sortierung hat sich geändert, initialisiere neu."); initSorting(); }); sortObserver.observe(sortContainer, { childList: true, subtree: true }); } }); } // Ende runLateScripts })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址