LDARG_0

.........

一个用于屏蔽中国电信垃圾广告的Chrome扩展

最近一段时间,页面上不断出现各种各样的垃圾广告信息。而我的ADBlocker居然视而不见。

 

这些垃圾广告插入后有时候有一个非常可恶的行为,有可能因为广告代码不兼容我想要访问的真实页面,弄得我点击页面上的链接点来点去就是没有反应,总是要我下意思的重新刷新一下才行。

我开始以为是Chrome崩溃了,一两次也就算了,可是接下来几天老是这样,心里有点想骂Google的冲动:唉,这浏览器版本一上去,功能越来越多,稳定性却越来越差了。

随着重新刷新的次数越来越多,我心里越来越堵得慌,可是我也随即发现了规律,首先这应该不是chrome的崩溃,因为出现这种情形的时候浏览器本身的快进刷新功能正常的,而不是程序毫无响应。其次每次假死的时候右下角都有一个恶心的广告。而那一向杀敌无数的ADBlocker插件居然失灵了。

想来想去我决定分析一下页面的源代码,果然!我很想找个人多的地方大吼一声:我日你XX的中国X信!

俗话说是可忍孰不可忍,作为开发人员如果连这样的问题都解决不了不如喝水呛死算了。

 

于是发布如下Chrome插件,专门用于屏蔽中国电信的广告,苍蝇的嗡嗡声没了,这个世界清静了。

 

插件下载地址:https://skydrive.live.com/redir?resid=E0560144122A3B9D!264

crx文件是已经打包好的插件文件,直接拖到Chrome即可安装。

zip文件是源代码的打包,有需要者可以根据自己需求更改。

 

 

主要的代码:

/*
当页面加载完成时执行此脚本进行检测
考虑到电信的污染实际上是通过脚本完成而非HTML污染
当chrome运行此脚本时不进行任何处理,相反,等到页面完全加载完成后再尝试进行操作。
*/

log("插件启动,开始准备电信广告清除");

var handleTimeout;
var countTime = 0;
var maxCount = 10; //最多监测10秒


removeTelecomAD();



/*负责进行检测并且移除电信的广告*/
function removeTelecomAD() {
    if (document.readyState.toLowerCase() == "complete") {

        //当页面完全加载完成时执行的代码

        var iframes = document.getElementsByTagName("iframe"); //检测页面的iframe集合
        var url = window.location.toString().toLowerCase(); //检测页面的地址

        var regSize = /(100|9[0-9])%/;

        try {

            log("扫描全部iframe,共计:" + frames.length);

            /*遍历所有的iframe以检测是否有异常的iframe存在*/
            for (var i = iframes.length - 1; i > -1; i--) {
                var frame = iframes[i];
                var frameUrl = frame.src != null ? frame.src.toLowerCase() : "";
                log("开始监测frame:" + frameUrl);
                var width = frame.width;
                var height = frame.height;
                if (regSize.test(width) && regSize.test(height)) {//iframe的大小是否占据了屏幕大部分
                    if (frameUrl.indexOf(url) == 0 && /[?#].*/.test(frameUrl.substring(url))) {//iframe的实际地址和父页面的实际地址一致
                        replaceSource(frame);
                        break;
                    }
                    else if (frameUrl == "" || frameUrl.indexOf("http") != 0) {
                        replaceSource(frame);
                        break;
                    }
                    else {
                        log("frame:" + frameUrl + "不满足条件");
                    }
                }
            }
            log("扫描全部iframe完成");
        }
        catch (e) {
            log(e);
        }

    }
    handleTimeout = window.setTimeout(removeTelecomAD, 1000);

    countTime++;
    if (countTime > maxCount) {
        cleareHandles();
    }

}

/*清除之前注册的句柄*/
function cleareHandles() {
    window.clearTimeout(handleTimeout);
}

/*负责用真实的页面内容替换当前页面的页面内容*/
function replaceSource(frame) {
    try {
        console.log(frame);
        var cntDoc = frame.contentDocument;
        if (cntDoc == null) { log("contentDocument为null"); return; }
        if (cntDoc.documentElement == null) { log("documentElement为null"); return; }
        var html = cntDoc.documentElement.outerHTML;
        if (html != null && html != "") {
            document.write(html);
            return;
        }
    }
    catch (e) {
        log(e);
    }
    if (frame.src == null || frame.src == "") {
        return;
    }
    log("当前页面可能被电信嵌入广告,使用下面的地址替换:" + frame.src);
    window.location = frame.src;
}

/*写入日志*/
function log(message) {
    return;
    console.log("电信广告移除工具:" + message);
}

 

 

 

 

posted on 2012-07-27 22:03  sumok  阅读(1054)  评论(6编辑  收藏  举报

导航