// ==UserScript== // @name Harmful Site Filter // @namespace http://d.hatena.ne.jp/javascripter/ // @include http* // ==/UserScript== function cacheManager(identifier) { var o = JSON.parse(GM_getValue(identifier, JSON.stringify({__proto__: null}))); return { has: function (key) { return key in o; }, get: function (key) { return o[key]; }, set: function (key, value) { o[key] = value; GM_setValue(identifier, JSON.stringify(o)); return value; }, remove: function (key) { delete o[key]; GM_setValue(identifier, JSON.stringify(o)); }, clear: function () { GM_deleteValue(identifier); } }; } var cache = cacheManager("cache"); GM_registerMenuCommand("Harmful Site Filter - Clear Cache", cache.clear); function harmful(url, k) { const API_URL = "http://category.netstar-inc.com/check/res.php"; function onload(res) { const EXTRACTOR = /大カテゴリ (.*?)
/; var html = res.responseText; var all = EXTRACTOR.exec(html); k( cache.set(url, all && all[1].trim() == "アダルト") ); } var opt = { method: "post", headers: { "Content-Type": "application/x-www-form-urlencoded;" }, url: API_URL, data: "url=" + encodeURI(url), onload: onload }; if (cache.has(url)) k(cache.get(url)); else GM_xmlhttpRequest(opt); } harmful(location.href, function (isHarmful) { if (isHarmful) blur(document.body); }); var isAppended = false; function blur(element) { if (!isAppended) { document.documentElement.appendChild( E4XToDOM( ) ); isAppended = true; } element.style.cssText += 'filter: url("#blur");'; } function E4XToDOM(xml) { return document.adoptNode( new DOMParser().parseFromString(xml.toXMLString(), "application/xml").documentElement ); }