世界之窗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) {}
		}
	}
})();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章