Bye Bye Pinterest

Hides Pinterest from search and Image results

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Bye Bye Pinterest
// @namespace   https://cool-website.xyz/projects
// @match       *://www.google.com/*
// @match       *://www.ecosia.org/*
// @match       *://duckduckgo.com/*
// @match       *://html.duckduckgo.com/*
// @match       *://yandex.com/*
// @match       *://search.yahoo.com/*
// @match       *://search.yahoo.co.jp/*
// @match       *://ya.ru/*
// @match       *://yandex.ru/*
// @match       *://yandex.eu/*
// @grant       none
// @version     0.1
// @author      Carn
// @description Hides Pinterest from search and Image results
// @icon        https://cool-website.xyz/projects/bye-bye-pinterest/icon.png
// @homepageURL https://cool-website.xyz/projects/bye-bye-pinterest/
// @license MIT
// ==/UserScript==

// if you add a string to the array here, it blocks it if the hostnames
//are exact matches, otherwises it tests the host name against the regex
//to see if it should block it
const hiddenWebsites = [/.*\.pinterest\..*/, /pinterest\..*/];
const domain = unsafeWindow.location.hostname;

function isBannedHostname(hostname)
{
        return hiddenWebsites.some((hiddenWebsite) =>
        {
                console.log(hiddenWebsite);
                // if you put a string here, it blocks it if
                // the hostnames are exact matches, otherwises it
                // tests the host name against the regex
                return (typeof (hiddenWebsite) == "string" ?
                        hostname ==
                        hiddenWebsite : hiddenWebsite
                        .test(hostname));
        });
}

// takes in the class name of an element containing a URL, a function
// to extract the URL string from that element, and the class name of
// the ansector element that contains the whole search result
// (the element to be removed)
function genericRemove(urlTextEl, urlgetter, containerName)
{
        Array.from(document.getElementsByClassName(urlTextEl))
                .forEach((el) =>
                {
                        //exctract url from element
                        let url = urlgetter(el);
                        console.log(url);
                        let hidden = isBannedHostname((new URL(url))
                                .hostname);
                        if (hidden)
                        {
                                let ancestorElement = el.parentNode;
                                while (ancestorElement && ancestorElement.classList)
                                {
                                        console.log(ancestorElement);
                                        if (ancestorElement.classList
                                                .contains(containerName)
                                        )
                                        {
                                                console.log(ancestorElement);
                                                ancestorElement.style
                                                        .display ="none";
                                                console.log("removed: " +
                                                        url);
                                                break;
                                        }
                                        ancestorElement =
                                                ancestorElement
                                                .parentNode;
                                }
                        }
                        else
                        {
                                console.log("didn't remove: " + url);
                        }
                });
}

switch (domain)
{
case 'html.duckduckgo.com':
        genericRemove('result__url', (a) =>
        {
                return 'http://' + a.textContent.trim();
        }, 'web-result');
        genericRemove('results__url', (a) =>
        {
                return 'http://' + a.textContent.trim();
        }, 'web-results');
        break;
case 'duckduckgo.com':
        // I hate react and the terrible way it names classes
        // Select the target node
        var targetNode = document.querySelector('#links');
        // Create a new instance of the MutationObserver with a callback function
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('Wo6ZAEmESLNUuWBkbMxx', (a) =>
                {
                        return (a.textContent
                                .startsWith(
                                        'https://'
                                ) ?
                                a
                                .textContent
                                .trim() :
                                "https://" +
                                a
                                .textContent
                                .trim());
                }, 'nrn-react-div');
            genericRemove('Wo6ZAEmESLNUuWBkbMxx', (a) =>
                {
                          return (a.textContent
                                .startsWith(
                                        'https://'
                                ) ?
                                a
                                .textContent
                                .trim() :
                                "https://" +
                                a
                                .textContent
                                .trim());
                }, 'wLL07_0Xnd1QZpzpfR4W');
                genericRemove('tile--img__domain', (a) =>
                {
                        return a.title;
                }, 'tile');
                console.log('Content of the div changed');
        });
        // Start observing the target node for configured mutations
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
case 'www.google.com':
        console.log("google detected");
        genericRemove('VFACy', (a) =>
        {
                return a.href;
        }, 'isv-r');
        //no js version
        genericRemove('UPmit', (a) =>
        {
                return 'http://' + (a.innerText.split('›')[0])
                        .trim();
        }, 'Gx5Zad');
        // Select the target node
        // Create a new instance of the MutationObserver with a callback function
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('VFACy', (a) =>
                {
                        return a.href;
                }, 'isv-r');
                genericRemove('tjvcx', (a) =>
                {
                        return a.firstChild.data
                                .trim();
                }, 'g');
                console.log('Content of the div changed');
        });
        // Start observing the target node for configured mutations
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
        //images don't work for yahoo
case "search.yahoo.com":
        genericRemove('p-abs', (el) =>
        {
                return "https://" + el.innerText.split("›")[0]
                        .trim();
        }, 'dd');
        break;
        //yahoo japan is different
case "search.yahoo.co.jp":
        genericRemove('sw-Card__titleInner', (el) =>
        {
                return el.href.trim();
        }, 'sw-CardBase');
        genericRemove('sw-ThumbnailGrid__domain', (el) =>
        {
                return "https://" + el.innerText.trim();
        }, 'sw-Thumbnail');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('sw-ThumbnailGrid__domain', (
                        el) =>
                {
                        return "https://" + el
                                .innerText
                                .trim();
                }, 'sw-Thumbnail');
        });
        observer.observe(document.body,
        {
                subtree: true,
                childList: true
        });
        break;
        // Baidu is explicitly not supported
        //case "www.baidu.com":
        //    genericRemove
        //Neither is bing
        //case "bing.com":
        //images don't work for yandex
case "yandex.com":
case "yandex.eu":
        // for the next two, I'm just assuming it works
case "ya.ru":
case "yandex.ru":
        genericRemove('Path-Item', (el) =>
        {
                return "https://" + el.innerText.split("›")[0]
                        .trim();
        }, 'serp-item');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('Path-Item', (el) =>
                {
                        return "https://" + el
                                .innerText
                                .split("›")[0]
                                .trim();
                }, 'serp-item');
        });
        if (document.querySelector('main__center'))
        {
                observer.observe(document.querySelector('.main__center'),
                {
                        subtree: true,
                        childList: true
                });
        }
        break;
case "www.ecosia.org":
        genericRemove('source__content--domain', (el) =>
        {
            var a = el.innerText.trim();
           return (a.startsWith('https://') ? a : "https://" +  a);

        }, 'result__body');
        genericRemove('image-result__details-source', (el) =>
        {
                return "https://" + el.innerText.trim();
        }, 'image-result');
        var observer = new MutationObserver(function (mutationsList, observer)
        {
                genericRemove('image-result__details-source', (el) =>
                {
                        return "https://" + el
                                .innerText
                                .trim();
                }, 'image-result');
        });
        if (document.querySelector('.image-feed')){
                observer.observe(document.querySelector('.image-feed'),
                {
                        subtree: true,
                        childList: true
                });
        }
        break;
default:
        break;
}