略过知乎、csdn、简书、掘金、gitee、微博安全中心中间页站外链接直达跳转,CSDN免登录复制

动态监测整个页面链接变化,略过知乎、csdn、简书、掘金、gitee、微博安全中心中间页站外链接直接跳转。解除csdn未登录复制限制,移除知乎、csdn的强制登陆弹窗,getbootstrap4中文网及上述网站去除冗余的广告

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         略过知乎、csdn、简书、掘金、gitee、微博安全中心中间页站外链接直达跳转,CSDN免登录复制
// @namespace    https://github.com/waahah/
// @version      0.1.3
// @description  动态监测整个页面链接变化,略过知乎、csdn、简书、掘金、gitee、微博安全中心中间页站外链接直接跳转。解除csdn未登录复制限制,移除知乎、csdn的强制登陆弹窗,getbootstrap4中文网及上述网站去除冗余的广告
// @author       waahah
// @icon         data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M13.06 8.11l1.415 1.415a7 7 0 0 1 0 9.9l-.354.353a7 7 0 0 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415 1.415-1.414zm6.718 6.011l-1.414-1.414a5 5 0 1 0-7.071-7.071l-.354.354a5 5 0 0 0 0 7.07l1.415 1.415-1.415 1.414-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 0 1 9.9 9.9z'/%3E%3C/svg%3E
// @require      https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js
// @match        *://getbootstrap.net/docs/*
// @match        *://zhuanlan.zhihu.com/p/*
// @match        *://www.zhihu.com/question/*
// @match        *://www.zhihu.com
// @match        *://www.zhihu.com/people/*
// @match        *://blog.csdn.net/*/article/details/*
// @match        *://www.jianshu.com/p/*
// @match        *://juejin.cn/post/*
// @match        *://gitee.com/*
// @match        *://weibo.com/*
// @license      Apache-2.0
// @grant        GM_registerMenuCommand
// @grant        GM_openInTab
// ==/UserScript==

