世界之窗3的广告过滤规则 2013.5.31更新

世界之窗3升级后主站论坛恢复后,更新了一下规则!


2013.5.31更新:优化遍历DOM逻辑,整个脚本代码不足50行!

终于做了个在线更新,不用在网盘上做更新了!!大笑
在世界之窗3中进我的帖子点击那个绿色图标: 世界之窗论坛(汗!不支持站外直接在线添加规则)

这里发发世界之窗3牢骚三点:
当网页内容(最典型是脚本文件)被网址黑名单(<urlrule>)屏蔽后,广告过滤插件并未对主程序返回调用,主程序也就一直等待调用返回,而导致界面显示一直在访问;
第二点诟病之处,就是网址黑名单功能并不稳定,有时对一些地址的过滤并不起作用。
最后一点还是广告过滤的,其易用性还有待提高,应提供一个和火狐ABP类似的直观过滤项查看界面;过滤规则的维护性不高,特别是网址黑名单~内容一多就混乱不好维护。

更新记录:

2012-11-25 最近学JQuery,真强大!!用上了~去华军软件园的下载验证!这里做个Mark: 调用JQuery的方法得加上小括号,不然返回的可是方法对象!

这次更新,属于重大更新!!!!!已经解决和迅雷冲突的BUG!!

增加几个网站的处理,如2ccc.com的45秒等待真令人恼火!!取消它,不过还是有提示!


2012-06-26 解决诸多在线邮和JS广告过滤 规则的冲突

2012-06-19 重大更新,优化newkillAd.js:修正浮动判断依据;修正网址判断逻辑。查杀和执行效率都提高很多,也少了很多误杀!请即更新!!【只贴到代码框了】。
       更新网易及其视频站点的过滤规则,完美过滤其二个域名v.163.com,163.letv.com的广告,不会出现之前有的播放不了,有些广告又过滤不掉的情形!
加入网址黑名单,个人建议:网址黑名单 只保留我的 gsf url、xwhyc url、絮的通用url 规则三项(E版的更新不太及时)。象我的Xml规则文件就38KB大小

      启用CSS定义网站样式和过滤网页显示元素,58小说网、闪舞小说网 、556677文字小说网三个站点都采用注入CSS进行定义及过滤,原有的元素过滤并未删除只是禁用。相关CSS注入技术、更多细节请访问世界之窗论坛



11-10  添加了几个广告联盟的处理,和讯网广告!

11-25  整理过滤规则,删除一些重复作用的规则;添加了浮动广告处理killAd.js,可选!

11-29  浮动广告处理killAd.js修正完成,做了基本测试;增加了对QQ网站的广告处理。此次更新,规则默认开启JS。

11-30  花了一晚测试浮动广告处理killAd.js,解决:空框架问题、误删正常内容框架。及修改若干Bug。测试:FireFox 8,IE 8,网站:和讯期货实时行情、万卷书库、中关村在线、广西政府网、QQ、www.qzwap.com等。你可直接用本规则到中关村在线测试,可正常删除其没被过滤的浮动广告!

今天二次更新,修正滚动事件的取消Bug,在太平洋电脑网测试通过!!

12- 2  增加对网易评论的免过滤处理,新增太平洋电脑网的规则;修正脚本的一个Bug!

12-11  killAd.js脚本用onreadystatechange代替onload事件

2012元旦 增加对HTML5的支持,即增加对Video标签的处理。  killAd.js更新,精简代码到只有50行,只处理浮动广告,并进行类封装【killAd.js更稳定些】。

重写了JS,文件名newkillAd.js该JS能比较智能的识别广告并删除,效率也高些。对广告容忍性差点,机器配置低的朋友推荐使用!newkillAd.js对产生广告的JS标签进行监控处理,但该JS受出错网页的影响也大,有时网页出错时不能正确处理广告。

2012.01.05  newkillAd.js用正则表达式判断广告媒体;增加对出错网页的广告过滤处理;整个JS用类封装。已经完成测试:和讯期货实时行情【原来误删行情数据已解决】、万卷书库、中关村在线、广西政府网、QQ、www.qzwap.com等。网页出错的情形下JS照常过滤广告。推荐使用newkillAd.js进行过滤!!!!!!!

2012.01.18 春节前更新一次 删除并更新一些过时、不合相应网站变化的规则,将絮的通用元素规则删除了,太复杂、耗时、太多误删了;修正JS文件中的一处小错误。


刚刚发现CSDN的代码框支持复制了,内牛满面中.......这么简单的功能现在才搞出来

(对弹窗广告JS还是没办法啊!!TW3对弹窗也是挺乏力的,个人建议用防火墙如Nod32的HTTP防火墙,将ABP中带Third-Part的网址列表【即广告联盟网址】全加入到防火墙的黑名单中!嘿嘿,这样做的话,配合newkillAd.js基本上可杜绝广告,也无须再怎么更新规则了)


