// ==UserScript== // @name Ban Bad Websites 标记/屏蔽机器翻译 SEO 垃圾网站 // @namespace https://greasyfork.org/zh-CN/scripts/389721-ban-bad-websites // @version 0.2.17 // @description 标记/禁用垃圾网站链接。主要针对机器翻译 Stack overflow 等 SEO 垃圾网站。 // @author Phuker // @match *://*/* // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // - - - - - - - - - - Start User Config - - - - - - - - - - var option_disable_link = false; // - - - - - - - - - - End User config - - - - - - - - - - var hosts = { '机器翻译爬虫垃圾网站': [ 'codeday.me', 'code.i-harness.com', 'djcxy.com', 'voidcc.com', 'itranslater.com', 'kknews.cc', '1r1g.com', 'xbuba.com', 'voidcn.com', 'codenong.com', 'helplib.com', 'jishuwen.com', 'androidcookie.com', 'soinside.com', 'kbase101.com', 'bbsah.com', 'cn.computer-clans.com', 'uwenku.com', 'ojit.com', 'stackoverrun.com', 'mlog.club', 'it-swarm.net', 'bullforyou.com', 'it1352.com', 'itkeyword.com', 'kutu66.com', 'stackovernet.com', 'orcode.com', ], '垃圾爬虫采集 SEO 网站': [ 'z4q7.com', 'slowmotionvideoclips.com', 'bayouseo.com', '4659855.com', 'hotbarebaking.com', 'rsfaf.com', 'wanmeiyule2.com', 'ksa-boy.com', 'poolandspapartsmart.com', 'reallifetucson.com', 'fulucaijing.com', 'luxury-condos-miami.com', 'zkyshop.com', 'thehesedlove.com', 'dc120.com.cn', 'kaicen.cn', 'zhetiaohe.com', 'codecocoa.com', 'cctsuzhou.cn', 'juhc66.cn', 'artez.org.cn', 'hyhome.com.cn', 'bdqxgw.com', 'colabug.com', 'ohmyrss.com', ], '博彩垃圾网站': [ 'ceptchina.com', 'cwptz.com', 'danengtzs.com', 'dzim.net', 'lygzywl.com', 'meihuijj.com', 'rongtaihe1879.com', 'seaolife.com', 'stx160.com', 'tiyiba.com', 'winenine.com', 'xiaoxtea.com', 'zjwsrcw.com', ], '垃圾下载站': [ 'download.csdn.net', ], '垃圾中文技术性网站': [ 'jb51.net', 'blog.csdn.net', 'yq.aliyun.com', ] }; var urls = { '机器翻译爬虫垃圾网站': [ 'https://www.imooc.com/wenda', // http://www.imooc.com/wenda/detail/581525 'https://cloud.tencent.com/developer/ask', // https://cloud.tencent.com/developer/ask/69735 ], '垃圾 SEO 网站': [ 'https://help.aliyun.com/wordpower/', ], } var cursor_img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABj1BMVEX4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT4BlT////D56oEAAAAg3RSTlMAROOgDAAAAAyg40QARNX/+44LAACO+9VE4/////2QCwD//+Og+////5AK+6AMjv38k44MAAv//wD////8Cv+TCgAA/5MKAAAAAAALkP/8kAsAAAALkP3///2QCwAMjv3/jgyg+/////ug4////+NE1f/7jo77/9VEAETjoAwMoONEAJyONeEAAAABYktHRIRi0FpxAAAAB3RJTUUH4wEJAyMIrljkvAAAAOhJREFUGNNjYGBkYmZhZWNnZ2Pl4OTi5mHg5eMXEBQSFhERFhIV4xeXYJCUkpaRlZNXUJCXk5VRVFJmUFFVU9eQ1dTS0pTVUJfR1mHQ1dPXUNcwMDQ0AFKyRsYMJqZyQCkzc3MzIF9OiJXBQlhe08DM0srK0tpGU17YgoFdRMHW0NyqudnKzt7B0YkdScDZxdXN3YPB08vbB6LF188/IDCIITgkNAxiaHhEZFR0DENsXHwC1FqgSGISQ3JKahrMYeHpGZkMWdk5CKfn5OYx5BcUFhVDPFdSWlZewVBZVV1TC/F+XX1DYxMA6lI04KQBZEYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMDEtMDlUMDM6MzU6MDgrMDg6MDDq0TSKAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTAxLTA5VDAzOjM1OjA4KzA4OjAwm4yMNgAAAEN0RVh0c29mdHdhcmUAL3Vzci9sb2NhbC9pbWFnZW1hZ2ljay9zaGFyZS9kb2MvSW1hZ2VNYWdpY2stNy8vaW5kZXguaHRtbL21eQoAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADUxMo+NU4EAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgANTEyHHwD3AAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxNTQ2OTc2MTA4Y0VIZwAAABF0RVh0VGh1bWI6OlNpemUANjcyN0L99mrAAAAAYnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L25ld3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL2ZpbGVzLzExNy8xMTc1NzQ5LnBuZ54B8P8AAAAASUVORK5CYII='; // modified from PAC function dnsDomainIs(host, domain) { if(domain[0] === '.'){ domain = domain.substr(1); } var idx = host.length - domain.length; return (host === domain) || (idx > 0 && host.lastIndexOf('.' + domain) == idx - 1); } function ban_link(link, type){ if(link.hasAttribute('phuker-banned')){ return } else { link.setAttribute('phuker-banned', 'yes'); console.log('Ban Bad Website: ' + link.href + ' - ' + type); } link.setAttribute('title', type); link.style.cursor = 'url(' + cursor_img + '), not-allowed'; link.style['color'] = 'red'; if(option_disable_link){ link.style['pointerEvents'] = 'none'; link.style['textDecoration'] = 'none'; } } function process(link){ for(let type in hosts){ var h = hosts[type]; for(let i = 0; i < h.length; i++){ if(dnsDomainIs(link.hostname, h[i])){ ban_link(link, type) return } } } for(let type in urls){ var u = urls[type]; for(let i = 0; i < u.length; i++){ if(link.href.startsWith(u[i])){ ban_link(link, type) return } } } } function ban_bad_websites(){ var links = document.getElementsByTagName('a'); for(var i = 0; i < links.length; i++){ let link = links[i]; if(!link.hasAttribute('phuker-banned')){ process(link); } } } window.addEventListener('load', ban_bad_websites); setTimeout(ban_bad_websites, 3 * 1000); setTimeout(ban_bad_websites, 10 * 1000); })();