Steam Hide Blacklist Comments

steam隐藏黑名单评测

目前为 2021-12-19 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Steam Hide Blacklist Comments
  3. // @namespace
  4. // @version 0.3
  5. // @description steam隐藏黑名单评测
  6. // @license MIT
  7. // @author lyzlyslyc
  8. // @match http*://store.steampowered.com/app/*
  9. // @match http*://steamcommunity.com/app/*
  10. // @enable true
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @run-at document-end
  14. // ==/UserScript==
  15.  
  16. //是否默认勾选隐藏评测
  17. var checked = true;
  18.  
  19. //默认的关键字或正则表达式(正则表达式使用/包围,例如/abc/)
  20. var default_blacklist=[
  21. "我是傻逼",
  22. "口了",
  23. "明逼",
  24. "⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿",
  25. "需要中文",
  26. "产品已退款",
  27. /伞兵/
  28. ];
  29.  
  30. var blacklist=[];
  31.  
  32. var blocked_comments_list = [];
  33.  
  34. var isStore = true;
  35.  
  36. var tMsg = 0;
  37.  
  38. var isSteamClient = navigator.userAgent.search(/Valve Steam Client/)!=-1;
  39.  
  40. (function(){
  41. 'use strict';
  42.  
  43. //获取关键字
  44. let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
  45. blacklist = parseBlacklist(str);
  46.  
  47. //steam客户端
  48. if(isSteamClient){
  49. window.addEventListener("message",(e)=>{
  50. try{
  51. let data = JSON.parse(e.data);
  52. if(data.steam_blacklist!=null){
  53. GM_setValue("steam_blacklist",data.steam_blacklist);
  54. console.log(data.steam_blacklist);
  55. e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":true}),e.origin);
  56. alert("关键词同步成功");
  57. window.close();
  58. }
  59. else if(data.steam_blacklist_feedback!=null){
  60. clearInterval(tMsg);
  61. }
  62. }
  63. catch(ex){
  64. alert(ex);
  65. e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":false}),e.origin);
  66. window.close();
  67. console.log(ex);
  68. }
  69. });
  70. }
  71.  
  72. //设置对话框
  73. let dlg_settings = document.createElement("div");
  74. dlg_settings.className = "blacklist_hover";
  75. dlg_settings.style = "width: 400px; height: 500px; position: fixed; margin-left: auto; left: 0px; right: 0px; margin-right: auto; top: 25%; background: rgb(27, 40, 56); border-radius: 25px; z-index: 999; text-align: center;";
  76. dlg_settings.innerHTML=
  77. '<div style="position: relative;top: 2%;font-size: 18px;color: #4a86ad;">关键词列表(按行分隔)</div>'+
  78. '<textarea type="text" id="blacklist_text" style="width: 90%;height: 80%;position: relative;top: 4%;resize: none;background: #316282;color: #fffff1;font-family: Arial, Helvetica, sans-serif;border-radius: 3px;padding: 3px;font-size: 16px;" draggable="false"></textarea>'+
  79. '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 8%;width: 24%;" id="save_blacklist"><span>保存</span></a>'+
  80. '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 38%;width: 24%;" id="reset_blacklist"><span>默认</span></a>'+
  81. '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;right: 8%;width: 24%;" id="cancel_blacklist"><span>取消</span></a>';
  82. document.body.appendChild(dlg_settings);
  83. document.querySelector(".blacklist_hover").style.display="none";
  84. //取消按钮
  85. document.querySelector("#cancel_blacklist").addEventListener("click",()=>{
  86. document.querySelector(".blacklist_hover").style.display="none";
  87. });
  88. //保存按钮
  89. document.querySelector("#save_blacklist").addEventListener("click",()=>{
  90. try{
  91. //更新黑名单
  92. blacklist = parseBlacklist(document.getElementById("blacklist_text").value);
  93. //保存黑名单至本地
  94. GM_setValue("steam_blacklist",document.getElementById("blacklist_text").value);
  95.  
  96. //steam客户端
  97. if(isSteamClient){
  98. let baseUrl = "";
  99. if(isStore)baseUrl = "https://steamcommunity.com";
  100. else baseUrl = "https://store.steampowered.com";
  101. baseUrl+=location.href.match(/\/app\/\d*/)[0];
  102. let win = window.open(baseUrl);
  103. tMsg = setInterval(()=>{
  104. if(!win.closed)win.postMessage(JSON.stringify({"steam_blacklist":document.getElementById("blacklist_text").value}),baseUrl);
  105. else clearInterval(tMsg);
  106. },1000);
  107. }
  108.  
  109. //更新隐藏评论
  110. blocked_comments_list = [];
  111. if(isStore){
  112. let count = 0;
  113. document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
  114. item.showComment();
  115. if(checkForBlacklist(item,item))count++;
  116. });
  117. document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
  118. }
  119. else {
  120. document.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
  121. let parent = item.parentNode;
  122. parent.showComment();
  123. checkForBlacklist(item,parent);
  124. });
  125. }
  126. hideComments();
  127. //关闭对话框
  128. document.querySelector(".blacklist_hover").style.display="none";
  129. }
  130. catch(ex){
  131. alert(ex);
  132. }
  133. });
  134. //重置按钮
  135. document.querySelector("#reset_blacklist").addEventListener("click",()=>{
  136. document.getElementById("blacklist_text").value = getBlacklistText(default_blacklist);
  137. });
  138.  
  139.  
  140. //分页面初始化
  141. if(location.href.search(/steampowered.com/)!=-1){
  142. isStore = true;
  143. let check = document.createElement("input");
  144. check.type="checkbox";
  145. check.id="check_hide";
  146. check.checked = checked;
  147. check.addEventListener("click", hideComments);
  148.  
  149. let count = document.createElement("span");
  150. count.id="blacklist_comments_count";
  151.  
  152. //打开设置对话框按钮
  153. let a = document.createElement("a");
  154. a.id="blacklist_settings";
  155. a.innerText="设置关键词";
  156. a.addEventListener("click", ()=>{
  157. //获取关键字
  158. let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
  159. blacklist = parseBlacklist(str);
  160. //显示文本
  161. document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
  162. document.querySelector(".blacklist_hover").style.display="block";
  163. });
  164. a.href = "javascript:void(0);";
  165.  
  166. let span = document.createElement("span");
  167. span.className="hide_blacklist_comments";
  168. span.appendChild(check);
  169. span.append("隐藏黑名单评论");
  170. span.append(count);
  171. span.append(a);
  172. document.querySelector(".user_reviews_summary_bar").appendChild(span);
  173. initAppView();
  174.  
  175. //监控是否更新评论列表
  176. var observer = new MutationObserver(function (mutations, observer) {
  177. mutations.forEach(function(mutation) {
  178. if(mutation.target.style.display!="none")return;
  179. initAppView();
  180. });
  181. });
  182. //开始监控
  183. observer.observe(document.querySelector("#Reviews_loading"),{"attributes":true});
  184. }
  185. else{
  186. isStore = false;
  187.  
  188. let check = document.createElement("input");
  189. check.type="checkbox";
  190. check.id="check_hide";
  191. check.checked = checked;
  192. check.addEventListener("click", hideComments);
  193. check.style = "vertical-align: top;";
  194.  
  195. //打开设置对话框按钮
  196. let a = document.createElement("a");
  197. a.id="blacklist_settings";
  198. a.innerText="设置关键词";
  199. a.addEventListener("click", ()=>{
  200. //获取关键字
  201. let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
  202. blacklist = parseBlacklist(str);
  203. //显示文本
  204. document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
  205. document.querySelector(".blacklist_hover").style.display="block";
  206. });
  207. a.href = "javascript:void(0);";
  208. a.style="color: #67c1f5;";
  209.  
  210. let span = document.createElement("span");
  211. span.className="hide_blacklist_comments";
  212. span.style = "float: right;color: #ffffff;";
  213. span.appendChild(check);
  214. span.append("隐藏黑名单评论");
  215. span.append(a);
  216.  
  217. document.querySelector(".apphub_sectionTabs > div").before(span);
  218. initCommunityView();
  219. }
  220. })();
  221.  
  222. //商店页面
  223. function initAppView(){
  224. if(document.querySelector("#Reviews_loading").style.display!='none'){
  225. setTimeout(initAppView,500);
  226. return;
  227. }
  228.  
  229. //黑名单总数
  230. let count = 0;
  231. blocked_comments_list = [];
  232. document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
  233. //右侧小评测
  234. if(item.classList.contains('short')){
  235. //添加显示和隐藏函数
  236. item.hideComment = function(){
  237. this.querySelector(".shortcol").hidden = true;
  238. if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
  239. };
  240. item.showComment = function(){
  241. this.querySelector(".shortcol").hidden = false;
  242. if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
  243. };
  244. item.hasHidden = function(){
  245. return item.querySelector(".shortcol").hidden;
  246. }
  247. //添加按钮
  248. addFoldButton(item.querySelector(".short_header"),item);
  249. }
  250. //左侧大评测
  251. else if(item.querySelector(".rightcol")!=null){
  252. //添加显示和隐藏函数
  253. item.hideComment = function(){
  254. this.querySelector(".rightcol").hidden = true;
  255. if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
  256. };
  257. item.showComment = function(){
  258. this.querySelector(".rightcol").hidden = false;
  259. if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
  260. };
  261. item.hasHidden = function(){
  262. return item.querySelector(".rightcol").hidden;
  263. }
  264. //添加按钮
  265. addFoldButton(item.querySelector(".num_reviews"),item);
  266. }
  267. //检查是否加入黑名单
  268. if(checkForBlacklist(item,item))count++;
  269. });
  270.  
  271. document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
  272. hideComments();
  273. }
  274.  
  275. function initCommunityView(){
  276. var observer = new MutationObserver(function (mutations, observer) {
  277. mutations.forEach(function(mutation) {
  278. if(mutation.type!="childList")return;
  279. mutation.addedNodes.forEach((node)=>{
  280. if(!(/page\d+/).test(node.id))return;
  281. if(node.id=="page1")return;
  282. checkNewPage(node);
  283. hideComments();
  284. })
  285. });
  286. });
  287. //开始监控
  288. observer.observe(document.querySelector("#AppHubCards"),{"childList":true});
  289. checkNewPage(document.getElementById("page1"));
  290. hideComments();
  291. }
  292.  
  293. //点击隐藏按钮
  294. function hideComments(){
  295. if(document.getElementById("check_hide").checked){
  296. blocked_comments_list.forEach((item)=>{
  297. item.hideComment();
  298. });
  299. }
  300. else{
  301. blocked_comments_list.forEach((item)=>{
  302. item.showComment();
  303. });
  304. }
  305. }
  306.  
  307. //添加折叠按钮
  308. function addFoldButton(neighborDiv, targetDiv){
  309. if(neighborDiv==null||targetDiv==null)return;
  310. if(targetDiv.querySelector(".hide_comment")!=null)return;
  311. let a = document.createElement("a");
  312. a.style = "float: right;color: #66c0f4;";
  313. a.href = "javascript:void(0);";
  314. a.className = "hide_comment";
  315. a.addEventListener("click",()=>{
  316. if(targetDiv.hasHidden()){
  317. targetDiv.showComment();
  318. }
  319. else{
  320. targetDiv.hideComment();
  321. }
  322. })
  323. if(targetDiv.hasHidden())a.innerText="展开评测";
  324. else a.innerText="折叠评测";
  325. neighborDiv.after(a);
  326. return a;
  327. }
  328.  
  329. function checkNewPage(page){
  330. //新页面,寻找所有测评文字块
  331. if(page==null)return;
  332. page.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
  333. let commentString = item.querySelector(".apphub_CardTextContent").innerHTML.replace(/\t/g,"").replace(/\n/g,"").replace(/(<div[^>]*>[^<>]*<\/div>)|(<[^<]*>)/g,"");
  334. commentString = commentString.replace(/[^\u4e00-\u9fa5_a-zA-Z0-9]*/g,"");
  335. item.commentLength = commentString.length;
  336. //测评父节点
  337. let parent = item.parentNode;
  338. //隐藏消息div
  339. if(parent.querySelector(".hidden_message")==null){
  340. let div = document.createElement("div");
  341. div.className = "hidden_message";
  342. div.style = "text-align: center;color: yellow;font-size: 20px;transform: translateY(-200%);";
  343. div.innerText = `测评已隐藏,共${item.commentLength}字`;
  344. div.hidden = true;
  345. parent.querySelector(".UserReviewCardContent_Footer").prepend(div);
  346. }
  347. parent.hideComment = function(){
  348. this.querySelector(".apphub_UserReviewCardContent").hidden = true;
  349. this.querySelector(".hidden_message").hidden = false;
  350. };
  351. parent.showComment = function(){
  352. this.querySelector(".apphub_UserReviewCardContent").hidden = false;
  353. this.querySelector(".hidden_message").hidden = true;
  354. }
  355. //检查是否加入黑名单
  356. checkForBlacklist(item,parent);
  357. });
  358. }
  359.  
  360. //黑名单列表转换为字符串
  361. function getBlacklistText(blacklist){
  362. let str="";
  363. blacklist.forEach((item)=>{str+=item.toString()+"\n";})
  364. return str;
  365. }
  366. //字符串转换为黑名单列表
  367. function parseBlacklist(blacklistString){
  368. let str_list = blacklistString.split("\n");
  369. let obj_list = [];
  370. str_list.forEach((item)=>{
  371. item = item.trim();
  372. if(item=="")return;
  373. if(/^\/.*\/$/.test(item)){
  374. obj_list.push(new RegExp(item.replace(/^\/(.*)\/$/,"$1")));
  375. }
  376. else obj_list.push(item);
  377. });
  378. return obj_list;
  379. }
  380. //检查是否加入黑名单
  381. function checkForBlacklist(checkItem,pushItem){
  382. for(let i=0;i<blacklist.length;i++){
  383. if(checkItem.innerHTML.search(blacklist[i])!=-1){
  384. blocked_comments_list.push(pushItem);
  385. return true;
  386. }
  387. }
  388. return false;
  389. }