Block Facebook Posts with Follow or Join (CSP Safe)

Block posts on Facebook newsfeed that have Follow or Join buttons, bypassing CSP restrictions.

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Block Facebook Posts with Follow or Join (CSP Safe)
// @namespace    http://github.com/sarahbarberuk
// @version      1.3
// @description  Block posts on Facebook newsfeed that have Follow or Join buttons, bypassing CSP restrictions.
// @author       Sarah Barber
// @match        https://www.facebook.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
        // Function to find the nearest parent div with exactly one class
        function findNearestParentWithOneClass(element) {
            let parent = element.closest('div');
            while (parent) {
                if (parent.classList.length === 1) {
                    return parent; // Found the div with exactly one class
                }
                parent = parent.parentElement.closest('div'); // Move to the next parent div
            }
            return null; // Return null if no such div is found
        }

        // Function to block posts with "Follow" or "Join" buttons
        function blockPostsWithFollowOrJoin() {
            // Get the main newsfeed div
            const mainDiv = document.querySelector('div[role="main"]');
            if (!mainDiv) return;

            // Get all div elements with role="button" inside the main div
            const buttons = mainDiv.querySelectorAll('div[role="button"]');

            // Loop through each button and check if it contains "Follow" or "Join"
            buttons.forEach(button => {
                const span = button.querySelector('span');

                if (span && (span.innerText === 'Follow' || span.innerText === 'Join')) {
                    // Find the nearest parent div with exactly one class and hide it
                    const postContainer = findNearestParentWithOneClass(button);
                    if (postContainer) {
                        postContainer.style.display = 'none';
                        console.log('Blocked post with:', span.innerText, postContainer);
                    }
                }

                // this bit blocks reels and short videos
                const innerDiv = button.querySelector('div');
                if (innerDiv) {
                    const innerSpan =  innerDiv.querySelector('span');

                    if (innerSpan && (innerSpan.innerText === 'Reels and short videos')) {
                        // Find the nearest parent div with exactly one class and hide it
                        const postContainer = findNearestParentWithOneClass(button);
                        if (postContainer) {
                            postContainer.style.display = 'none';
                            console.log('Blocked post with:', innerSpan.innerText, postContainer);
                        }
                    }
                }  

                   
            });
        }

        // Run the script periodically to catch new posts
        const observer = new MutationObserver(blockPostsWithFollowOrJoin);
        observer.observe(document.body, { childList: true, subtree: true });


})();