另外一点 要说的是:浮动广告处理killAd.js可直接用于世界之窗2,有个叫Killad脚本插件,直接替换其中的内容即可,可把事件处理删除,只执行onBodyLoad(),最后设置插件自动运行。2版中的元素管理器捕获网页富媒体文件还是很好用的!!我经常用!!


关于脚本还有一点要说,如果感觉脚本的执行对网页的装入速度没影响【说明:脚本是本地执行,对网速肯定是没影响】,那基本上无须再更新过滤规则了,甚至可把过滤规则逐步试着删除!请用IE6、7、9的朋友帮忙测试一下脚本,有问题请到评论反馈!!谢谢


(BS一下微软,在IE下JS不好调试不说,在FF下执行一点问题都没,在IE下就一次一个结果,如:removeChild这条DOM,感觉IE有一套克隆DOM!让我想刚做IT时用VB也是这情形,让人发狂!!以后可能长期不更新规则了,改用FF和Chrome)


关于浮动广告处理killAd.js脚本有点遗憾的是:IE的setCapture( )只能捕获鼠标事件,不像W3c标准的captureEvents( )可捕获onload事件,不然脚本可精减到十几二十行!关于这个思路哪位脚本高手有好的建议可以提一提!

滚动事件肯定是不能指望,对速度的影响太大;再则有些网页一页不用滚动的!


        这几天没事翻翻正则表达式,本着活学活用的精神,顺便学了世界之窗3的广告过滤规则,加之没事喜欢看看小说,写了几条规则。

 世界之窗3被收购,它的网站已经不可在线更新过滤规则的,这么好一款软件被360了,可惜了!!

现把过滤规则放上来,有需要的朋友可以用用!集成了xwhyc、絮和E(TW3官方)规则,并稍作修增,自己增加了一条通用元素过滤规则专门处理广告脚本,可处理绝大多数脚本广告。


很佩服凤凰工作室,一二个人就写出了这么好一款软件!!

 

(记个事,58小说网打开后总处于访问状态,一开始总不明所以,明明打开了网页~标签还转个不停,每次打开一个页面后都还得按一下ESC键,怪别扭的!!可将规则文件中的58小说网的规则暂时删除体验一下微笑后来将其脚本广告禁了,终于世界清静了!)

 

不学过滤不知道,一学吓一跳啊,仔细一看网页源码,很多网站都是一大堆连接其它站点的广告:图片,Flash等,消耗系统资源不说,打开速度也慢,占用本就不多的带宽!!实在可恶啊!!!!

 

<enable><![CDATA[0]]></enable> 禁用其下过滤规则

<enable><![CDATA[1]]></enable> 启用其下过滤规则


TW3的广告过滤有一个优点:加载HTML前滤过处理,无须下载广告图片Flash等。但少个ADBlock Plus的Third-Part来禁用非本页面地址的广告。

ABP的Third-Part/first-Part,CSS选择器强大啊,这里Mark一下:

# 是CSS的ID选择符

> 是子元素选择符

 . 类选择符

+ 紧接的兄弟选择符
~ 指定元素后面的同级选择符

 {}  属性选择符


举例一个:

TW3中 (?<=<span id=ms_1>.+?;)<a href.+?</font></a>正则表达式用于过滤紧挨着span的 ID为ms_1的A标签,复杂吧【其实可在TW3中注入CSS实现CSS方式的过滤,详见本页前面的论坛帖子链接】

在ABP中用58xs.com##span#ms_1 + a就搞定了,哎

而且ABP中的规则更易于维护!!


有兴趣交流的正则表达式和规则过滤的朋友可留个脚印!

newkillAd.js查杀广告比较严格,如果觉得配置不错,宽带足就用killAd.js吧,浮动广告比较讨厌!! 

 

/********************************************************************************
2012-01-05版权所有,转载请注明出处:http://blog.csdn.net/king_xing,欢迎反馈问题!
文件名:killAd.js
功能说明将该JS文件加入网页中可查杀大多数浮动广告!!
 ********************************************************************************/
var KillAd = function () {
	var cnstMedia;
	function enumNodeTree(el) {
		for (var i = 0; i < 5; i++) {
			if (el.getElementsByTagName(cnstMedia[i]).length > 0)
				return true;
		}
		return false;
	}
	function getStyle(elem, styleName) {
		if (elem.style[styleName])
			return elem.style[styleName];
		else if (elem.currentStyle)
			return elem.currentStyle[styleName];
	}
	function scan() {
		var i,
		x,
		c,
		elStyle;
		c = document.getElementsByTagName("div");
		cnstMedia = ["IFRAME", "IMG", "OBJECT", "EMBED", "VIDEO"];
		for (i = c.length - 1; i >= 0; i--) {
			x = c[i];
			if (!x)
				continue;
			elStyle = getStyle(x, "position");
			if ((elStyle === "fixed" || elStyle === "absolute") && enumNodeTree(x)) {
				elStyle = getStyle(x.parentElement, "position");
				if (elStyle === "fixed" || elStyle === "absolute")
					x = x.parentElement;
				x.parentNode.removeChild(x);
			}
		}
		cnstMedia = null;
	}
	function onBodyLoad() {
		var s = document.readyState;
		if (s !== "loading")
			scan();
		if (s === "loaded" || s === "complete")
			document.detachEvent("onreadystatechange", onBodyLoad);
	}
	function onBodyScroll() {
		window.detachEvent("onscroll", onBodyScroll);
		setTimeout(scan(), 200);
	}
	document.attachEvent("onreadystatechange", onBodyLoad);
	window.attachEvent("onscroll", onBodyScroll);
}
new KillAd();


newkillAd.js一开始的时候放Html文本最后的,但遇到网页出错的情况,不能正确处理。也试过script标签的defer属性,但在TW3下,很多网页会处于一直加载状态,使JS一直得不到执行!也试过定时器,但定时的时间不好处理,跟硬件和网速的关系太大了!

用<attachhtml>和defer一样的延迟效果,但方便点。可用于指定站点执行脚本,如自定义站点样式!如下:
 <attachhtml>
  <![CDATA[<script type="text/javascript" src="file:///U:/TheWorld3/newkillAd.js"></script>]]>
 </attachhtml> 

/********************************************************************************
版权所有,转载请注明出处:http://blog.csdn.net/king_xing,欢迎反馈问题!
2012-06-18
文件名:newkillAd.js
功能说明将该JS文件加入网页中可查杀大多数非弹窗广告!!
有些动态生成的网页元素可能查询不到,而导致查杀失败
 ********************************************************************************/
(function () {
	var urlRegp = /^(?:[a-z]+:\/{2})?(?:\w+\.)+[a-z]+\//,
	urlLoc = window.location.hostname;
	urlLoc = urlLoc.substring(urlLoc.indexOf(".")); //句点开头
	if (urlLoc.lastIndexOf(".") === 0)
		urlLoc = window.location.hostname;
	urlLoc = urlLoc.toLowerCase();
	function hasAdLink(o) {
		var x = o.parentElement;
		if (x.tagName !== "A") {
			var c = x.getElementsByTagName("a");
			if (c && c.length === 1)
				//&& c[0].scrollHeight === o.scrollHeight &&
				//c[0].scrollWidth === o.scrollWidth)
				x = c[0];
			else
				return false;
		}
		return isAdURL(x.href);
	}
	function isAdURL(x) {
		var s = x.toLowerCase().match(urlRegp); //提取出hostname
		return s && (s[0].indexOf(urlLoc) === -1);
	}
	function getStyle(elem, styleName) {
		if (elem.style[styleName])
			return elem.style[styleName];
		else if (elem.currentStyle)
			return elem.currentStyle[styleName];
	}
	//var dbg;
	function isFloatLay(el) {
		var x = el.offsetParent;
		//if (!x && getStyle(el, "display") !== "none") return false;
		//return !x.offsetParent || x.tagName === "BODY";
		//dbg = x && x.tagName === "HTML";
		//天极网http://dc.yesky.com/45/32258045.shtml ,这广告太诡异了:明明删除动作执行了还存在、和傲游中看到的网页结构也不一样! 都TMD是IE的错:操,每个JS程序都执行二遍以上
		//if (el.id="AC_TR86_2386") (x) ? alert(x.tagName+" style: "+getStyle(x, "1display")) : alert("null");
		//if (!x) alert(el.tagName + " ;html, run in isFloatLay(), id: " + el.id);
		//if (!x) return true;// || (x.tagName === "BODY");
		return (!x) || (x.tagName === "BODY"); // || (x.tagName === "BODY")|| (x.tagName === "HTML")|| (getStyle(el, "display") === "none") || (getStyle(el, "z-index") == -1);
	}
	function testStyle(o) {
		var s = getStyle(o, "position");
		return (s === "fixed" || s === "absolute");
	}
	function scan(el) {
		var i, j, k, c, x, b, bo, s,
		cnstMedia = ["iframe", "img", "object", "embed", "video"]; //video是Html5标签
		bo = document.body;
		for (i = 0; i < 5; i++) {
			c = el.getElementsByTagName(cnstMedia[i]);
			for (j = c.length - 1; j >= 0; j--) {
				x = c[j];
				if (!x)
					continue;
				//如果只处理浮动广告,注释下面这句
				b = (i === 0) ? (x.src && isAdURL(x.src)) : hasAdLink(x);
				if (x.offsetParent) { //可见与否~如被其它层遮挡住了
					//进行浮动判断:网页DOM向上层回溯
					while (x !== bo) {
						if ((x.tagName === "DIV" || x.tagName === "SPAN") && testStyle(x)) {
							while (testStyle(x.parentElement)) {
								//alert(x.tagName +"  src: "+ x.src);
								x = x.parentElement;
							}
							if (isFloatLay(x)) { //css, offsetParent动态定位
								//s = x.tagName + " ;del id: " + x.id + " ; It's offsetParent: ";
								//(x.offsetParent) ? s = s + x.offsetParent.tagName : s = s + "null";
								//alert(s);
								x.parentNode.removeChild(x); //x.style.display = "none";
								//x.visable = false;
							}
							//if (dbg) alert(x.tagName + ",last ;html, id " + x.id);
							break;
						}
						x = x.parentElement;
					}
				}
				if (b && c[j])
					c[j].parentNode.removeChild(c[j]); //只想处理浮动广告,注释这句
			}
		}
	}
	function onBodyLoad() {
		var s = document.readyState;
		scan(document);
		if (s === "loaded" || s === "complete") {
			document.detachEvent("onreadystatechange", onBodyLoad);
		}
	}
	function onBodyScroll() {
		window.detachEvent("onscroll", onBodyScroll);
		setTimeout(scan(document), 200);
	}
	//扫描脚本并设置其事件
	function scanScript() {
		var c, i, me;
		c = document.getElementsByTagName("script");
		me = document.getElementById("jsKillAD");
		for (i = c.length - 1; i >= 0; i--) {
			if (c[i].readyState !== "complete" &&
				//c[i].readyState !== "loaded" &&
				c[i] !== me) {
				c[i].attachEvent("onreadystatechange", onADScript);
			}
		}
	}
	function onADScript() {
		var x,
		el = event.srcElement;
		x = el.parentElement;
		(!x || x.tagName === "HEAD") ? scan(document) : scan(x);
		if (el.readyState === "complete" || el.readyState === "loaded") //interactive防止下载媒体内容
			el.detachEvent("onreadystatechange", onADScript);
	}
	//if (window.top === window.self){//不在静态子框架中执行
	document.attachEvent("onreadystatechange", onBodyLoad);
	window.attachEvent("onscroll", onBodyScroll);
	setTimeout(scanScript, 10);
	setTimeout(scan(document), 90);
	//}
})();

