Bye Bye Pinterest

Hides Pinterest from search and Image results

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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;
}