Facebook Unsponsored

A supplement for an adblocker

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Facebook Unsponsored
// @version      3.3
// @namespace    AAAAAAAA.com
// @description  A supplement for an adblocker
// @author       ducktrshessami
// @match        *://www.facebook.com/*
// @run-at       document-end
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js
// ==/UserScript==

(function () {
    var language = document.documentElement.lang; // Borrowing some stuff from solskido's Facebook unsponsored
    var sponsorText = {
        'af': ['Geborg'],
        'am': ['የተከፈለበት ማስታወቂያ'],
        'ar': ['إعلان مُموَّل'],
        'as': ['পৃষ্ঠপোষকতা কৰা'],
        'ay': ['Yatiyanaka'],
        'az': ['Sponsor dəstəkli'],
        'be': ['Рэклама'],
        'bg': ['Спонсорирано'],
        'br': ['Paeroniet'],
        'bs': ['Sponzorirano'],
        'bn': ['সৌজন্যে'],
        'ca': ['Patrocinat'],
        'cb': ['پاڵپشتیکراو'],
        'co': ['Spunsurizatu'],
        'cs': ['Sponzorováno'],
        'cx': ['Giisponsoran'],
        'cy': ['Noddwyd'],
        'da': ['Sponsoreret'],
        'de': ['Gesponsert'],
        'el': ['Χορηγούμενη'],
        'en': ['Sponsored', 'Chartered'],
        'eo': ['Reklamo'],
        'es': ['Publicidad', 'Patrocinado'],
        'et': ['Sponsitud'],
        'eu': ['Babestua'],
        'fa': ['دارای پشتیبانی مالی'],
        'fi': ['Sponsoroitu'],
        'fo': ['Stuðlað'],
        'fr': ['Commandité', 'Sponsorisé'],
        'fy': ['Sponsore'],
        'ga': ['Urraithe'],
        'gl': ['Patrocinado'],
        'gn': ['Oñepatrosinapyre'],
        'gx': ['Χορηγούμενον'],
        'hi': ['प्रायोजित'],
        'hu': ['Hirdetés'],
        'id': ['Bersponsor'],
        'it': ['Sponsorizzata'],
        'ja': ['広告'],
        'jv': ['Disponsori'],
        'kk': ['Демеушілік көрсеткен'],
        'km': ['បានឧបត្ថម្ភ'],
        'lo': ['ໄດ້ຮັບການສະໜັບສະໜູນ'],
        'mk': ['Спонзорирано'],
        'ml': ['സ്പോൺസർ ചെയ്തത്'],
        'mn': ['Ивээн тэтгэсэн'],
        'mr': ['प्रायोजित'],
        'ms': ['Ditaja'],
        'ne': ['प्रायोजित'],
        'nl': ['Gesponsord'],
        'or': ['ପ୍ରଯୋଜିତ'],
        'pa': ['ਸਰਪ੍ਰਸਤੀ ਪ੍ਰਾਪਤ'],
        'pl': ['Sponsorowane'],
        'ps': ['تمويل شوي'],
        'pt': ['Patrocinado'],
        'ru': ['Реклама'],
        'sa': ['प्रायोजितः |'],
        'si': ['අනුග්‍රහය දක්වන ලද'],
        'so': ['La maalgeliyey'],
        'sv': ['Sponsrad'],
        'te': ['స్పాన్సర్ చేసినవి'],
        'th': ['ได้รับการสนับสนุน'],
        'tl': ['May Sponsor'],
        'tr': ['Sponsorlu'],
        'tz': ['ⵉⴷⵍ'],
        'uk': ['Реклама'],
        'ur': ['تعاون کردہ'],
        'vi': ['Được tài trợ'],
        'zh-Hans': ['赞助内容'],
        'zh-Hant': ['贊助']
    };
    var headerText = [ // Sorry this doesn't have localization. Feel free to edit this array as you see fit.
        "Coronavirus (COVID-19) Information",
        "Happening Now",
        "Paid for by",
        "Similar to Posts You've Interacted With",
        "Suggested Live",
        "Suggested Page to Follow",
        "Suggested for You",
        "Suggested Events"
    ];

    function textAssemble(elem) {
        return $(elem)
            .contents()
            .filter(function () {
            return this.nodeType == 3;
        })
            .add($("*", elem)
                 .filter(function () {
            let jq = $(this);
            return jq.is(":visible") && this.childNodes.length === 1 && this.childNodes[0].nodeType == 3 && jq.css("position") == "relative";
        })
                )
            .text();
    }

    async function hitlist() {
        list = $("span:parent:visible,div:parent:visible").filter(function () {
            if (this.getBoundingClientRect().bottom > 0) {
                let text = textAssemble(this).trim();
                return sponsorText[language].includes(text) || sponsorText[language].some(sponsor => text.includes(sponsor));
            }
        });
    }

    function side() { // Things to hide once at the start
        let foo = $(single_selector).has(list);
        if (foo.length) {
            foo.hide();
        }
    }

    function helpthething() { // Help filter posts
        if (this.getBoundingClientRect().bottom > 0) {
            let subtitle, header;
            subtitle = Boolean($(this).has(list).length);
            header = Boolean($(header_selector, this).length);
            return subtitle || header;
        }
    }

    function dothething() { // Get and hide posts
        let targets = $("[role='feed'] > div[data-pagelet]:visible").filter(helpthething);
        side();
        if (targets.length) {
            targets.remove();
            console.log("Target(s) destroyed");
        }
    }

    function withCooldown(callback, ms) {
        let ready = true;
        return function (...params) {
            if (ready) {
                ready = false;
                setTimeout(() => {
                    ready = true;
                }, ms);
                return callback(...params);
            }
        };
    }

    function main() {
        if ($("[role='feed']").length) {
            getHitlist();
            doThing();
        }
    }

    var list = $();
    var getHitlist = withCooldown(hitlist, 1000);
    var doThing = withCooldown(dothething, 500);
    var observer = new MutationObserver(main);
    var single_selector = "[data-pagelet='RightRail'] > div:visible";
    // var label_selector = sponsorText[language].map(text => "a[aria-label='" + text + "']:visible").join(", ") + ", a > span[aria-labelledby]:visible"; // Store parsed selectors for continuous use
    var header_selector = headerText.map(text => "div:first-child:not(:only-child):contains('" + text + "'):visible").join(", ");

    observer.observe(document.body, { // Wait for page change
        childList: true,
        subtree: true
    });
})();