remove the posts which make you sick

移除讨厌鬼的帖子

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

  1. // ==UserScript==
  2. // @name remove the posts which make you sick
  3. // @author burningall
  4. // @description 移除讨厌鬼的帖子
  5. // @version 2015.7.4.2.3
  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. .blur{\
  27. -webkit-filter: blur(10px);\
  28. -moz-filter: blur(10px);\
  29. -o-filter: blur(10px);\
  30. -ms-filter: blur(10px);\
  31. filter: blur(10px);\
  32. }\
  33. #pannal-troy{\
  34. width:200px;\
  35. height:auto;\
  36. background:#303030;\
  37. color:#fff;\
  38. position:fixed;\
  39. z-index:1000000000;\
  40. text-align:center;\
  41. }\
  42. #pannal-troy>div{\
  43. margin:10px 0;\
  44. }\
  45. #pannal-troy input{\
  46. color:#3e3e3e;\
  47. }\
  48. #pannal-troy h3{\
  49. color:rgb(0, 255, 226);\
  50. }\
  51. #pannal-setting input[type=range]{\
  52. width:80%;\
  53. }\
  54. #fn input{\
  55. padding:5px;\
  56. margin:0 5px;\
  57. border:none;\
  58. cursor:pointer;\
  59. }\
  60. #fn input:hover{\
  61. background:#2A959D;\
  62. color:#fff;\
  63. }\
  64. #pannal-troy>span{\
  65. position:absolute;\
  66. padding:0 10px;\
  67. top:0;\
  68. right:0;\
  69. cursor:pointer;\
  70. opacity:0.8;\
  71. background:#fff;\
  72. color:#303030;\
  73. }\
  74. #blockWay{\
  75. color:#3e3e3e;\
  76. border:none;\
  77. }\
  78. #mars{\
  79. position:fixed;\
  80. width:100%;\
  81. height:100%;\
  82. background:rgba(155, 155, 155,0.5);\
  83. top:0;\
  84. left:0;\
  85. z-index:999999999;\
  86. }\
  87. #showList{\
  88. position:relative;\
  89. overflow-y:auto;\
  90. width:100%;\
  91. max-height:115px;\
  92. }\
  93. #showList>li{\
  94. width:100%;\
  95. height:18px;\
  96. clear:both;\
  97. }\
  98. .key{\
  99. float:left;\
  100. clear:both;\
  101. }\
  102. .deletThis{\
  103. float:right;\
  104. cursor:pointer;\
  105. }\
  106. .disable-btn{\
  107. background:#6B6B6B;\
  108. cursor:not-allowed;\
  109. }\
  110. #addBlackList input{\
  111. width:80%;\
  112. }\
  113. #thread_list>li[data-field] .threadlist_lz>.threadlist_author,.l_post .d_name{\
  114. background:#303030;\
  115. }\
  116. ';
  117. GM_addStyle(style);
  118. //============公共函数区==========
  119. function addEvent(obj, event, fn) {
  120. return obj.addEventListener ? obj.addEventListener(event, fn, false) : obj.attachEventListener('on' + event, fn);
  121. };
  122. function getStyle(obj, attr) {
  123. return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
  124. };
  125. function $(id) {
  126. return document.getElementById(id)
  127. };
  128. function getSize(attr){
  129. return document.documentElement[attr] ? document.documentElement[attr] : document.body[attr]
  130. }
  131. function uniqueArray(data){
  132. data = data || [];
  133. var a = {};
  134. for (var i=0; i<data.length; i++) {
  135. var v = data[i];
  136. if (typeof(a[v]) == 'undefined'){
  137. a[v] = 1;
  138. }
  139. };
  140. data.length=0;
  141. for (var i in a){
  142. data[data.length] = i;
  143. }
  144. return data;
  145. }
  146. //============主要代码区==========
  147. function juggUrl(){
  148. var url=location.href;
  149. var postIn=/.*tieba.baidu.com\/p\/.*/ig;
  150. var postList=/.*tieba.baidu.com\/(f\?.*|[^p])/ig;
  151. if( postIn.test(url) ){//如果是帖子内
  152. return 1;
  153. }else if( postList.test(url) ){//如果在帖子列表
  154. return 2;
  155. }
  156. }
  157. function createList(){
  158. $('showList').innerHTML='';
  159. var li='';
  160. for(var i=0;i<GM_listValues().length;i++){
  161. //控制台输出 键名:键值
  162. var key = GM_listValues()[i];
  163. var value = GM_getValue( GM_listValues()[i],'');
  164. if( (typeof value =='number' && value>1000) || value==''){
  165. //console.log( GM_listValues()[i] + ":" + GM_getValue(GM_listValues()[i],'') );
  166. li += '<li class="show_list" data="'+ key +'">'+'<span class="key">'+key+'</span>'+'<input class="deletThis" type="button" value="删除"/>'+'</li>';
  167. }//if
  168. }//for
  169. $('showList').innerHTML=li;
  170. var aDeleBtn=document.querySelectorAll('.deletThis');
  171. for(var i=0;i<aDeleBtn.length;i++){
  172. aDeleBtn[i].onclick=function(){
  173. var thisKey = this.parentNode.getAttribute('data');//获取当前结点的key
  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','#ffffff');
  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.  
  210. function btclick(This,list,n){
  211. var _thisTop,_thisUserId,_thisUserName,nowUserId,nowUserName;
  212. if(n=='postList'){
  213. _thisTop = This.parentNode.parentNode.parentNode.parentNode;
  214. _thisUserId = JSON.parse(_thisTop.getAttribute('data-field')).id;//当前id
  215. _thisUserName = JSON.parse(_thisTop.getAttribute('data-field')).author_name;//当前userName
  216. }else if(n=='post'){
  217. _thisTop = This.parentNode.parentNode.parentNode;
  218. _thisUserId = JSON.parse(_thisTop.getAttribute('data-field')).author.user_id;//当前id
  219. _thisUserName = JSON.parse(_thisTop.getAttribute('data-field')).author.user_name;//当前userName
  220. }
  221. if ( confirm('是否屏蔽') == true) { //如果按下确认
  222. GM_setValue( _thisUserName,_thisUserId );
  223. for (var j = 0; j < list.length; j++) {//循环匹配是否符合
  224. var userInfo = JSON.parse(list[j].getAttribute('data-field'))
  225. if(n=='postList'){
  226. nowUserId = userInfo.id;
  227. nowUserName = userInfo.author_name;
  228. }else if(n=='post'){
  229. nowUserId = userInfo.author.user_id;
  230. nowUserName = userInfo.author.user_name;
  231. }
  232. if (nowUserId == _thisUserId || nowUserName==_thisUserName) {//匹配成功
  233. if( blockMod()==1 ){//遮罩模式
  234. marks(list[j]);
  235. }else{//删除节点模式
  236. list[j].style.display = 'none';
  237. }
  238. }//匹配是否符
  239. } //for
  240. }//if如果按下确认
  241. }
  242.  
  243. /*
  244. function btclick(This,list,n,id,name){
  245. var _thisTop,_thisUserId,_thisUserName,nowUserId,nowUserName;
  246. if(n=='postList'){
  247. _thisTop = This.parentNode.parentNode.parentNode.parentNode;
  248. }else if(n=='post'){
  249. _thisTop = This.parentNode.parentNode.parentNode;
  250. }
  251. _thisUserId = JSON.parse(_thisTop.getAttribute('data-field'))[id];//当前id
  252. _thisUserName = JSON.parse(_thisTop.getAttribute('data-field'))[name];//当前userName
  253. if ( confirm('是否屏蔽') == true) { //如果按下确认
  254. GM_setValue( _thisUserName,_thisUserId );
  255. for (var j = 0; j < list.length; j++) {//循环匹配是否符合
  256. var userInfo = JSON.parse(list[j].getAttribute('data-field'))
  257. nowUserId = userInfo[id];
  258. nowUserName = userInfo[name];
  259. if (nowUserId == _thisUserId || nowUserName==_thisUserName) {//匹配成功
  260. if( blockMod()==1 ){//遮罩模式
  261. marks(list[j]);
  262. }else{//删除节点模式
  263. list[j].style.display = 'none';
  264. }
  265. }//匹配是否符
  266. } //for
  267. }//if如果按下确认
  268. }
  269. */
  270. function block(name,id,list,I){
  271. for(var j=0;j<GM_listValues().length;j++){
  272. if( GM_listValues()[j] == name || GM_getValue(GM_listValues()[j],'') == id ){//如果匹配到
  273. if( blockMod()==1 ){//遮罩模式
  274. marks(list[I]);
  275. }else{//删除节点模式
  276. list[I].style.display = 'none';
  277. }
  278. }//匹配是否符合
  279. }//for,遍历屏蔽
  280. }
  281.  
  282. function autoTips(){
  283. var aUsers,userName,userId;
  284. if( juggUrl()==1 ){//帖子内
  285. var aTipsArr = new Array();
  286. var newString = '';
  287. aUsers = document.querySelectorAll('#j_p_postlist>div[data-field]');//获取列表
  288. for(var i=0;i<aUsers.length;i++){
  289. userName = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_name;//第i个userName
  290. userId = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_id;//第i个userId
  291. aTipsArr.push( userName );
  292. }
  293. uniqueArray( aTipsArr );
  294. for(var i=0;i<aTipsArr.length;i++){
  295. newString += '<option value="' + aTipsArr[i] + '" />';
  296. }
  297. lst.innerHTML = newString;
  298. }else{//帖子列表
  299. var aTipsArr = new Array();
  300. var newString = '';
  301. aUsers=document.querySelectorAll('#thread_list>li[data-field]');//获取列表
  302. for(var i=0;i<aUsers.length;i++){
  303. userName = JSON.parse(aUsers[i].getAttribute('data-field')).author_name;//第i个userName
  304. userId = JSON.parse(aUsers[i].getAttribute('data-field')).id;//第i个userId
  305. aTipsArr.push( userName );
  306. }
  307. uniqueArray( aTipsArr );
  308. for(var i=0;i<aTipsArr.length;i++){
  309. newString += '<option value="' + aTipsArr[i] + '" />';
  310. }
  311. lst.innerHTML = newString;
  312. }//if....else
  313. }
  314. /*
  315. function createTips(list){
  316. var aTipsArr = [];
  317. var newString = '';
  318. aUsers=document.querySelectorAll(list);//获取列表
  319. for(var i=0;i<aUsers.length;i++){
  320. userName = JSON.parse(aUsers[i].getAttribute('data-field'))[name];//第i个userName
  321. aTipsArr.push( userName );
  322. }
  323. uniqueArray( aTipsArr );
  324. for(var i=0;i<aTipsArr.length;i++){
  325. newString += '<option value="' + aTipsArr[i] + '" />';
  326. }
  327. $('lst').innerHTML = newString;
  328. }
  329. function autoTips(){
  330. var aUsers,userName,userId;
  331. if( juggUrl()==1 ){
  332. createTips('#j_p_postlist>div[data-field]','author.user_name');
  333. }else{
  334. createTips('#thread_list>li[data-field]','author_name');
  335. }
  336. }
  337. */
  338. function init() {//初始化程序
  339. //先清空
  340. var aBlockBtn = document.querySelectorAll('.shutup-post,.shutup-list,.mar')
  341. for(var i=0;i<aBlockBtn.length;i++){
  342. aBlockBtn[i].remove(this);
  343. }
  344. //=======帖子内==========
  345. if( juggUrl()==1 ){
  346. var aUsers = document.querySelectorAll('#j_p_postlist>div[data-field]');//获取列表
  347. var aName = document.querySelectorAll('.l_post .d_name');//屏蔽按钮将要插入的位置
  348. for (var i = 0; i < aUsers.length; i++) {
  349. //获取id和name
  350. var userName = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_name;//第i个userName
  351. var userId = JSON.parse(aUsers[i].getAttribute('data-field')).author.user_id;//第i个userId
  352. //添加点击事件
  353. aName[i].onclick=function(){
  354. var this_=this;
  355. btclick(this_,aUsers,'post','author[user_id]','author[user_name]');
  356. }
  357. //页面加载开始屏蔽
  358. block(userName,userId,aUsers,i);
  359. } //for,遍历所有节点
  360. //=======帖子列表==========
  361. }else if( juggUrl()==2 ){
  362. var aUsers=document.querySelectorAll('#thread_list>li[data-field]');//获取列表
  363. var aName = document.querySelectorAll('#thread_list>li[data-field] .threadlist_lz>.threadlist_author');//屏蔽按钮将要插入的位置
  364. for(var i=0;i<aUsers.length;i++){
  365. //获取id和name
  366. var userName = JSON.parse(aUsers[i].getAttribute('data-field')).author_name;//第i个userName
  367. var userId = JSON.parse(aUsers[i].getAttribute('data-field')).id;//第i个userId
  368. //添加点击事件
  369. aName[i].onclick=function(){
  370. var this_=this;
  371. btclick(this_,aUsers,'postList','id','author_name');
  372. }
  373. //页面加载开始屏蔽
  374. block(userName,userId,aUsers,i)
  375. }//for,遍历所有节点
  376. }//在帖子列表
  377. }//初始化
  378. //============执行区==========
  379. addEvent(window,'load',function(){
  380. init();
  381. })
  382. //跟随翻页加载
  383. var aUsers,aShut;
  384. addEvent(window,'scroll',function(){
  385. if( getSize('scrollTop') == 0){
  386. if( juggUrl()==1 ){//帖子内
  387. aUsers = document.querySelectorAll('#j_p_postlist>div[data-field]');
  388. aShut = document.querySelectorAll('.shutup-post');
  389. }else if(juggUrl()==2){//帖子列表
  390. aUsers=document.querySelectorAll('#thread_list>li[data-field]');
  391. aShut = document.querySelectorAll('.shutup-list');
  392. }
  393. if(aShut.length <= aUsers.length){//如果不存在屏蔽按钮
  394. init();
  395. }
  396. }//如果滚动到顶部
  397. })
  398. //============控制面板以及相关==========
  399. addEvent(window,'resize',function(){
  400. if( $('pannal-troy') ){
  401. $('pannal-troy').style.top = ( getSize('clientHeight') - $('pannal-troy').offsetHeight )/2 + 'px';
  402. $('pannal-troy').style.left = ( getSize('clientWidth') - $('pannal-troy').offsetWidth )/2 + 'px';
  403. }
  404. })
  405. addEvent(window,'keyup',function(e){
  406. var e = e || window.event;
  407. if( e.ctrlKey && e.keyCode==114 ){//快捷键ctrl+F3
  408. if( $('pannal-troy') ) return;
  409. var pannal = document.createElement('div');
  410. var pannal_mars = document.createElement('div');
  411. pannal_mars.id = 'mars';
  412. pannal_mars.className = "blur";
  413. pannal.id = 'pannal-troy';
  414. pannal.innerHTML='\
  415. <h3>配置参数</h3>\
  416. <div id="pannal-setting">\
  417. 屏蔽方式:<select id="blockWay">\
  418. <option>遮罩屏蔽</option>\
  419. <option>删除节点</option>\
  420. </select><br/>\
  421. 遮罩层颜色:<input id="col" type="color" /><br/>\
  422. 遮罩透明度(0~1):<span id="opa-text"></span><input id="opa" type="range" min="0" max="1" step="0.1" /><br/>\
  423. 高斯模糊像素(0~10):<span id="gus-text"></span><input id="gus" type="range" min="0" max="10" step="1" /><br/>\
  424. </div>\
  425. <hr/>\
  426. <h3>添加讨厌鬼</h3>\
  427. <div id="addBlackList">\
  428. 数字ID(选填):<input id="userId" type="text" placeholder="user_id"/><br/>\
  429. 贴吧ID(必填):<input id="userName" type="text" placeholder="user_name" list="lst" autocomplete="off"/>\
  430. <datalist id="lst" autocomplete="on"></datalist>\
  431. </div>\
  432. <hr/>\
  433. <h3>功能</h3>\
  434. <div id="fn">\
  435. <input id="save" type="button" value="保存" />\
  436. <input id="clear" type="button" value="清空" />\
  437. <input id="view" type="button" value="查看" />\
  438. </div>\
  439. <hr/>\
  440. <h3>屏蔽列表</h3>\
  441. <div>\
  442. <ul id="showList"></ul>\
  443. </div>\
  444. <span id="queit">X</span>\
  445. '
  446. document.body.appendChild( pannal );
  447. document.body.appendChild( pannal_mars );
  448. pannal.style.top = ( getSize('clientHeight') - pannal.offsetHeight )/2 + 'px';
  449. pannal.style.left = ( getSize('clientWidth') - pannal.offsetWidth )/2 + 'px';
  450. //初始化
  451. $('blockWay').value = GM_getValue('setting-blockWay','遮罩屏蔽' );//屏蔽方式
  452. $('col').value = GM_getValue('setting-col','#ffffff'); //默认遮罩的颜色
  453. $('opa').value = GM_getValue('setting-opa','0.8'); //默认遮罩透明度
  454. $('opa-text').innerHTML = $('opa').value;
  455. $('gus').value = GM_getValue('setting-gus','3'); //默认遮罩下的高斯模糊半径
  456. $('gus-text').innerHTML = $('gus').value;
  457. createList(); //加载黑名单列表
  458. addEvent($('opa'),'input',function(){
  459. $('opa-text').innerHTML = $('opa').value;
  460. })
  461. addEvent($('gus'),'input',function(){
  462. $('gus-text').innerHTML = $('gus').value;
  463. })
  464. //智能提示userName和userId
  465. addEvent($('userName'),'input',function(){
  466. autoTips();
  467. })
  468. //删除节点模式则禁用选项
  469. addEvent($('blockWay'),'input',function(){
  470. var aInput=[$('col'),$('opa'),$('gus')]
  471. if( $('blockWay').value == '删除节点' ){//删除节点模式
  472. for(var i=0;i<aInput.length;i++){
  473. aInput[i].readOnly = 'true';
  474. aInput[i].className = 'disable-btn';
  475. }
  476. }else{//遮罩屏蔽模式模式
  477. for(var i=0;i<aInput.length;i++){
  478. aInput[i].readOnly = 'false';
  479. aInput[i].className = '';
  480. }
  481. }
  482. })
  483. //====保存按钮====
  484. addEvent($('save'),'click',function(){
  485. //判断屏蔽方式
  486. if($('blockWay').value=='遮罩屏蔽'){
  487. GM_setValue('setting-blockWay','遮罩屏蔽');
  488. }else if($('blockWay').value=='删除节点'){
  489. GM_setValue('setting-blockWay','删除节点');
  490. }
  491. //遮罩颜色
  492. GM_setValue('setting-col',$('col').value);
  493. //遮罩透明度1
  494. GM_setValue('setting-opa',$('opa').value);
  495. //高斯模糊半径
  496. GM_setValue('setting-gus',$('gus').value);
  497. //匹配ID是否正确
  498. var reg=/^[0-9]{9}$/ig;
  499. if( $('userName').value!='' && (reg.test($('userId').value)==true || $('userId').value=='') ){
  500. //保存形式:user_name:user_id
  501. GM_setValue( $('userName').value,$('userId').value );
  502. 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') );
  503. }else if( $('userName').value=='' && $('userId').value==''){
  504. 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') )
  505. }else{
  506. alert('输入不正确:\n数字ID:选填(如果填了必须是9位数字)\n贴吧ID:必填')
  507. }
  508. createList();//重新生成列表
  509. })
  510. //====清空按钮====
  511. addEvent($('clear'),'click',function(){
  512. for(var i=0;i<GM_listValues().length;i++){
  513. //清空所有变量
  514. //GM_deleteValue( GM_listValues()[i] ) + ":" + GM_getValue( GM_listValues()[i],'' )
  515. var value = GM_getValue( GM_listValues()[i],'');
  516. if( (typeof value=='number' && value>1000) || value==''){
  517. GM_deleteValue( GM_listValues()[i] );//删除键名
  518. }
  519. }//for
  520. createList();//重新生成列表
  521. })
  522. //====查看按钮====
  523. addEvent($('view'),'click',function(){
  524. createList();//生成列表
  525. })
  526. //===关闭按钮====
  527. addEvent($('queit'),'click',function(){
  528. $('pannal-troy').remove(this);
  529. $('mars').remove(this);
  530. })
  531. addEvent($('mars'),'click',function(){
  532. $('pannal-troy').remove(this);
  533. $('mars').remove(this);
  534. })
  535. }//if
  536. })//addEvent