Gamersky User Blacklist

手动实现游民星空用户拉黑

  1. // ==UserScript==
  2. // @name Gamersky User Blacklist
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.5
  5. // @description 手动实现游民星空用户拉黑
  6. // @author zib
  7. // @match *://*.gamersky.com/news/*
  8. // @match *://*.gamersky.com/tech/*
  9. // @icon https://www.gamersky.com/favicon.ico
  10. // @grant GM_setValue
  11. // @grant GM_getValue
  12. // @license BSD
  13. // ==/UserScript==
  14.  
  15. let storageBlacklist = GM_getValue('gamersky_blacklist') ? JSON.parse(GM_getValue('gamersky_blacklist')) : [];
  16.  
  17. let showPanel = (GM_getValue('show_panel') === undefined || GM_getValue('show_panel') === null) ? 1 : GM_getValue('show_panel');
  18.  
  19. function addToBlacklist(e) {
  20. if (e.stopPropagation) e.stopPropagation();
  21.  
  22. if (e.preventDefault) e.preventDefault();
  23.  
  24. const uid = e.target.parentElement.getAttribute('uid');
  25.  
  26. const name = e.target.previousSibling.textContent;
  27.  
  28. const ok = confirm(`是否拉黑 uid:${uid} 昵称:${name}?`);
  29.  
  30. if (ok) {
  31. if (storageBlacklist.some((i) => i.uid == uid)) {
  32. storageBlacklist = storageBlacklist.map((i) => {
  33. if (i.uid == uid) {
  34. return { uid, name };
  35. } else {
  36. return i;
  37. }
  38. })
  39. } else {
  40. storageBlacklist.push({ uid, name });
  41. }
  42.  
  43. GM_setValue('gamersky_blacklist', JSON.stringify(storageBlacklist));
  44.  
  45. deleteAllUnameParentContOrCon(e.target);
  46.  
  47. refreshBlacklistManagePanel();
  48. }
  49.  
  50. return false;
  51. }
  52.  
  53. function deleteUnameParentContOrCon(el) {
  54. while (1) {
  55. el = el.parentElement;
  56.  
  57. if (!el) {
  58. break;
  59. }
  60.  
  61. if (el.classList.contains('cmt_cont') || el.classList.contains('cmt_reply_con')) {
  62. if (!el.classList.contains('disable_comment')) {
  63. el.classList.add('disable_comment');
  64. }
  65.  
  66. break;
  67. }
  68. }
  69. }
  70.  
  71. function deleteAllUnameParentContOrCon() {
  72. document.querySelectorAll('.Comment a.uname').forEach((i) => {
  73. const currentUid = i.getAttribute('uid');
  74.  
  75. if (storageBlacklist.some((j) => j.uid == currentUid)) {
  76. deleteUnameParentContOrCon(i);
  77. }
  78. })
  79. }
  80.  
  81. function appendAddBlacklistBtn() {
  82. document.querySelectorAll('.Comment a.uname:first-child').forEach((i) => {
  83. if (i.querySelector('.delete_btn')) {
  84. return;
  85. }
  86.  
  87. const deleteTag = document.createElement('span');
  88.  
  89. deleteTag.className = 'delete_btn';
  90.  
  91. deleteTag.innerText = '拉黑';
  92.  
  93. deleteTag.addEventListener('click', addToBlacklist);
  94.  
  95. i.appendChild(deleteTag)
  96. });
  97. }
  98.  
  99. function observer() {
  100. appendAddBlacklistBtn();
  101.  
  102. deleteAllUnameParentContOrCon();
  103.  
  104.  
  105. // document.querySelectorAll('.Comment .cmt_cont').forEach((i) => {
  106. // if (i.querySelector('.cmt_con').innerText == hiddenText) {
  107. // i.classList.add('disable_comment');
  108.  
  109. // addBlacklist(i.querySelector('.uname').innerText);
  110. // } else {
  111. // i.querySelectorAll('.cmt_reply .cmt_list .cmt_reply_con').forEach((j) => {
  112. // if (blacklist.some((k) => k == j.querySelector('.huifu + .uname')?.innerText)) {
  113. // j.classList.add('disable_comment');
  114. // } else if (j.querySelector('.cmt_msg .cmt_txt .content').innerText == hiddenText) {
  115. // j.classList.add('disable_comment');
  116.  
  117. // addBlacklist(j.querySelector('.uname').innerText);
  118. // }
  119. // })
  120. // }
  121. // });
  122.  
  123. // console.log(`共拉黑${blacklist.length}`);
  124.  
  125. // console.log('黑名单:', blacklist);
  126.  
  127. // console.log(`共屏蔽${document.querySelectorAll('.disable_comment').length}条评论和回复`);
  128. }
  129.  
  130. function appendManagePanel() {
  131. const panel = document.createElement('div');
  132.  
  133. panel.classList.add('manage_panel');
  134.  
  135. const panelBody = document.createElement('div');
  136.  
  137. panelBody.classList.add('manage_panel_body');
  138.  
  139. panel.appendChild(panelBody);
  140.  
  141. panel.addEventListener('click', (e) => {
  142. if (e.target.classList.contains('blacklist_item')) {
  143. const uid = e.target.getAttribute('uid');
  144.  
  145. const name = e.target.innerText;
  146.  
  147. const ok = confirm(`是否取消拉黑 uid:${uid} 昵称:${name}?取消拉黑后会在下一次刷新生效。`);
  148.  
  149. if (ok) {
  150. storageBlacklist = storageBlacklist.filter(i => i.uid != uid);
  151.  
  152. GM_setValue('gamersky_blacklist', JSON.stringify(storageBlacklist));
  153.  
  154. refreshBlacklistManagePanel();
  155. }
  156. }
  157. })
  158.  
  159. const panelSwitch = document.createElement('div');
  160.  
  161. panelSwitch.innerText = '收起';
  162.  
  163. panelSwitch.classList.add('manage_panel_switch');
  164.  
  165. panelSwitch.addEventListener('click', () => {
  166. panel.classList.add('hide');
  167.  
  168. const expand = document.createElement('div');
  169.  
  170. expand.innerText = '展开';
  171.  
  172. expand.classList.add('manage_panel_show');
  173.  
  174. expand.addEventListener('click', () => {
  175. panel.classList.remove('hide');
  176.  
  177. expand.remove();
  178.  
  179. GM_setValue('show_panel', 1);
  180. })
  181.  
  182. document.body.appendChild(expand);
  183.  
  184. GM_setValue('show_panel', 0);
  185. });
  186.  
  187. if (showPanel == 0) {
  188. panel.classList.add('hide');
  189.  
  190. const expand = document.createElement('div');
  191.  
  192. expand.innerText = '展开';
  193.  
  194. expand.classList.add('manage_panel_show');
  195.  
  196. expand.addEventListener('click', () => {
  197. panel.classList.remove('hide');
  198.  
  199. expand.remove();
  200.  
  201. GM_setValue('show_panel', 1);
  202. })
  203.  
  204. document.body.appendChild(expand);
  205. }
  206.  
  207. panel.append(panelSwitch);
  208.  
  209. document.body.appendChild(panel);
  210.  
  211. refreshBlacklistManagePanel();
  212. }
  213.  
  214. function refreshBlacklistManagePanel() {
  215. const blacklist = document.querySelector('.manage_panel .blacklist');
  216.  
  217. if (blacklist) {
  218. blacklist.remove();
  219. }
  220.  
  221. const newBlacklist = document.createElement('div');
  222.  
  223. newBlacklist.classList.add('blacklist');
  224.  
  225. storageBlacklist.forEach((u) => {
  226. const blacklistItem = document.createElement('div');
  227.  
  228. blacklistItem.innerText = u.name;
  229.  
  230. blacklistItem.setAttribute('uid', u.uid);
  231.  
  232. blacklistItem.classList.add('blacklist_item')
  233.  
  234. newBlacklist.appendChild(blacklistItem);
  235. });
  236.  
  237. const panelBody = document.querySelector('.manage_panel .manage_panel_body');
  238.  
  239. panelBody.appendChild(newBlacklist);
  240. }
  241.  
  242. (function () {
  243. 'use strict';
  244.  
  245. try {
  246. const styleTag = document.createElement('style');
  247.  
  248. styleTag.innerText = `
  249. .disable_comment.disable_comment.disable_comment.disable_comment.disable_comment.disable_comment {
  250. display: none!important;
  251. }
  252. .delete_btn {
  253. position: absolute;
  254. left: 0;
  255. top: -20px;
  256. background-color: #f5222d;
  257. color: #fff;
  258. padding: 0px 5px;
  259. display: none;
  260. border-radius: 4px;
  261.  
  262. }
  263. .Comment a.uname:hover .delete_btn {
  264. display: inline-block;
  265. }
  266. .manage_panel {
  267. padding: 20px 10px 20px 20px;
  268. box-sizing: border-box;
  269. z-index: 10000;
  270. background-color: #fff;
  271. width: 200px;
  272. height: 300px;
  273. position: fixed;
  274. right: 0;
  275. top: calc(50% - 150px);
  276. border-top-left-radius: 20px;
  277. border-bottom-left-radius: 20px;
  278. }
  279. .manage_panel .manage_panel_switch {
  280. background-color: #fff;
  281. position: absolute;
  282. height: 20px;
  283. width: 100%;
  284. bottom: 0;
  285. left: 0;
  286. text-align: center;
  287. color: #333;
  288. cursor: pointer;
  289. }
  290. .manage_panel .manage_panel_body {
  291. height: 100%;
  292. overflow: auto;
  293. }
  294. .manage_panel .blacklist {
  295. padding-top: -3px;
  296. }
  297. .manage_panel .blacklist .blacklist_item {
  298. padding: 4px 4px;
  299. cursor: pointer;
  300. margin-top: 3px;
  301. color: #333;
  302. }
  303. .manage_panel .blacklist .blacklist_item:hover {
  304. background-color: #f0f0f0
  305. }
  306. .manage_panel.hide {
  307. display: none;
  308. }
  309. .manage_panel_show {
  310. border-top-left-radius: 10px;
  311. border-bottom-left-radius: 10px;
  312. width: 20px;
  313. height: 33px;
  314. background-color: #fff;
  315. z-index: 10000;
  316. position: fixed;
  317. right: 0;
  318. top: calc(50% - 20px);
  319. cursor: pointer;
  320. color: #333;
  321. text-align: right;
  322. padding: 5px 5px 5px 0px;
  323. }
  324. `;
  325.  
  326. document.head.append(styleTag);
  327.  
  328. appendManagePanel();
  329.  
  330. const mbConfig = {
  331. childList: true,
  332. subtree: true
  333. };
  334.  
  335. const mb = new MutationObserver(observer);
  336.  
  337. let tryCounts = 0;
  338.  
  339. const timer = setInterval(() => {
  340. tryCounts++;
  341.  
  342. const comments = document.querySelector('.Comment .cmt-content .cmt_list_cont');
  343.  
  344. if (comments) {
  345. mb.observe(comments, mbConfig);
  346.  
  347. clearInterval(timer);
  348. } else if (tryCounts > 100) {
  349. console.log('脚本启动失败');
  350.  
  351. clearInterval(timer);
  352. }
  353. }, 100);
  354.  
  355. } catch (e) {
  356. alert('出错了,请关闭脚本');
  357.  
  358. throw e;
  359. }
  360. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址