netnr/ LinkStatusDetection.js 2019-08-09 22:08
页面所有链接状态检测(如导航页面维护失效的链接)
var lsd = {

    //需要检测的链接
    linkAll: [],

    //忽略的链接,关键字匹配
    linkIgnore: ['favicon.ico', 'netnr', location.origin],

    //跨域代理
    cors: ['https://cors.eu.org/', 'https://netnr.zme.ink/api/v1/Proxy?url='],

    //并发数
    cn: 9,

    dc: {
        ci: 0,
        //总链接数
        total: 0,
        //当前并发数
        ccn: 0,
        //输出结果
        result: {
            success: [],
            fail: [],
            ignore: []
        }
    },

    //检测结果输出
    checkResult: function () {
        console.log({
            progress: (lsd.dc.result.success.length + lsd.dc.result.fail.length) + '/' + lsd.dc.total,
            success: lsd.dc.result.success.length,
            fail: lsd.dc.result.fail.length
        })

        if (lsd.dc.result.success.length + lsd.dc.result.fail.length == lsd.dc.total) {
            lsd.result();
        }
    },

    //检测
    checkGet: function (url) {
        var curl = lsd.cors[lsd.dc.ci++];
        if (lsd.dc.ci == lsd.cors.length) {
            lsd.dc.ci = 0;
        }
        var furl = curl + url;

        lsd.dc.ccn++;
        fetch(furl).then(res => {
            var dr = {
                url: url,
                status: res.status,
                curl: curl
            };
            if (res.status == 200) {
                lsd.dc.result.success.push(dr)
            } else {
                lsd.dc.result.fail.push(dr)
            }
            lsd.dc.ccn--;

            lsd.checkResult();
        }).catch(err => {
            lsd.dc.result.fail.push({
                url: url,
                error: err,
                curl: curl
            })
            lsd.dc.ccn--;

            lsd.checkResult();
        })
    },

    //初始化
    init: function () {
        //填充链接
        for (var i = 0; i < document.links.length; i++) {
            var link = document.links[i].href;
            if (lsd.linkIgnore.filter(x => link.toLowerCase().indexOf(x.toLowerCase()) > -1).length == 0) {
                lsd.linkAll.push(link);
            } else {
                lsd.dc.result.ignore.push(link);
            }
        }
        lsd.dc.total = lsd.linkAll.length;

        //开始任务
        lsd.si = setInterval(function () {
            if (lsd.linkAll.length == 0) {
                clearInterval(lsd.si);
            }
            if (lsd.dc.ccn < lsd.cn) {
                lsd.checkGet(lsd.linkAll.pop());
            }
        }, 10)
    },

    //输出结果
    result: function (isstop) {
        if (isstop) {
            clearInterval(lsd.si);
        }
        console.log(lsd.dc.result)
    },

    //坏的输出结果
    resultFail: function () {
        console.log(lsd.dc.result.fail.map(x => x.url).join('\r\n'))
    }
};

lsd.init();