unDonutでコンテンツプロックっぽいことするスクリプト
以前Sleipnirで同じようなものを書いて使ってたが、その後unDonutに乗り換えてしまい、このunDonutもコンテンツブロックの機能がない事に気付き、同じ様なJスクリプトを書いてみた。
しかし、Sleipnirと同じ様にリンクを1つ1つチェックするとSleipnirでも処理が遅かったが、このunDonutはそれに輪を掛けて遅かった。なのでソース自体を書き変えるようにしたのはいいが、不得意な正規表現で躓き、記述によっては余計なリンクまで削除するわ極端に処理が遅くなるわで苦労したが、行き当たりばったりで何とかなった気がするのでここに晒してみます。
curl[ ]のの間に監視するURL、durlに削除するURLを配列として記入。(内部リンクでhostなどソースで省略されている場合、スクリプト内の記述も省略したURLに)
下記の例は、www.hatenaを含むページとこの日記を監視して、はてなの広告画像とjpg画像を削除するように記入してみた。ファイルの拡張子はjs。
, rurl = [];
urep(curl, rcurl);
urep(durl, rurl);
var api = WSH.createobject('donutp.api');
var reg = new RegExp();
var cw = 0;
while(true) {
try {
try {
api.gethwnd(0);
} catch(e) {
break;
}
var wn = api.gettabcount();
for (var w = 0; w < wn; w ++) {
var doc = api.getdocumentobject(w);
for (var cc in rcurl) {
reg.compile(rcurl[cc], 'i');
if (reg.test(doc.URL)) {
cw = 1;
if (!doc.getElementById('uzaiuzai')) {
var fs = doc.getElementsByTagName('frameset');
if (fs.length == 0) {
chk(doc);
} else {
var f = doc.frames;
if (f.length > 0) {
for (var fc = 0; fc < f.length; fc ++) {
try {chk(f(fc).document)} catch(e) {}
}
}
}
var el = doc.createElement('div');
el.id = 'uzaiuzai';
doc.body.appendChild(el);
doc.title = String.fromCharCode(9733) + doc.title;
}
}
}
}
if (cw) {
cw = 0;
} else {
break;
}
} catch(e) {cw = 0}
WSH.sleep(1000);
}
doc = null;
api = null;
function chk(obj) {
try {
var src = obj.body.innerHTML.replace(/</g, '\n<');
for (var u in rurl) {
reg.compile('<[^>]*?=("|\')' + rurl[u] + '("|\')[^<]*>([^>]*<\/a>)*', 'ig');
src = src.replace(reg, '');
}
obj.body.innerHTML = src;
} catch(e) {}
}
function urep(arr1, arr2) {
for (var i in arr1) {arr2.push(arr1[i].replace(/(\.|\?|\/)/g, '\\$1').replace(/\*/g, '.*'))}
}
処理が終わるとタブのタイトルに星が出るようにしてみた。
SeaHorseやなんたらモンキーのようなものがないので、このスクリプトを起動すると監視、監視するURLがタブから消えるかunDonutを終了するとスクリプトも終了する、はず。
フレームによってはエラーになるかもしれません。
Sleipnirをアンインストールしてしまったけど、処理速度はこの方法が断然速かったのでテストは全くしてないけどSleipnirの方も、以前書いたページに追加してみましたがエラーになる可能性が高いです。こっちは星出ないです。