Last active
March 28, 2025 14:03
-
-
Save Kurotaku-sama/5624ebdb0290bdc95809ff1b52e60cbd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Kleinanzeigen improvements | |
// @name:de Kleinanzeigen Verbesserungen | |
// @namespace https://kurotaku.de | |
// @version 2.7.1 | |
// @description Some improvements for kleinanzeigen.de | |
// @description:de Einige Verbesserungen für kleinanzeigen.de | |
// @author Kurotaku | |
// @license CC BY-NC-SA 4.0 | |
// @match https://www.kleinanzeigen.de/* | |
// @icon https://www.kleinanzeigen.de/favicon.png | |
// @updateURL https://gist.github.com/Kurotaku-sama/5624ebdb0290bdc95809ff1b52e60cbd/raw/Kleinanzeigen%2520Verbesserungen.user.js | |
// @downloadURL https://gist.github.com/Kurotaku-sama/5624ebdb0290bdc95809ff1b52e60cbd/raw/Kleinanzeigen%2520Verbesserungen.user.js | |
// @require https://gist.github.com/Kurotaku-sama/1a7dcb227ce3d7a1b596afe725c0052a/raw/kuros_library.js | |
// @require https://cdn.jsdelivr.net/npm/sweetalert2 | |
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_addStyle | |
// @grant GM_registerMenuCommand | |
// ==/UserScript== | |
(async function () { | |
await init_gm_config(); | |
if (GM_config.get("script_enabled")) { | |
if (window.location.href.includes("p-anzeige-aufgeben")) | |
setup_html_observer(); | |
main(); | |
} | |
})(); | |
async function main(second_call = false) { | |
add_styles(); | |
if(second_call) | |
await init_gm_config(); | |
let loc = window.location.href; | |
if (GM_config.get("remove_ads")) | |
adblock(); | |
if (GM_config.get("enlarge_images")) | |
image_enlarge_preview(); | |
if (GM_config.get("show_screenshot_mode_button") && loc.includes("m-nachrichten.html")) | |
show_screenshot_mode_button(); | |
if (GM_config.get("hide_paid_features")) | |
hide_paid_features(); | |
if (GM_config.get("hide_newletter_checkbox")) | |
hide_newletter_checkbox(); | |
if (loc.includes("p-anzeige-aufgeben-schritt2.html")) | |
anzeige_aufgeben_seite(); | |
if (GM_config.get("meins_to_nachrichten")) | |
meins_to_nachrichten(); | |
if (GM_config.get("filter_active") && loc.includes("s-")) | |
filter_search_containing_words(); | |
} | |
function init_gm_config() { | |
GM_registerMenuCommand('Einstellungen', () => GM_config.open()); | |
GM_config.init( | |
{ | |
'id': 'configuration', | |
'title': 'Kleinanzeigen Verbesserungen', | |
'fields': | |
{ | |
'script_enabled': { 'type': 'checkbox', 'default': true, 'label': 'Aktiviere/Deaktiviere alle Verbesserungen', 'section': ['Allgemeine Einstellungen'] }, | |
'remove_ads': { 'type': 'checkbox', 'default': true, 'label': 'Werbungen verbergen<br>Ersetzt keinen richtigen Adblocker! Benutze zusätzlich: uBlock Origin' }, | |
'enlarge_images': { 'type': 'checkbox', 'default': true, 'label': 'Bildvergrößerung beim Hovern während der Suche' }, | |
'meins_to_nachrichten': { 'type': 'checkbox', 'default': true, 'label': 'Nachrichten statt Anzeigen bei "Meins"' }, | |
'show_screenshot_mode_button': { 'type': 'checkbox', 'default': true, 'label': 'Screenshot Modus Button aktivieren' }, | |
'hide_paid_features': { 'type': 'checkbox', 'default': false, 'label': 'Verberge fast alle bezahlbare Zusatzoptionen' }, | |
'hide_newletter_checkbox': { 'type': 'checkbox', 'default': true, 'label': 'Verberge die Newsletter anmeldung über dem "Anzeige aufgeben" Button' }, | |
'disable_auto_categorize': { 'type': 'checkbox', 'default': false, 'label': 'Deaktiviere automatische Kategorieermittlung anhand des Titels', 'section': ['"Anzeige aufgeben" Standardwerte'] }, | |
'disable_buy_now': { 'type': 'checkbox', 'default': true, 'label': 'Direkt kaufen standardmäßig deaktivieren' }, | |
'default_price': { 'label': 'Preis', 'type': 'text' }, | |
'default_price_type': { 'label': 'Preistyp', 'type': 'select', 'default': 'Festpreis', 'options': ['Festpreis', 'VB', 'Zu verschenken'] }, | |
'default_only_pickup': { 'type': 'checkbox', 'default': false, 'label': 'Standardmäßig nur Abholung' }, | |
'default_description': { 'label': 'Beschreibung', 'type': 'textarea' }, | |
'filter_active': { 'type': 'checkbox', 'default': false, 'label': 'Filterfunktion aktivieren', 'section': ['Suchfilter'] }, | |
'filter_search_containing_words': { 'label': 'Filterbegriffe (jeder Begriff ein eine neue Zeile)', 'type': 'textarea' } | |
}, | |
'events': { | |
'init': () => {GM_config.set("filter_search_containing_words", GM_config.get("filter_search_containing_words").replace(/^\s*$(?:\r\n?|\n)/gm, ""))}, // To prevent blank lines | |
'save': () => {location.reload()}, | |
}, | |
'frame': document.body.appendChild(document.createElement('div')), | |
}); | |
} | |
async function adblock() { | |
// Try 10 times to remove the ads | |
for(let i = 0; i < 10; i++) { | |
remove_single_element(".site-base--left-banner > div"); | |
remove_single_element(".site-base--right-banner > div"); | |
remove_single_element("#brws_banner-supersize"); | |
remove_single_element("#btf-billboard"); | |
remove_array_elements("[id^='liberty']"); | |
await sleep_s(1); | |
} | |
} | |
function remove_single_element(selector) { | |
document.querySelector(selector)?.remove(); | |
} | |
function remove_array_elements(selector) { | |
let elements = document.querySelectorAll(selector); | |
if(elements && elements.length > 0) | |
elements.forEach((element) => element.remove()); | |
} | |
function image_enlarge_preview() { | |
let imageboxes = document.querySelectorAll(".ad-listitem .srpimagebox img, .itemtile-fullpic .itemtile-header img"); | |
GM_addStyle(` | |
.enlarged-image | |
{display: none; height: unset !important; position: absolute; top:0; left:0; z-index: 100 !important; min-width:200px; max-width: 400px !important; max-height: 400px !important; width: fit-content !important;} | |
.itemtile-header:hover .enlarged-image | |
{max-width:300px !important; max-height:300px !important} | |
.aditem-image:hover .enlarged-image, | |
.itemtile-header:hover .enlarged-image | |
{display : block;} | |
.ad-listitem .aditem-image | |
{z-index: unset;} | |
.ad-listitem .aditem-image .imagebox.srpimagebox, | |
.itemtile-fullpic .itemtile-header | |
{overflow: unset} | |
.ad-listitem .aditem-image .imagebox.srpimagebox img, | |
.itemtile-fullpic .itemtile-header img | |
{z-index:2} | |
`); | |
imageboxes.forEach((element) => { | |
let data_imgsrc = element.getAttribute("src"); | |
if(data_imgsrc) { // Check if an image exist | |
let img_url = `${data_imgsrc.split("?")[0]}?rule=$_59.JPG`; | |
let new_element = `<img src=${img_url} class='enlarged-image'>`; | |
element.insertAdjacentHTML("beforebegin", new_element); | |
} | |
}); | |
} | |
function show_screenshot_mode_button() { // Credits go to Shirotaku who had the idea and gave me his script, I just added it here with a couple of changes | |
wait_for_element('.Messagebox .infinite-scroll-component').then(async () => { | |
let button = `<button id="button_screenshot_mode" class="Button--Body">Screenshotmodus aktivieren</button>`; | |
let top_bar = document.querySelector(".Messagebox .Messagebox--Grid--Row1"); | |
top_bar.style.paddingRight = "10px"; | |
top_bar.style.marginRight = "0%"; | |
top_bar.insertAdjacentHTML("beforeend", button); | |
document.querySelector("#button_screenshot_mode").addEventListener("click", async () => { | |
if (!document.querySelector(".Messagebox--Grid--Row2--Col1").hidden) { | |
document.querySelector(".Messagebox--Grid--Row2--Col1").hidden = true; | |
document.querySelector(".Messagebox--Grid--Row2--Col2").style.width = "100%"; | |
document.querySelector(".Messagebox--Grid--Row2").style.height = "100%"; | |
document.querySelector(".Conversation--Grid--Row3").style.height = `\"${document.querySelector(".MessageList").scrollHeight}px\"`; | |
document.querySelector("#button_screenshot_mode").innerHTML = "Screenshotmodus deaktivieren"; | |
} else { | |
document.querySelector(".Messagebox--Grid--Row2--Col1").hidden = false; | |
document.querySelector(".Messagebox--Grid--Row2").style.height = ''; | |
document.querySelector(".Messagebox--Grid--Row2--Col2").style.width = ''; | |
document.querySelector("#button_screenshot_mode").innerHTML = "Screenshotmodus aktivieren"; | |
} | |
}); | |
}); | |
} | |
function hide_paid_features() { | |
// Produktseite Box ganz oben | |
// Meine Anzeigen | |
// Anzeige aufgeben "Verkaufschance erhöhen..." | |
GM_addStyle(`#pvap-featrs #command,.manageaditem-featuretable,#postad-features {display : none;}`); | |
} | |
function hide_newletter_checkbox() { | |
GM_addStyle(`#postad-publish .l-container-row .l-row.a-double-margin.l-container-row {display : none;}`); | |
} | |
let default_values_were_added = false; | |
async function anzeige_aufgeben_seite() { | |
let disable_auto_categorize = GM_config.get("disable_auto_categorize"); | |
let disable_buy_now = GM_config.get("disable_buy_now"); | |
let default_price = GM_config.get("default_price"); | |
let default_price_type = GM_config.get("default_price_type"); | |
let default_only_pickup = GM_config.get("default_only_pickup"); | |
let default_description = GM_config.get("default_description"); | |
// Disable auto categorize with title | |
if (disable_auto_categorize) { | |
await sleep_s(1); // Delay is required sadly bcs code that adds the events start after page loaded | |
document.querySelector("#postad-title").replaceWith(document.querySelector("#postad-title").cloneNode(true)); // Clone element to remove the event | |
} | |
// Disable buy now | |
if (disable_buy_now) { | |
wait_for_element('#radio-buy-now-no').then(async () => { | |
document.querySelector("#radio-buy-now-no").click(); | |
}); | |
} | |
// Field Price | |
let field_price = document.querySelector("#pstad-price"); | |
if (!default_values_were_added && field_price) | |
field_price.value = default_price; | |
// Field Price Type | |
let field_pricetype = document.querySelector("#priceType"); | |
if (!default_values_were_added && default_price_type) { | |
let value; | |
switch(default_price_type) { | |
case "Festpreis": | |
value = "FIXED"; | |
break; | |
case "VB": | |
value = "NEGOTIABLE"; | |
break; | |
case "Zu verschenken": | |
value = "GIVE_AWAY"; | |
break; | |
default: | |
value = "FIXED"; | |
} | |
if(field_pricetype) | |
field_pricetype.value = value; | |
} | |
// Field Shipping | |
if(default_only_pickup) { | |
wait_for_element("#shipping-pickup-selector #radio-pickup").then(async () => { | |
document.querySelector("#shipping-pickup-selector #radio-pickup")?.click(); | |
}); | |
} | |
// Field Description | |
let field_description = document.querySelector("#pstad-descrptn"); | |
if (!default_values_were_added && field_description) | |
field_description.value = default_description; | |
default_values_were_added = true; | |
} | |
function meins_to_nachrichten() { | |
GM_addStyle(`#site-mainnav-my {width: 70px;}`); | |
wait_for_element('#site-mainnav-my').then(async () => { | |
document.querySelector("#site-mainnav-my-link .ka-site-mainnav--item--text").innerHTML = document.querySelector("#site-subnav-msgbox").innerHTML; | |
document.querySelector("#site-mainnav-my-link").href = document.querySelector("#site-subnav-msgbox").href; | |
}); | |
} | |
function filter_search_containing_words() { | |
let items = document.querySelectorAll(".ad-listitem"); // Get all items from page | |
let words = GM_config.get("filter_search_containing_words").split("\n"); // Get filter words as array | |
let removed_counter = 0; | |
if(words && words.length > 0 && words[0].trim() != "") { | |
items.forEach(item => { | |
let title = item.querySelector(".text-module-begin a")?.textContent.toLowerCase().trim(); // Prepare the title for check | |
for(let i = 0; i < words.length; i++) { | |
if(title?.includes(words[i].toLowerCase().trim())) { // Check if title contains a word from filter list | |
item.remove(); | |
removed_counter++; | |
break; | |
} | |
} | |
}); | |
let breadcrumb = document.querySelector(".breadcrump-summary"); | |
if(breadcrumb) | |
breadcrumb.textContent += ` | ${removed_counter} rausgefiltert`; | |
} | |
} | |
function setup_html_observer() { | |
// Überwache Änderungen am <html>-Tag | |
const observer = new MutationObserver((mutations) => { | |
for (const mutation of mutations) { | |
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) { | |
// Überprüfe, ob der <html>-Tag entfernt wurde | |
const was_html_removed = Array.from(mutation.removedNodes).some(node => node.nodeName === 'HTML'); | |
if (was_html_removed) { | |
// Warte, bis der neue <html>-Tag vorhanden ist | |
const wait_for_html = setInterval(() => { | |
if (document.documentElement) { | |
clearInterval(wait_for_html); | |
main(true) | |
} | |
}, 100); | |
} | |
} | |
} | |
}); | |
// Starte den Observer, um Änderungen am <html>-Tag zu überwachen | |
observer.observe(document.documentElement.parentNode, { childList: true }); | |
} | |
function add_styles() { | |
GM_addStyle(` | |
#configuration { | |
padding: 20px !important; | |
height: auto !important; | |
max-height: 600px !important; | |
max-width: 500px !important; | |
background: inherit !important; | |
} | |
#configuration .section_header { | |
margin-bottom: 10px !important; | |
} | |
#configuration input[type="text"] { | |
width: 50px; | |
} | |
#configuration textarea { | |
width: 100%; | |
min-height: 80px; | |
resize: vertical; | |
} | |
#configuration #configuration_resetLink { | |
color: #fff; | |
} | |
`); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment