KN Paywall Killer

A script that removes the paywall from Kieler Nachrichten (KN+) articles by copying the article text from a window object into the body. As GreaseMonkey does not support unsafeWindow since version 4.0, this script only works with Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name KN Paywall Killer
// @name:de KN Paywall-Entferner
// @description A script that removes the paywall from Kieler Nachrichten (KN+) articles by copying the article text from a window object into the body. As GreaseMonkey does not support unsafeWindow since version 4.0, this script only works with Tampermonkey.
// @description:de Ein Skript, das die Paywall in Artikeln der Kieler Nachrichten (KN+) entfernt, indem es den Artikeltext aus einem Objekt im window in den Body kopiert. Da GreaseMonkey unsafeWindow seit Version 4.0 nicht mehr unterstützt, funktioniert dieses Skript nur mit Tampermonkey.
// @include https://www.kn-online.de/*
// @grant unsafeWindow
// @namespace Discostu36/KN-Paywall-Killer
// @run-at document-idle
// @version 2.1
// @license MIT
// ==/UserScript==

var contentObject;
if (window && window.Fusion && window.Fusion.globalContent) {
    contentObject = window.Fusion.globalContent;
} else if (unsafeWindow && unsafeWindow.Fusion && unsafeWindow.Fusion.globalContent) {
    contentObject = unsafeWindow.Fusion.globalContent;
} else {
    console.error("Konnte Paywall nicht entfernen. Fusion-Objekt nicht gefunden")
}

var ersterAbsatz = true;

console.log("Starte Paywall-Killer in 10 Sekunden");

setTimeout(() => {

    const paywall = document.querySelector(".Articlestyled__FullscreenPaywallScrollContainer-sc-l1lt3q-4");
    if (paywall) {
        removePaywall(paywall);
    } else {
        console.log("Keine paywall gefunden")
    }
}, "10000");

function removePaywall(paywall) {
    const teaserContainer = document.querySelector(".ArticleHeadstyled__ArticleTeaserContainer-sc-tdzyy5-3");
    const leadP = document.querySelector(".ArticleHeadstyled__ArticleSubHeadline-sc-tdzyy5-11");
    const articleContainer = document.querySelectorAll(".Articlestyled__CenteredContentWrapper-sc-l1lt3q-5")[1];
    const cover = articleContainer.querySelector("svg");
    paywall.remove();
    if (cover) {
        cover.remove()
    }

    leadP.classList.remove("dyhfiJ");
    leadP.style.fontWeight="600";

    // Artikel-Details-Element bauen und befüllen
    const artikelDetailsContainer = document.createElement("div");
    artikelDetailsContainer.classList.add("ArticleHeadstyled__ArticleHeadDetailsContainer-sc-tdzyy5-7", "dBklbL");
    artikelDetailsContainer.style.marginTop = "16px";
    artikelDetailsContainer.style.marginBottom ="24px";
    const artikelDetails = document.createElement("div");
    artikelDetails.classList.add("ArticleDetailsstyled__ArticleDetails-sc-26x8zr-0", "cwyyPD");
    const autorContainer = document.createElement("div");
    autorContainer.classList.add("ArticleDetailsstyled__ArticleDetailsAuthor-sc-26x8zr-1", "eyoXei");
    const autorElement = document.createElement("div");
    autorElement.classList.add("ArticleDetailsstyled__ArticleMeta-sc-26x8zr-2", "bTOgSH");
    const autorSubElement = document.createElement("div");
    autorSubElement.classList.add("ArticleMetastyled__ArticleMeta-sc-q63qyk-0", "jnFLss");
    autorSubElement.style.display = "flex";
    autorSubElement.style.alignItems = "center";


    // Avatar
    const autorAvatarContainer = document.createElement("div");
    autorAvatarContainer.classList.add("ArticleMetastyled__ArticleMetaAvatar-sc-q63qyk-1", "gCtiQB");
    autorAvatarContainer.style.marginRight ="12px";
    const autorAvatarSubContainer = document.createElement("div");
    autorAvatarSubContainer.classList.add("Avatarstyled__Avatar-sc-vo9i9b-0", "bYyBgl");
    autorAvatarSubContainer.style.width = "56px";
    autorAvatarSubContainer.style.height = "56px";
    autorAvatarSubContainer.style.border = "1px solid rgba(15, 21, 26, 0.08);";
    autorAvatarSubContainer.style.borderRadius = "50%";
    autorAvatarSubContainer.style.overflow = "hidden";


    const avatarImageContainer = document.createElement("div");
    avatarImageContainer.classList.add("Imagestyled__Container-sc-1io480m-0", "hIgPBv");
    const avatarImage = document.createElement("img");
    avatarImage.src = contentObject.authors[0].imageUrl;
    avatarImage.width="56";
    avatarImage.height="56";
    avatarImageContainer.appendChild(avatarImage);
    autorAvatarSubContainer.appendChild(avatarImageContainer);
    autorAvatarContainer.appendChild(autorAvatarSubContainer);
    autorSubElement.appendChild(autorAvatarContainer);

    // Name und Datum
    const metaDataContainer = document.createElement("div");
    metaDataContainer.classList.add("Stackstyled__Stack-sc-84d39r-0", "hCHpIZ");
    const autorNameContainer = document.createElement("address");
    autorNameContainer.classList.add("ArticleAuthorsListstyled__Authors-sc-2z414t-1", "kOeZhB", "ArticleMetastyled__ArticleMetaAuthors-sc-q63qyk-2", "IytjY", "ArticleMetaAuthors");
    autorNameContainer.style.fontSize = "14px";
    autorNameContainer.style.fontWeight = "500";
    autorNameContainer.style.lineHeight = "18px";
    autorNameContainer.style.fontFamily ="Inter, Arial-adjusted-for-Inter, Roboto-adjusted-for-Inter, sans-serif"
    const autorNameLink = document.createElement("a");
    autorNameLink.classList.add("Linkstyled__Link-sc-1y4ucbg-0", "flViNw", "ArticleAuthorsListstyled__Link-sc-2z414t-0", "iQcIZi");
    autorNameLink.href = contentObject.authors[0].url;
    autorNameLink.innerText = contentObject.authors[0].name;
    const artikelDatum = document.createElement("time");
    artikelDatum.classList.add("Timestampstyled__Timestamp-sc-moipz3-0", "gTezCK");
    artikelDatum.style.fontSize = "14px";
    artikelDatum.style.fontWeight = "400";
    artikelDatum.style.lineHeight = "18px";
    artikelDatum.style.color = "var(--ldc-52)";
    artikelDatum.style.fontFamily = "Inter, Arial-adjusted-for-Inter, Roboto-adjusted-for-Inter, sans-serif";
    const artikelZeit = new Date(contentObject.displayDate);
    artikelDatum.innerText = artikelZeit.toLocaleString() + " (UTC)";
    autorNameContainer.appendChild(autorNameLink);
    metaDataContainer.appendChild(autorNameContainer);
    metaDataContainer.appendChild(artikelDatum);
    autorSubElement.appendChild(metaDataContainer);

    // Trenner
    const headTrennerContainer = document.createElement("div");
    headTrennerContainer.classList.add("ArticleHeadstyled__ArticleDivider-sc-tdzyy5-9", "kIxNgV");
    headTrennerContainer.style.marginBottom = "24px";
    headTrennerContainer.style.marginTop = "8px";
    const headTrenner = document.createElement("div");
    headTrenner.classList.add("Dividerstyled__Divider-sc-1fznxc6-1", "eeAvvG");
    headTrennerContainer.appendChild(headTrenner);

    console.log("Füge den Detail-Header hinzu")
    autorElement.appendChild(autorSubElement);
    autorContainer.appendChild(autorElement);
    artikelDetails.appendChild(autorContainer);
    artikelDetailsContainer.appendChild(artikelDetails);
    teaserContainer.appendChild(artikelDetailsContainer);
    teaserContainer.appendChild(headTrennerContainer)


    // Artikelabsätze erstellen und einfügen
    const textElemente = contentObject.elements;
    console.log("Füge jetzt alle Text-Elemente hinzu. Es sind " + textElemente.length + " Stück")
    textElemente.forEach((element => {
        if (element.type =="text") {
            createAndAddTextElement(articleContainer, element.text);
        } else if (element.type == "header") {
            createAndAddHeaderElement(articleContainer, element.text);
        }
    }));


}

function createAndAddTextElement(articleContainer, text) {
    const textElement = document.createElement("p");
    textElement.classList.add("Textstyled__Text-sc-1cqv9mi-0", "cLyiiX");
    textElement.style.paddingBottom = "8px";
    textElement.style.paddingTop = "8px";
    textElement.style.fontFamily = '"Source Serif Pro", "Noto-adjusted-for-Source", Palatino, "Droid Serif", Times-New-Roman-adjusted-for-Source, serif';
    textElement.style.fontSize = "17px";
    textElement.style.fontWeight = "400";
    textElement.style.letterSpacing = "0px";
    textElement.style.lineHeight ="26px";
    if (ersterAbsatz) {
        const locationSpan = document.createElement("span");
        locationSpan.classList.add("LocationNamestyled__LocationName-sc-1rjppsp-0", "cksxoJ");
        locationSpan.style.fontFamily = "Inter, Arial-adjusted-for-Inter, Roboto-adjusted-for-Inter, sans-serif";
        locationSpan.style.fontSize = "16px";
        locationSpan.style.fontWeight ="600";
        locationSpan.style.letterSpacing = "0px;";
        locationSpan.style.lineHeight = "20px";
        locationSpan.innerText = contentObject.location + ". ";
        textElement.appendChild(locationSpan);
    }
    const textSpan = document.createElement("span");
    textSpan.innerHTML = text;
    textElement.appendChild(textSpan);
    articleContainer.appendChild(textElement);
    ersterAbsatz = false;
}

function createAndAddHeaderElement(articleContainer, text) {
    const headerElement = document.createElement("h2");
    headerElement.classList.add("Headlinestyled__Headline-sc-mamptc-0", "ceLWQu");
    headerElement.style.paddingBottom = "4px";
    headerElement.style.paddingTop = "8px";
    headerElement.style.color = "var(--ldc-70)";
    headerElement.style.fontFamily = '"DIN Next LT Pro", Arial-adjusted-for-DIN, Roboto-adjusted-for-DIN, sans-serif';
    headerElement.style.fontWeight = "700";
    headerElement.style.letterSpacing = "-0.25px";
    headerElement.style.fontSize = "22px";
    headerElement.style.lineHeight = "26px";
    const textNode = document.createTextNode(text);
    headerElement.appendChild(textNode);
    articleContainer.appendChild(headerElement)
}