Removes ads (a.k.a. sponsored posts) from feed and sidebar
// ==UserScript== // @name Facebook Hide Ads (a.k.a. sponsored posts) // @namespace https://openuserjs.org/users/burn // @version 0.5.2 // @description Removes ads (a.k.a. sponsored posts) from feed and sidebar // @author burn // @copyright 2020, burn (https://openuserjs.org/users/burn) // @license MIT // @match https://www.facebook.com/* // @match https://web.facebook.com/* // @grant none // @run-at document-idle // ==/UserScript== (function() { 'use strict'; let languages = { // thanks to Ciscoheat https://greasyfork.org/en/users/51960-ciscoheat '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': ['贊助'] }, qS = function (el, scope) { scope = (typeof scope == 'object') ? scope : document; return scope.querySelector(el) || false; }, qSall = function (els, scope) { scope = (typeof scope == 'object') ? scope : document; return scope.querySelectorAll(els) || false; }, targetNode = qS('body'), observerConfig = { attributes: false, childList: true, subtree: true }, getParentEl = function (elmChild) { return elmChild.closest('[data-pagelet^="FeedUnit_"]') || false; }, removeAdsInFeed = function (ads) { Array.prototype.forEach.call(ads, function (el) { let wrapper = getParentEl(el); if (wrapper !== false) { console.log("Found wrapper for " + el); if (wrapper.parentNode != null) wrapper.parentNode.removeChild(wrapper); else { const evt = new Event('mouseenter'); wrapper.dispatchEvent(evt); //console.log("event dispatched"); } } }); }, removeAbsoluteSpans = function (elm) { Array.prototype.forEach.call(qSall('span[style="position: absolute; top: 3em;"]', elm), function (el) { console.log("rimuovo " + el.tagName); el.parentNode.removeChild(el); }); }, callback = function (mutationsList, observer) { mutationsList.forEach(function (mutation) { var entry = { mutation: mutation, el: mutation.target, value: mutation.target.textContent, oldValue: mutation.oldValue }; removeAbsoluteSpans(entry.el); // ads in right sidebar, old fb design let ego_wrapper = qS('#pagelet_ego_pane', entry.el); if (ego_wrapper) ego_wrapper.parentNode.removeChild(ego_wrapper); /* new fb 2020 design */ let lang = languages[document.documentElement.lang] || languages.en; if (lang.indexOf(entry.value) >= 0) { //console.log("sponsored found for " + entry.el); removeAdsInFeed([entry.el]); } }); }; removeAbsoluteSpans(qS('body')); // ads in right sidebar, old fb design let ego_wrapper = qS('#pagelet_ego_pane'); if (ego_wrapper) ego_wrapper.parentNode.removeChild(ego_wrapper); var observer = new MutationObserver(callback); observer.observe(targetNode, observerConfig); })();