(function() {
    'use strict';
    //转载请注明出处谢谢
    const path = window.location.host;
    function bs4(){
        //$(".adsbygoogle").remove();
        setTimeout( () => {
            $("p.bd-lead + p").remove();
            $("ins.adsbygoogle.adsbygoogle-noablate");
            $(".adsbygoogle").remove();
        },0);
    }

    //站外链接直接跳转
    async function directLink (str) {
        //console.log("a[href^="+str+"]");
        let link = document.querySelectorAll(`a[href^='${str}']`);
        if(str==undefined){
            link = document.querySelectorAll("#content_views a[href]");
        }
        //如果索引顺序很重要,请不要在数组上使用 for in。索引顺序依赖于实现,可能不会按照期望的顺序访问数组值。
        for(let ee=0; ee<link.length; ee++){
            let url = link[ee].href.replace(str, '');
            //replace对掘金简书不起作用
            if(str=='https://link.juejin.cn?target='){
                url = url.split('?target=')[1];
            }
            if(str=='https://link.jianshu.com?t='){
                url = url.split('?t=')[1];
            }
            if(str==undefined){
                url = link[ee].href;
            }
            if(str=='//weibo.cn/sinaurl?u='){
                //url = url.replace('https:','');
                url = url.substr(6);
            }
            //增加对www.xxx.com这类没有http协议的处理
            if(url.indexOf('http')==-1){
                url = "https://" + url;
            }
            let decodeUrl= decodeURIComponent(url);
            console.log(decodeUrl);
            link[ee].setAttribute('href',decodeUrl);
            link[ee].addEventListener('click',e => {
                if (e && e.preventDefault)
                    e.preventDefault();
                else
                    window.event.returnValue = false; //兼容IE
                window.open(decodeUrl,"_blank");
            })
        }
    }

    function zhihu(){
        const pathname = location.pathname.split('/')[1];
        setTimeout( () => {
            //删除右栏广告
            $('div.Card.AppBanner').remove();
            $('div.Banner-adsense').hide();
            //$('div.Pc-card-button-close ').click();
            const btu = $("button.Button.Modal-closeButton.Button--plain");
            if(btu){
                btu.click();
            }
        },200);
        const str = () => {
            if (pathname =='people') {
                return "http://link.zhihu.com/?target=";
            }else{
                return "https://link.zhihu.com/?target=";
            }
        }
        (async () => str()) ().then(
            async value => {
                await directLink(value);
            }
        );
    }

    function blogCsdn(){
        setTimeout( () => {
            try{
                //debug
                $('code').css({'user-select':'unset'})
                $('#content_views pre').css({'user-select':'unset'})
                $('div#asideNewNps').remove();
                $('#recommendNps').remove();
                const node = $('.passport-login-container');
                if(node){
                    $('.passport-login-container').hide();
                    $('.login-mark').hide();
                    $("div#passportbox span").click();
                }
            }catch(e){
                //TODO handle the exception
                console.log("出错啦!"+e.message);
                console.log(e.stack);
            }
        },100);
        //console.log('csdn功能已启用!');
        (async () => await directLink()) ();
        /*const script = () => {
            let el = document.createElement("script");
            el.src = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js";
            let s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(el, s);
        }
        const once = fun => {
            var tag=true;
            return function(){
                if(tag){
                    tag=false;
                    fun();
                }
            }
        }
        once(script());*/
    }

    function juejin(){
        setTimeout( () => {
            $('div[data-growing-title="掘金插件"]').remove();
            $('div.extension').remove();
            $('div.sidebar-block.app-download-sidebar-block.shadow').remove();
        },50);
        setTimeout( () => {
            $('div.sidebar-block.author-block.pure').remove();
            $('div ul.sidebar-bd-entry').hide();
            $('div.article-suspended-panel.article-suspended-panel').remove();
            /*let node = $('div.sidebar-block.related-entry-sidebar-block.shadow');
            let copy_node = node.clone(true);
             node.hide();
            copy_node.css('float','left');
            copy_node.insertAfter($('div.sticky-block-box'));*/
        },400);

        const self = (async () => await "https://link.juejin.cn?target=")
        self().then(
            async value => {
                await directLink(value);
            }
        );
    }

    function jianshu(){
        $('section.-umr26').hide();
        $('h1._1RuRku').css('margin-top','0');
        //$('aside section:nth-child(2)').hide();
        $('div._27yofX').remove();
        //不需要decode解码
        async function self() {
            return await "https://link.jianshu.com?t=";
        }
        self().then(
            async value => {
                await directLink(value);
            }
        );
        //console.log("简书功能已启用");
    }

    function gitee(){
        //删除gitee封面人物
        const stars = $('div.gitee-stars-main-widget.pendan-widget');
        if(stars){
            stars.remove();
        }
        async function self() {
            return await "https://gitee.com/link?target=";
        }
        self().then(
            async value => {
                await directLink(value);
            }
        );
        //setTimeout(self,100);
    }

    function weiboCom(){
        const tips = $('div.woo-box-flex.woo-box-alignCenter.woo-box-justifyCenter.TipsAd_wrap_3QB_0.TipsAd_bottomGap_1P4hW');
        if(tips){
            tips.remove();
        }
        const self_weiboCom = () => {
            return "//weibo.cn/sinaurl?u=";
        }
        (async () => self_weiboCom()) ().then(
            async value => {
                await directLink(value);
            }
        );
    }

    const host = [
        {"name":"Bootstarp4.1Docs","url":"getbootstrap.net","fun":"bs4()"},
        {"name":"知乎专栏","url":"zhuanlan.zhihu.com","fun":"zhihu()"},
        {"name":"知乎","url":"www.zhihu.com","fun":"zhihu()"},
        {"name":"CSDN","url":"blog.csdn.net","fun":"blogCsdn()"},
        {"name":"简书","url":"www.jianshu.com","fun":"jianshu()"},
        {"name":"掘金","url":"juejin.cn","fun":"juejin()"},
        {"name":"Gitee","url":"gitee.com","fun":"gitee()"},
        {"name":"weibo.com","url":"weibo.com","fun":"weiboCom()"}

    ]

    //初始化页面
    async function main (){
        for(const even in host){
            if(path ==host[even].url){
                eval(host[even].fun);
                console.log(host[even].name);
                break;
            }
        }
    }


    //在时间线拉到下面动态获取新的问答的时候,Dom 会变化,所以动态监测页面dom变化并检查替换。
    async function mo () {
        //观察到变动时执行回调函数
        async function callback (mutationsList, observer) {
            // Use traditional 'for loops' for IE 11
            for(const mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    console.log('A child node has been added or removed.');
                }
                else if (mutation.type === 'attributes') {
                    console.log('The ' + mutation.attributeName + ' attribute was modified.');
                }
            }
            await main();
        }

        const config = {
            'attributes': false,
            'childList': true,
            'subtree': true
        };
        // 以上述配置开始观察目标节点
        const promise = new Promise((resolve, reject) => {
            const observe = new MutationObserver(callback);
            resolve(observe);
        })
        promise.then(observe => observe.observe(document.body,config));
    }

    main().then(async () => await mo());

})();