一个用于屏蔽中国电信垃圾广告的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); }