Skip to content

Instantly share code, notes, and snippets.

@shreve
Created November 29, 2024 17:02
Show Gist options
  • Save shreve/06236352ef639642991d9097636c4f43 to your computer and use it in GitHub Desktop.
Save shreve/06236352ef639642991d9097636c4f43 to your computer and use it in GitHub Desktop.
Facebook Junk Autoblock
// ==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