2013-5-31版本

(function () {
	function getStyle(o, styleName) {
		return o.style[styleName] || o.currentStyle[styleName];
	}

	function testStyle(o) {
		var s = getStyle(o, "position");
		return s === "fixed" || s === "absolute";
	}
/*
	function sameDomain(o) {
		try {
			return o.document.body;
		} catch (e) {
			return  0;
		}
	}
*/
	function isFloatLay(o) {
		var x = o.offsetParent;
		return !x || x.tagName === "BODY" || x.tagName === "HTML";
	}

	function nodeToElement(node) {
		if (!node || node.innerHTML) return node;
		var s, oldId = node.id;
		s = node.id = "__alFwo8dz_fAo3_N";
		try {
			s = node.ownerDocument.getElementById(s);
		}
		finally {
			oldId ? node.id = oldId : node.removeAttribute("id");
		}
		return s || node;
	}

	function scan(el) {
		var i, j, c, x,
		oMedia = ["iframe", "img", "object", "embed", "video"];
		/*
		c = el.querySelectorAll ? el.querySelectorAll("div>script") : el.getElementsByTagName("script");
		for (j = c.length - 1; j >= 0; j--) {
			x = c[j].parentNode;
			if (x.childNodes.length === 1)
				x.parentNode.removeChild(x);
		}
		*/
		for (i = 0; i < 5; i++) {
			c = el.getElementsByTagName(oMedia[i]);
			for (j = c.length - 1; j >= 0; j--) {
				x = c[j];
				//if (i === 0 && sameDomain(x) ) continue;
				while (x) {
					if (isFloatLay(x)) {
						if (testStyle(x))//要删除的层得同时满足二个条件
							x.parentNode.removeChild(x);
						break;
					}
					//else
					x = nodeToElement(x.offsetParent);
				}
			}
		}
	}

	/*
	//扫描广告脚本
	function scanADjs(){
		var c, i, o;
		c = document.getElementsByTagName("script");
		for (i=c.length-1;i>=0;i--) {
			o = c[i];
			if (o.src && o.readyState !== "complete")
				o.parentNode.removeChild(o);
		}
	}

	scanADjs();
	*/
	scan(document);
	if (frames) {
		for (var i = 0; i < frames.length; i++) {
			try {
				scan(frames[i].document);
			} catch (e) {}
		}
	}
})();



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值