ad4Uの隠しリンクを露出させるGreasemonkeyスクリプト

ソースが一部表示されていなかったようです。今は修正済みです。申し訳ありません。
ライブドア楽天が使用しているドリコム行動ターゲティング広告「ad4U」。
ブラウザに残っているサイト訪問履歴を元に広告を出してくる、プライバシーも何もあったもんじゃないアレです。で、ad4u利用サイトでは、閲覧履歴の取得のために大量の隠しリンクが埋め込まれています*1

さて、この隠しリンクGreasemonkeyスクリプトで表示させる、というのが今回のお話。
IEにおいては、高木先生が作られたユーザースタイルシート隠しリンクを露出させることが出来ます(http://takagi-hiromitsu.jp/diary/20081211.html#p01)。アラートを出すようにしておけば、ad4Uな広告が入っているサイトにすぐに気づけて便利です。
私も「楽天ad4U、個人ブログまで監視対象にしていた」を書くときに利用させていただきました。

しかし、この「スタイルシートを利用する」というアイデアの参考元であるところのamachang曰く「まともな CSS パーサーだとエラーにな」る手法を使っているためでしょうか、Firefoxだとうまくいきません。

私が普段使っているFirefoxでも、ad4Uを使ったサイトにすぐに気づきたいし、隠しリンクも見たい。こういうときは、グリモンだ。ということで、Greasemonkeyスクリプトを書いてみました。
このGreasemonkeyスクリプトは、隠しリンクの露出が出来るだけで、ad4Uな広告そのものをブロックできるわけではありません。ad4Uの無効化は末尾にあげた関連エントリをご覧ください。

// ==UserScript==
// @name           Show ad4U hidden links
// @namespace      http://d.hatena.ne.jp/xenoma/
// @description    Show ad4U hidden links.
// @include        http://*
// @author         xenoma
// ==/UserScript==

// ad4Uによるページ表示履歴解析を完全に無効にするわけではありません
// アラートを出し、履歴解析のターゲットになっているURLを表示するだけです
(function(){
	var bodyElement = document.body;
	var ad4u_detect = function(){
		// 履歴対象のURLリストが入っているdiv要素
		var ad4u_list = document.getElementById('ad4u_list');
		
		if(ad4u_list){				
			bodyElement.removeEventListener('DOMSubtreeModified', ad4u_detect, true);
			
			alert("Hello, ad4U!");
			var source = ad4u_list.innerHTML;
			
			// plaintext で出力するとき
			// var element = document.createElement('plaintext');
			
			// リンク形式で出力するとき
			var element = document.createElement('div');
			source = source.replace(/<a href="(.+?)">[^<]*<\/a>/gi, "<A href=\"$1\"><NOBR>$1<\/NOBR><\/A><BR \/>");
			
			element.style.cssText="overflow:scroll; border:dashed 4px red; width:290px; height:75px;";
			element.innerHTML = source;
			bodyElement.appendChild(element);
		}
	};
	bodyElement.addEventListener('DOMSubtreeModified', ad4u_detect, true);
})();

とりあえずFx3, GM0.8の環境では動いています。隠しリンクは<div id = "ad4u_list">に入っているのですが、元々は存在しておらず、後から追加されるようでした。そこで、DOM Treeの変化を手がかりにすることにしました。
余談ですが、plaintextで出力するようにすると、いくつかのdiv要素に分かれていることがわかります。この区切りはおそらく広告ジャンルです。ジャンルごとにどんなURLが見られているかも見えてきます。ジャンルの詳細は、ドリコムのプレスリリースがありますので以下に上げておきます。

髪に関するURL群は、コスメ>化粧品という扱いかな。

注意

どうぞご利用ください、といいたいところだけど、Greasemonkeyスクリプトをインストールすることはリスクを伴います。悪意あるスクリプトや穴のあるスクリプトを組み込んでしまわないよう、得体の知れないサイトの言うことを信じて安易にインストールしてはいけませんよ*2

追記

ソースの後半が切れていたので、表示されるよう修正。もしかして途中で<が入ると切れちゃうのか?スーパーpre記法@javascript

追記2

使ってみて ad4u の発動条件について気づいたことなど

*1:訪問済みのリンクの色が異なるのを利用している。未訪問のリンクと訪問済みリンクのスタイルに違いをもたせて、その違いを検出している。

*2:それでも構わないなら、どうぞご利用ください