remove the posts which make you sick

移除讨厌鬼的帖子

当前为 2015-07-03 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name remove the posts which make you sick
  3. // @author burningall
  4. // @description 移除讨厌鬼的帖子
  5. // @version 2015.6.11.1
  6. // @include *tieba.baidu.com/p/*
  7. // @include *tieba.baidu.com/*
  8. // @include *tieba.baidu.com/f?*
  9. // @grant GM_addStyle
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @grant GM_listValues
  13. // @grant GM_deleteValue
  14. // @supportURL http://www.burningall.com
  15. // @contributionURL troy450409405@gmail.com|alipay.com
  16. // @namespace https://greasyfork.org/zh-CN/users/3400-axetroy
  17. // ==/UserScript==
  18.  
  19. //============快捷键==========
  20. //【Ctrl】+【F3】-----调出控制面板
  21. //============样式区==========
  22. var style='\
  23. body{\
  24. -webkit-backface-visibility: hidden;\
  25. }\
  26. .shutup-post{\
  27. position:absolute;\
  28. background-color:#07776E;\
  29. color:#fff;\
  30. right:0;\
  31. top:0;\
  32. padding:0 5px;\
  33. border:1px solid #988181;\
  34. cursor:pointer;\
  35. }\
  36. .shutup-list{\
  37. position:absolute;\
  38. background-color:#07776E;\
  39. color:#fff;\
  40. right:35px;\
  41. top:0;\
  42. padding:0 5px;\
  43. border:1px solid #988181;\
  44. cursor:pointer;\
  45. z-index:999999997;\
  46. }\
  47. .blur{\
  48. -webkit-filter: blur(10px);\
  49. -moz-filter: blur(10px);\
  50. -o-filter: blur(10px);\
  51. -ms-filter: blur(10px);\
  52. filter: blur(10px);\
  53. }\
  54. #pannal-troy{\
  55. width:200px;\
  56. height:auto;\
  57. background:#303030;\
  58. color:#fff;\
  59. position:fixed;\
  60. top:11%;\
  61. left:33%;\
  62. z-index:1000000000;\
  63. text-align:center;\
  64. }\
  65. #pannal-troy>div{\
  66. margin:10px 0;\
  67. }\
  68. #pannal-troy input{\
  69. color:#3e3e3e;\
  70. }\
  71. #pannal-troy h3{\
  72. color:rgb(0, 255, 226);\
  73. }\
  74. #fn input{\
  75. padding:5px;\
  76. margin:0 5px;\
  77. border:none;\
  78. cursor:pointer;\
  79. }\
  80. #fn input:hover{\
  81. background:#2A959D;\
  82. color:#fff;\
  83. }\
  84. #pannal-troy>span{\
  85. position:absolute;\
  86. padding:0 10px;\
  87. top:0;\
  88. right:0;\
  89. cursor:pointer;\
  90. opacity:0.8;\
  91. background:#fff;\
  92. color:#303030;\
  93. }\
  94. #blockWay{\
  95. color:#3e3e3e;\
  96. border:none;\
  97. }\
  98. #mars{\
  99. position:fixed;\
  100. width:100%;\
  101. height:100%;\
  102. background:rgba(155, 155, 155,0.5);\
  103. top:0;\
  104. left:0;\
  105. z-index:999999999;\
  106. }\
  107. #showList{\
  108. position:relative;\
  109. overflow-y:auto;\
  110. width:100%;\
  111. max-height:115px;\
  112. }\
  113. #showList>li{\
  114. width:100%;\
  115. height:18px;\
  116. clear:both;\
  117. }\
  118. .key{\
  119. float:left;\
  120. clear:both;\
  121. }\
  122. .deletThis{\
  123. float:right;\
  124. cursor:pointer;\
  125. }\
  126. .disable-btn{\
  127. background:#6B6B6B;\
  128. cursor:not-allowed;\
  129. }\
  130. ';
  131. GM_addStyle(style);
  132. //============公共函数区==========
  133. function addEvent(obj, event, fn) {
  134. return obj.addEventListener ? obj.addEventListener(event, fn, false) : obj.attachEventListener('on' + event, fn);
  135. };
  136. function getStyle(obj, attr) {
  137. return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
  138. };
  139. function $(id) {
  140. return document.getElementById(id)
  141. };
  142. function getSize(attr){
  143. return document.documentElement[attr] ? document.documentElement[attr] : document.body[attr]
  144. }
  145. //============主要代码区==========
  146. function juggUrl(){
  147. var url=location.href;
  148. var postIn=/.*tieba.baidu.com\/p\/.*/ig;
  149. var postList=/.*tieba.baidu.com\/(f\?.*|[^p])/ig;
  150. if( postIn.test(url) ){//如果是帖子内
  151. return 1;
  152. }else if( postList.test(url) ){//如果在帖子列表
  153. return 2;
  154. }
  155. }
  156. function createList(){
  157. $('showList').innerHTML='';
  158. var li='';
  159. for(var i=0;i<GM_listValues().length;i++){
  160. //控制台输出 键名:键值
  161. var key = GM_listValues()[i];
  162. var value = GM_getValue( GM_listValues()[i],'');
  163. if( (typeof value =='number' && value>1000) || value==''){
  164. console.log( GM_listValues()[i] + ":" + GM_getValue(GM_listValues()[i],'') );
  165. li += '<li class="show_list" data="'+ key +'">'+'<span class="key">'+key+'</span>'+'<input class="deletThis" type="button" value="删除"/>'+'</li>';
  166. }//if
  167. }//for
  168. $('showList').innerHTML=li;
  169. var aDeleBtn=document.querySelectorAll('.deletThis');
  170. for(var i=0;i<aDeleBtn.length;i++){
  171. aDeleBtn[i].onclick=function(){
  172. var thisKey = this.parentNode.getAttribute('data');//获取当前结点的key
  173. console.log(thisKey);
  174. GM_deleteValue( thisKey );//删除变量
  175. this.parentNode.remove( this.parentNode );//删除节点
  176. }//clickb
  177. }//for
  178. };
  179. function marks(obj){
  180. if(obj.querySelectorAll('mar').length>=1){
  181. return;
  182. }
  183. var oMar = document.createElement('div');
  184. oMar.className = 'mar';
  185. obj.style.position = 'relative';
  186. obj.style.webkitFilter = 'blur('+ GM_getValue('setting-gus','3') +'px)';//chrome
  187. obj.style.filter = 'blur('+ GM_getValue('setting-gus','3') +'px)';//firefox
  188. obj.style.oFilter = 'blur('+ GM_getValue('setting-gus','3') +'px)';//opera
  189. obj.style.msFilter = 'blur('+ GM_getValue('setting-gus','3') +'px)';//IE
  190. obj.style.webkitBackfaceVisibility = 'hidden';
  191. obj.appendChild( oMar );
  192. oMar.style.width = parseInt( getStyle(obj,'width') ) + 'px';
  193. oMar.style.height = parseInt( getStyle(obj,'height') ) + 'px';
  194. oMar.style.background = GM_getValue('setting-col','#fff');
  195. oMar.style.position = 'absolute';
  196. oMar.style.top = '0';
  197. oMar.style.left = '0';
  198. oMar.style.zIndex = '999999998';
  199. oMar.style.opacity = GM_getValue('setting-opa','0.8');
  200. oMar.style.filter = 'alpha(opacity=' + GM_getValue('setting-opa','0.8')*100 +')';
  201. };
  202. function blockMod(){
  203. if( GM_getValue('setting-blockWay','遮罩屏蔽')=='遮罩屏蔽' ){
  204. return 1;//遮罩模式
  205. }else{
  206. return 2;//删除节点
  207. }
  208. }
  209. function btclick(This,list,n){
  210. var _thisTop,_thisUserId,_thisUserName,nowUserId,nowUserName;
  211. if(n==5){
  212. _thisTop = This.parentNode.parentNode.parentNode.parentNode.parentNode;//当前结点,5层父节点,帖子列表
  213. _thisUserId = JSON.parse(_thisTop.getAttribute('data-field')).id;//当前id
  214. _thisUserName = JSON.parse(_thisTop.getAttribute('data-field')).author_name;//当前userName
  215. }else if(n==4){
  216. _thisTop = This.parentNode.parentNode.parentNode.parentNode;//当前结点,4层父节点,帖子里
  217. _thisUserId = JSON.parse(_thisTop.getAttribute('data-field')).author.user_id;//当前id
  218. _thisUserName = JSON.parse(_thisTop.getAttribute('data-field')).author.user_name;//当前userName
  219. }
  220. if ( confirm('是否屏蔽') == true) { //如果按下确认
  221. GM_setValue( _thisUserName,_thisUserId );
  222. for (var j = 0; j < list.length; j++) {//循环匹配是否符合
  223. if(n==5){
  224. nowUserId = JSON.parse(list[j].getAttribute('data-field')).id;
  225. nowUserName = JSON.parse(list[j].getAttribute('data-field')).author_name;
  226. }else if(n==4){
  227. nowUserId = JSON.parse(list[j].getAttribute('data-field')).author.user_id;
  228. nowUserName = JSON.parse(list[j].getAttribute('data-field')).author.user_name;
  229. }
  230. if (nowUserId == _thisUserId || nowUserName==_thisUserName) {//匹配成功
  231. if( blockMod()==1 ){//遮罩模式
  232. marks(list[j]);
  233. }else{//删除节点模式
  234. list[j].style.display = 'none';
  235. }
  236. }//匹配是否符
  237. } //for
  238. }//if如果按下确认
  239. }
  240. function block(name,id,list,I){
  241. for(var j=0;j<GM_listValues().length;j++){
  242. if( GM_listValues()[j] == name || GM_getValue(GM_listValues()[j],'') == id ){//如果匹配到
  243. if( blockMod()==1 ){//遮罩模式
  244. marks(list[I]);
  245. }else{//删除节点模式
  246. list[I].style.display = 'none';
  247. }
  248. }//匹配是否符合
  249. }//for,遍历屏蔽
  250. }
  251. function init() {//初始化程序
  252. //先清空
  253. var aBlockBtn = document.querySelectorAll('.shutup-post,.shutup-list,.mar')
  254. for(var i=0;i<aBlockBtn.length;i++){
  255. aBlockBtn[i].remove(this);
  256. }
  257. //=======帖子内==========
  258. if( juggUrl()==1 ){
  259. var aUsers = document.querySelectorAll('#j_p_postlist>div[data-field]');//获取列表
  260. var aName = document.querySelectorAll('.j_l_post>.d_author .d_name');//屏蔽按钮将要插入的位置
  261. for (var i = 0; i < aUsers.length; i++) {
  262. //获取id和name
  263. var userName = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_name;//第i个userName
  264. var userId = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_id;//第i个userId
  265. //创建屏蔽按钮
  266. var oDiv = document.createElement('div');
  267. oDiv.className = "shutup-post";
  268. oDiv.innerHTML = '<p>屏<p><p>蔽</p>';
  269. aName[i].appendChild(oDiv);
  270. var aShut = document.querySelectorAll('.shutup-post');
  271. //给按钮添加点击事件
  272. aShut[i].onclick=function(){
  273. var this_=this;
  274. btclick(this_,aUsers,4);
  275. }
  276. //页面加载开始屏蔽
  277. block(userName,userId,aUsers,i);
  278. } //for,遍历所有节点
  279. //=======帖子列表==========
  280. }else if( juggUrl()==2 ){
  281. var aUsers=document.querySelectorAll('#thread_list>li[data-field]');//获取列表
  282. var aName = document.querySelectorAll('#thread_list>.j_thread_list>.t_con>.col2_right>.threadlist_lz>.threadlist_author');//屏蔽按钮将要插入的位置
  283. for(var i=0;i<aUsers.length;i++){
  284. //获取id和name
  285. var userName = JSON.parse(aUsers[i].getAttribute('data-field')).author_name;//第i个userName
  286. var userId = JSON.parse(aUsers[i].getAttribute('data-field')).id;//第i个userId
  287. //创建屏蔽按钮
  288. var oDiv = document.createElement('div');
  289. oDiv.className = "shutup-list";
  290. oDiv.innerHTML = '<p>屏<p><p>蔽</p>';
  291. aName[i].appendChild(oDiv);
  292. var aShut = document.querySelectorAll('.shutup-list');
  293. //给按钮添加点击事件
  294. aShut[i].onclick=function(){
  295. var this_=this;
  296. btclick(this_,aUsers,5);
  297. }
  298. //页面加载开始屏蔽
  299. block(userName,userId,aUsers,i)
  300. }//for,遍历所有节点
  301. }//在帖子列表
  302. }//初始化
  303. //============执行区==========
  304. addEvent(window,'load',function(){
  305. init();
  306. })
  307. //跟随翻页加载
  308. var aUsers,aShut;
  309. addEvent(window,'scroll',function(){
  310. if( getSize('scrollTop') == 0){
  311. if( juggUrl()==1 ){//帖子内
  312. aUsers = document.querySelectorAll('#j_p_postlist>div[data-field]');
  313. aShut = document.querySelectorAll('.shutup-post');
  314. }else if(juggUrl()==2){//帖子列表
  315. aUsers=document.querySelectorAll('#thread_list>li[data-field]');
  316. aShut = document.querySelectorAll('.shutup-list');
  317. }
  318. if(aShut.length <= aUsers.length){//如果不存在屏蔽按钮
  319. init();
  320. }
  321. }//如果滚动到顶部
  322. })
  323. //============控制面板以及相关==========
  324. addEvent(window,'keyup',function(e){
  325. var e = e || window.event;
  326. if( e.ctrlKey && e.keyCode==114 ){//快捷键ctrl+F3
  327. if( $('pannal-troy') ) return;
  328. var pannal = document.createElement('div');
  329. var pannal_mars = document.createElement('div');
  330. pannal_mars.id = 'mars';
  331. pannal_mars.className = "blur";
  332. pannal.id = 'pannal-troy';
  333. pannal.innerHTML='\
  334. <h3>配置参数</h3>\
  335. <div id="pannal-setting">\
  336. 屏蔽方式:<select id="blockWay">\
  337. <option>遮罩屏蔽</option>\
  338. <option>删除节点</option>\
  339. </select><br/>\
  340. 遮罩层颜色:<input id="col" type="color" value="颜色" /><input type="text" id="col-text" placeholder="#fff(默认16进制)"/><br/>\
  341. 遮罩透明度(0~1):<input id="opa" type="text" placeholder="0.8(默认)" /><br/>\
  342. 高斯模糊像素(px):<input id="gus" type="text" placeholder="3(默认)" /><br/>\
  343. </div>\
  344. <hr/>\
  345. <h3>添加屏蔽</h3>\
  346. <div id="addBlackList">\
  347. 数字ID(选填):<input id="userId" type="text" placeholder="user_id"/><br/>\
  348. 贴吧ID(必填):<input id="userName" type="text" placeholder="user_name"/>\
  349. </div>\
  350. <hr/>\
  351. <h3>功能</h3>\
  352. <div id="fn">\
  353. <input id="save" type="button" value="保存" />\
  354. <input id="clear" type="button" value="清空" />\
  355. <input id="view" type="button" value="查看" />\
  356. </div>\
  357. <hr/>\
  358. <h3>屏蔽列表</h3>\
  359. <div>\
  360. <ul id="showList"></ul>\
  361. </div>\
  362. <span id="queit">X</span>\
  363. '
  364. document.body.appendChild( pannal );
  365. document.body.appendChild( pannal_mars );
  366. //初始化
  367. $('blockWay').value = GM_getValue('setting-blockWay','遮罩屏蔽' );//屏蔽方式
  368. $('col').value = GM_getValue('setting-col','#fff'); //默认遮罩的颜色
  369. $('col-text').value = $('col').value; //默认遮罩的颜色,显示文本
  370. $('opa').value = GM_getValue('setting-opa','0.8'); //默认遮罩透明度
  371. $('gus').value = GM_getValue('setting-gus','3'); //默认遮罩下的高斯模糊半径
  372. createList(); //加载黑名单列表
  373. addEvent($('blockWay'),'input',function(){
  374. var aInput=[$('col'),$('col-text'),$('opa'),$('gus')]
  375. if( $('blockWay').value == '删除节点' ){//删除节点模式
  376. for(var i=0;i<aInput.length;i++){
  377. aInput[i].readOnly = 'true';
  378. aInput[i].className = 'disable-btn';
  379. }
  380. }else{//遮罩屏蔽模式模式
  381. for(var i=0;i<aInput.length;i++){
  382. aInput[i].readOnly = 'false';
  383. aInput[i].className = '';
  384. }
  385. }
  386. })
  387. addEvent($('col'),'input',function(){
  388. $('col-text').value = $('col').value;
  389. })
  390. addEvent($('col-text'),'input',function(){
  391. $('col').value = $('col-text').value;
  392. })
  393. //====保存按钮====
  394. addEvent($('save'),'click',function(){
  395. //判断屏蔽方式
  396. if($('blockWay').value=='遮罩屏蔽'){
  397. GM_setValue('setting-blockWay','遮罩屏蔽');
  398. }else if($('blockWay').value=='删除节点'){
  399. GM_setValue('setting-blockWay','删除节点');
  400. }
  401. //遮罩颜色
  402. GM_setValue('setting-col',$('col').value);
  403. //遮罩透明度
  404. if( $('opa').value!='' && $('opa').value>0 && $('opa').value<1 ){//透明度有添加,并且0~1
  405. GM_setValue('setting-opa',$('opa').value);
  406. }
  407. //高斯模糊半径
  408. if( $('gus').value!='' && $('gus').value>0){
  409. GM_setValue('setting-gus',$('gus').value);
  410. }
  411. //匹配ID是否正确
  412. var reg=/^[0-9]{9}$/ig;
  413. if( $('userName').value!='' && (reg.test($('userId').value)==true || $('userId').value=='') ){
  414. //保存形式:user_name:user_id
  415. GM_setValue( $('userName').value,$('userId').value );
  416. alert('保存成功' + "\n用户名:" + $('userName').value + "\nID:" + GM_getValue($('userName').value,'') + '\n屏蔽方式:'+ GM_getValue('setting-blockWay','遮罩屏蔽' )+'\n遮罩颜色:' + GM_getValue('setting-col','#fff') + '\n遮罩透明度:'+ GM_getValue('setting-opa','0.8') +'\n高斯模糊:'+GM_getValue('setting-gus','3') );
  417. }else if( $('userName').value=='' && $('userId').value==''){
  418. alert('保存成功\n屏蔽方式:'+ GM_getValue('setting-blockWay','遮罩屏蔽' )+'\n遮罩颜色:' + GM_getValue('setting-col','#fff') + '\n遮罩透明度:'+ GM_getValue('setting-opa','0.8') +'\n高斯模糊:'+GM_getValue('setting-gus','3') )
  419. }else{
  420. alert('输入不正确:\n数字ID:选填(如果填了必须是9位数字)\n贴吧ID:必填')
  421. }
  422. createList();//重新生成列表
  423. })
  424. //====清空按钮====
  425. addEvent($('clear'),'click',function(){
  426. for(var i=0;i<GM_listValues().length;i++){
  427. //清空所有变量
  428. //GM_deleteValue( GM_listValues()[i] ) + ":" + GM_getValue( GM_listValues()[i],'' )
  429. var value = GM_getValue( GM_listValues()[i],'');
  430. if( (typeof value=='number' && value>1000) || value==''){
  431. GM_deleteValue( GM_listValues()[i] );//删除键名
  432. }
  433. }//for
  434. createList();//重新生成列表
  435. })
  436. //====清空按钮====
  437. addEvent($('view'),'click',function(){
  438. createList();//生成列表
  439. })
  440. //===关闭按钮====
  441. addEvent($('queit'),'click',function(){
  442. $('pannal-troy').remove(this);
  443. $('mars').remove(this);
  444. })
  445. addEvent($('mars'),'click',function(){
  446. $('pannal-troy').remove(this);
  447. $('mars').remove(this);
  448. })
  449. }//if
  450. })//addEvent