- // ==UserScript==
- // @name Steam Hide Blacklist Comments
- // @namespace
- // @version 0.3
- // @description steam隐藏黑名单评测
- // @license MIT
- // @author lyzlyslyc
- // @match http*://store.steampowered.com/app/*
- // @match http*://steamcommunity.com/app/*
- // @enable true
- // @grant GM_getValue
- // @grant GM_setValue
- // @run-at document-end
- // ==/UserScript==
-
- //是否默认勾选隐藏评测
- var checked = true;
-
- //默认的关键字或正则表达式(正则表达式使用/包围,例如/abc/)
- var default_blacklist=[
- "我是傻逼",
- "口了",
- "明逼",
- "⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿",
- "需要中文",
- "产品已退款",
- /伞兵/
- ];
-
- var blacklist=[];
-
- var blocked_comments_list = [];
-
- var isStore = true;
-
- var tMsg = 0;
-
- var isSteamClient = navigator.userAgent.search(/Valve Steam Client/)!=-1;
-
- (function(){
- 'use strict';
-
- //获取关键字
- let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
- blacklist = parseBlacklist(str);
-
- //steam客户端
- if(isSteamClient){
- window.addEventListener("message",(e)=>{
- try{
- let data = JSON.parse(e.data);
- if(data.steam_blacklist!=null){
- GM_setValue("steam_blacklist",data.steam_blacklist);
- console.log(data.steam_blacklist);
- e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":true}),e.origin);
- alert("关键词同步成功");
- window.close();
- }
- else if(data.steam_blacklist_feedback!=null){
- clearInterval(tMsg);
- }
- }
- catch(ex){
- alert(ex);
- e.source.postMessage(JSON.stringify({"steam_blacklist_feedback":false}),e.origin);
- window.close();
- console.log(ex);
- }
- });
- }
-
- //设置对话框
- let dlg_settings = document.createElement("div");
- dlg_settings.className = "blacklist_hover";
- 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;";
- dlg_settings.innerHTML=
- '<div style="position: relative;top: 2%;font-size: 18px;color: #4a86ad;">关键词列表(按行分隔)</div>'+
- '<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>'+
- '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 8%;width: 24%;" id="save_blacklist"><span>保存</span></a>'+
- '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;left: 38%;width: 24%;" id="reset_blacklist"><span>默认</span></a>'+
- '<a class="btnv6_blue_hoverfade btn_medium" style="position: absolute;bottom: 1%;right: 8%;width: 24%;" id="cancel_blacklist"><span>取消</span></a>';
- document.body.appendChild(dlg_settings);
- document.querySelector(".blacklist_hover").style.display="none";
- //取消按钮
- document.querySelector("#cancel_blacklist").addEventListener("click",()=>{
- document.querySelector(".blacklist_hover").style.display="none";
- });
- //保存按钮
- document.querySelector("#save_blacklist").addEventListener("click",()=>{
- try{
- //更新黑名单
- blacklist = parseBlacklist(document.getElementById("blacklist_text").value);
- //保存黑名单至本地
- GM_setValue("steam_blacklist",document.getElementById("blacklist_text").value);
-
- //steam客户端
- if(isSteamClient){
- let baseUrl = "";
- if(isStore)baseUrl = "https://steamcommunity.com";
- else baseUrl = "https://store.steampowered.com";
- baseUrl+=location.href.match(/\/app\/\d*/)[0];
- let win = window.open(baseUrl);
- tMsg = setInterval(()=>{
- if(!win.closed)win.postMessage(JSON.stringify({"steam_blacklist":document.getElementById("blacklist_text").value}),baseUrl);
- else clearInterval(tMsg);
- },1000);
- }
-
- //更新隐藏评论
- blocked_comments_list = [];
- if(isStore){
- let count = 0;
- document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
- item.showComment();
- if(checkForBlacklist(item,item))count++;
- });
- document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
- }
- else {
- document.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
- let parent = item.parentNode;
- parent.showComment();
- checkForBlacklist(item,parent);
- });
- }
- hideComments();
- //关闭对话框
- document.querySelector(".blacklist_hover").style.display="none";
- }
- catch(ex){
- alert(ex);
- }
- });
- //重置按钮
- document.querySelector("#reset_blacklist").addEventListener("click",()=>{
- document.getElementById("blacklist_text").value = getBlacklistText(default_blacklist);
- });
-
-
- //分页面初始化
- if(location.href.search(/steampowered.com/)!=-1){
- isStore = true;
- let check = document.createElement("input");
- check.type="checkbox";
- check.id="check_hide";
- check.checked = checked;
- check.addEventListener("click", hideComments);
-
- let count = document.createElement("span");
- count.id="blacklist_comments_count";
-
- //打开设置对话框按钮
- let a = document.createElement("a");
- a.id="blacklist_settings";
- a.innerText="设置关键词";
- a.addEventListener("click", ()=>{
- //获取关键字
- let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
- blacklist = parseBlacklist(str);
- //显示文本
- document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
- document.querySelector(".blacklist_hover").style.display="block";
- });
- a.href = "javascript:void(0);";
-
- let span = document.createElement("span");
- span.className="hide_blacklist_comments";
- span.appendChild(check);
- span.append("隐藏黑名单评论");
- span.append(count);
- span.append(a);
- document.querySelector(".user_reviews_summary_bar").appendChild(span);
- initAppView();
-
- //监控是否更新评论列表
- var observer = new MutationObserver(function (mutations, observer) {
- mutations.forEach(function(mutation) {
- if(mutation.target.style.display!="none")return;
- initAppView();
- });
- });
- //开始监控
- observer.observe(document.querySelector("#Reviews_loading"),{"attributes":true});
- }
- else{
- isStore = false;
-
- let check = document.createElement("input");
- check.type="checkbox";
- check.id="check_hide";
- check.checked = checked;
- check.addEventListener("click", hideComments);
- check.style = "vertical-align: top;";
-
- //打开设置对话框按钮
- let a = document.createElement("a");
- a.id="blacklist_settings";
- a.innerText="设置关键词";
- a.addEventListener("click", ()=>{
- //获取关键字
- let str = GM_getValue("steam_blacklist",getBlacklistText(default_blacklist));
- blacklist = parseBlacklist(str);
- //显示文本
- document.getElementById("blacklist_text").value=getBlacklistText(blacklist);
- document.querySelector(".blacklist_hover").style.display="block";
- });
- a.href = "javascript:void(0);";
- a.style="color: #67c1f5;";
-
- let span = document.createElement("span");
- span.className="hide_blacklist_comments";
- span.style = "float: right;color: #ffffff;";
- span.appendChild(check);
- span.append("隐藏黑名单评论");
- span.append(a);
-
- document.querySelector(".apphub_sectionTabs > div").before(span);
- initCommunityView();
- }
- })();
-
- //商店页面
- function initAppView(){
- if(document.querySelector("#Reviews_loading").style.display!='none'){
- setTimeout(initAppView,500);
- return;
- }
-
- //黑名单总数
- let count = 0;
- blocked_comments_list = [];
- document.querySelectorAll(".review_ctn .review_box").forEach((item)=>{
- //右侧小评测
- if(item.classList.contains('short')){
- //添加显示和隐藏函数
- item.hideComment = function(){
- this.querySelector(".shortcol").hidden = true;
- if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
- };
- item.showComment = function(){
- this.querySelector(".shortcol").hidden = false;
- if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
- };
- item.hasHidden = function(){
- return item.querySelector(".shortcol").hidden;
- }
- //添加按钮
- addFoldButton(item.querySelector(".short_header"),item);
- }
- //左侧大评测
- else if(item.querySelector(".rightcol")!=null){
- //添加显示和隐藏函数
- item.hideComment = function(){
- this.querySelector(".rightcol").hidden = true;
- if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "展开评测";
- };
- item.showComment = function(){
- this.querySelector(".rightcol").hidden = false;
- if(this.querySelector(".hide_comment")!=null)this.querySelector(".hide_comment").innerText = "折叠评测";
- };
- item.hasHidden = function(){
- return item.querySelector(".rightcol").hidden;
- }
- //添加按钮
- addFoldButton(item.querySelector(".num_reviews"),item);
- }
- //检查是否加入黑名单
- if(checkForBlacklist(item,item))count++;
- });
-
- document.getElementById("blacklist_comments_count").innerText=`(共${count}条)`;
- hideComments();
- }
-
- function initCommunityView(){
- var observer = new MutationObserver(function (mutations, observer) {
- mutations.forEach(function(mutation) {
- if(mutation.type!="childList")return;
- mutation.addedNodes.forEach((node)=>{
- if(!(/page\d+/).test(node.id))return;
- if(node.id=="page1")return;
- checkNewPage(node);
- hideComments();
- })
- });
- });
- //开始监控
- observer.observe(document.querySelector("#AppHubCards"),{"childList":true});
- checkNewPage(document.getElementById("page1"));
- hideComments();
- }
-
- //点击隐藏按钮
- function hideComments(){
- if(document.getElementById("check_hide").checked){
- blocked_comments_list.forEach((item)=>{
- item.hideComment();
- });
- }
- else{
- blocked_comments_list.forEach((item)=>{
- item.showComment();
- });
- }
- }
-
- //添加折叠按钮
- function addFoldButton(neighborDiv, targetDiv){
- if(neighborDiv==null||targetDiv==null)return;
- if(targetDiv.querySelector(".hide_comment")!=null)return;
- let a = document.createElement("a");
- a.style = "float: right;color: #66c0f4;";
- a.href = "javascript:void(0);";
- a.className = "hide_comment";
- a.addEventListener("click",()=>{
- if(targetDiv.hasHidden()){
- targetDiv.showComment();
- }
- else{
- targetDiv.hideComment();
- }
- })
- if(targetDiv.hasHidden())a.innerText="展开评测";
- else a.innerText="折叠评测";
- neighborDiv.after(a);
- return a;
- }
-
- function checkNewPage(page){
- //新页面,寻找所有测评文字块
- if(page==null)return;
- page.querySelectorAll(".apphub_UserReviewCardContent").forEach((item)=>{
- let commentString = item.querySelector(".apphub_CardTextContent").innerHTML.replace(/\t/g,"").replace(/\n/g,"").replace(/(<div[^>]*>[^<>]*<\/div>)|(<[^<]*>)/g,"");
- commentString = commentString.replace(/[^\u4e00-\u9fa5_a-zA-Z0-9]*/g,"");
- item.commentLength = commentString.length;
- //测评父节点
- let parent = item.parentNode;
- //隐藏消息div
- if(parent.querySelector(".hidden_message")==null){
- let div = document.createElement("div");
- div.className = "hidden_message";
- div.style = "text-align: center;color: yellow;font-size: 20px;transform: translateY(-200%);";
- div.innerText = `测评已隐藏,共${item.commentLength}字`;
- div.hidden = true;
- parent.querySelector(".UserReviewCardContent_Footer").prepend(div);
- }
- parent.hideComment = function(){
- this.querySelector(".apphub_UserReviewCardContent").hidden = true;
- this.querySelector(".hidden_message").hidden = false;
- };
- parent.showComment = function(){
- this.querySelector(".apphub_UserReviewCardContent").hidden = false;
- this.querySelector(".hidden_message").hidden = true;
- }
- //检查是否加入黑名单
- checkForBlacklist(item,parent);
- });
- }
-
- //黑名单列表转换为字符串
- function getBlacklistText(blacklist){
- let str="";
- blacklist.forEach((item)=>{str+=item.toString()+"\n";})
- return str;
- }
- //字符串转换为黑名单列表
- function parseBlacklist(blacklistString){
- let str_list = blacklistString.split("\n");
- let obj_list = [];
- str_list.forEach((item)=>{
- item = item.trim();
- if(item=="")return;
- if(/^\/.*\/$/.test(item)){
- obj_list.push(new RegExp(item.replace(/^\/(.*)\/$/,"$1")));
- }
- else obj_list.push(item);
- });
- return obj_list;
- }
- //检查是否加入黑名单
- function checkForBlacklist(checkItem,pushItem){
- for(let i=0;i<blacklist.length;i++){
- if(checkItem.innerHTML.search(blacklist[i])!=-1){
- blocked_comments_list.push(pushItem);
- return true;
- }
- }
- return false;
- }