Skip to content

Instantly share code, notes, and snippets.

@Kurotaku-sama
Last active March 28, 2025 14:03
Show Gist options
  • Save Kurotaku-sama/5624ebdb0290bdc95809ff1b52e60cbd to your computer and use it in GitHub Desktop.
Save Kurotaku-sama/5624ebdb0290bdc95809ff1b52e60cbd to your computer and use it in GitHub Desktop.
// ==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