Created
November 29, 2024 17:02
-
-
Save shreve/06236352ef639642991d9097636c4f43 to your computer and use it in GitHub Desktop.
Facebook Junk Autoblock
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 Junk Autoblock | |
// @namespace Violentmonkey Scripts | |
// @match https://www.facebook.com/* | |
// @grant none | |
// @version 1.0 | |
// @author violet.codes | |
// @description Delete "suggested" items from your timeline | |
// ==/UserScript== | |
const itemSelector = ".x9f619.x78zum5.x1r8uery.xdt5ytf.x1iyjqo2.xs83m0k.x1e558r4.x150jy0e.x1iorvi4.xjkvuk6.xnpuxes.x291uyu.x1uepa24" | |
const list = (el) => { return Array.prototype.slice.apply(el) }; | |
let timelineContainer; | |
const S = (selector) => { | |
return list(document.querySelectorAll(selector)); | |
} | |
const deleteElement = (el) => { | |
if (!el) return; | |
try { | |
console.debug("Deleting element", el.innerText, el); | |
el.parentElement.removeChild(el); | |
} catch (e) { | |
console.error("Failed to delete element", el, "due to error", e); | |
} | |
} | |
const deletePost = (child) => { | |
try { | |
let parent = child.closest('.timeline > .x1lliihq'); | |
if (parent?.parentElement == timelineContainer) { | |
deleteElement(parent); | |
} else { | |
console.debug("This element doesn't look like a post", child); | |
} | |
} catch (e) { | |
console.error("Failed to delete post", child, "due to error", e); | |
} | |
} | |
const run = () => { | |
if (!timelineContainer) { | |
let title = S('h3').filter((el) => el.innerText == "News Feed posts")[0]; | |
if (title) { | |
timelineContainer = title.nextElementSibling.nextElementSibling; | |
timelineContainer.classList.add("timeline"); | |
} | |
} | |
let suggested = S('[dir="auto"]').filter((el) => el.innerText.includes("Suggested")); | |
if (suggested.length) { | |
console.log("Found suggested posts to remove: ", suggested); | |
suggested.forEach(deletePost); | |
} | |
suggested = S('[role="button"]').filter((el) => el.innerText == "Follow" || el.innerText == "Join"); | |
if (suggested.length) { | |
console.log("Found suggested follows to remove: ", suggested); | |
suggested.forEach(deletePost); | |
} | |
let jank = S('.x9f619.x1n2onr6.x1ja2u2z.x1s85apg'); | |
if (jank.length) { | |
console.log("Found jank to remove: ", jank); | |
jank.forEach(deletePost); | |
} | |
let emptyPosts = S('.timeline > .x1lliihq').filter((el) => el.innerText == ''); | |
if (emptyPosts.length) { | |
console.log("Found empty posts to remove: ", emptyPosts); | |
emptyPosts.forEach(deleteElement); | |
} | |
let marketplaceAds = S('.x9f619.x78zum5.x1r8uery.xdt5ytf.x1iyjqo2.xs83m0k.x1e558r4.x150jy0e.x1iorvi4.xjkvuk6.xnpuxes.x291uyu.x1uepa24').filter((el) => el.innerText.includes("Sponsored")) | |
if (marketplaceAds.length) { | |
console.log("Found sponsored ads to remove: ", marketplaceAds); | |
marketplaceAds.forEach(deleteElement); | |
} | |
}; | |
const throttle = (callback, timeout) => { | |
let waiting = false | |
return (event) => { | |
if (waiting) return | |
waiting = true; | |
setTimeout(() => waiting = false, timeout); | |
callback(event); | |
} | |
} | |
let cleanup = throttle(run, 200); | |
setInterval(cleanup, 1000); | |
document.addEventListener("scroll", cleanup); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment