bilibili 推广检测

检测视频推广

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         bilibili 推广检测
// @namespace    http://tampermonkey.net/
// @version      0.1.4
// @description  检测视频推广
// @author       share121
// @match        *://www.bilibili.com/video/*
// @icon         https://www.bilibili.com/favicon.ico
// @connect      *
// @grant        GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==

(function () {
    "use strict";

    function showTips() {
        let tishi = document
            .createRange()
            .createContextualFragment(
                `<div style="border: 1px solid var(--line_light);border-radius: 6px;background-color:rgb(255, 255, 255);position: fixed;bottom: 50px;right: 50px;z-index: 10000;padding: 20px;box-shadow: 0px 5px 60px rgba(0,0,0,0.2);" data-darkreader-inline-bgcolor=""> <div style=" padding: 8px; display: grid; place-content: center;"> <p style=" font-size: 24px;">此视频暗藏玄机</p> </div> <div style=" display: grid; grid-template-columns: 1fr 1fr; gap: 5px; padding: 8px;"> <button type="button" style=" border: none; padding: 8px; border-radius: 6px; outline: none; cursor: pointer; font-size: 14px; background-color: rgba(0,0,0,0.03); border: 1px solid var(--line_light);">关闭此视频</button> <button type="button" style=" border: none; padding: 8px; border-radius: 6px; outline: none; cursor: pointer; font-size: 14px; background-color: rgba(0,0,0,0.03); border: 1px solid var(--line_light);">取消</button> </div></div>`
            );
        tishi.querySelectorAll("button")[0].addEventListener("click", () => {
            if (navigator.userAgent.indexOf("MSIE") > 0) {
                if (navigator.userAgent.indexOf("MSIE 6.0") > 0) {
                    window.opener = null;
                    window.close();
                } else {
                    window.open("", "_top");
                    window.top.close();
                }
            } else {
                window.opener = null;
                window.open("", "_self");
                window.close();
            }
        });
        tishi
            .querySelectorAll("button")[1]
            .addEventListener("click", function () {
                this.parentNode.parentNode.remove();
            });
        document.body.appendChild(tishi);
    }

    function testUrl(url, failCallBack) {
        function test(url) {
            return [
                /taobao\.com/,
                /tmall\.com/,
                /jd\.com/,
                /maigoo\.com/,
                /1688\.com/,
                /xiaohongshu\.com/,
                /meituan\.com/,
                /amazon\.cn/,
                /dianping\.com/,
                /gome\.com\.cn/,
                /pinduoduo\.com/,
                /dangdang\.com/,
                /vmall\.com/,
                /suning\.com/,
                /vip\.com/,
                /you\.163\.com/,
                /xiaomiyoupin\.com/,
            ].every((e) => !e.test(url));
        }
        if (test(url)) {
            GM_xmlhttpRequest({
                url,
                onload({ finalUrl }) {
                    test(finalUrl) || failCallBack(finalUrl);
                },
            });
        } else {
            failCallBack(url);
        }
    }

    new MutationObserver((mutationsList) => {
        mutationsList.forEach((e) => {
            e.addedNodes.forEach((e) => {
                try {
                    if (e instanceof HTMLAnchorElement && e.dataset.url) {
                        testUrl(e.dataset.url, showTips);
                    }
                } catch { }
            });
            if (e.attributeName === "data-url") {
                try {
                    if (
                        e.target instanceof HTMLAnchorElement &&
                        e.target.dataset.url
                    ) {
                        testUrl(e.target.dataset.url, showTips);
                    }
                } catch { }
            }
        });
    }).observe(document.body, {
        subtree: true,
        childList: true,
        attributeFilter: ["data-url"],
    });
})();