// ==UserScript== // @name 知乎增强 // @version 1.4.7 // @author X.I.U // @description 移除登录弹窗、一键收起回答、收起当前回答/评论(点击两侧空白处)、快捷回到顶部(右键两侧空白处)、屏蔽指定用户、屏蔽指定关键词(标题)、屏蔽盐选内容、置顶显示时间、显示问题时间、区分问题文章、默认高清原图、默认站外直链 // @match *://www.zhihu.com/* // @match *://zhuanlan.zhihu.com/* // @icon https://static.zhihu.com/heifetz/favicon.ico // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_openInTab // @grant GM_getValue // @grant GM_setValue // @grant GM_notification // @license GPL-3.0 License // @run-at document-end // @namespace https://greasyfork.org/scripts/4122051 // @supportURL https://github.com/XIU2/UserScript // @homepageURL https://github.com/XIU2/UserScript // @downloadURL none // ==/UserScript== 'use strict'; var menu_ALL = [ ['menu_collapsedAnswer', '一键收起回答', '一键收起回答', true], ['menu_collapsedNowAnswer', '收起当前回答/评论(点击两侧空白处)', '收起当前回答/评论', true], ['menu_backToTop', '快捷回到顶部(右键两侧空白处)', '快捷回到顶部', true], ['menu_blockUsers', '屏蔽指定用户', '屏蔽指定用户', false], ['menu_customBlockUsers', '自定义屏蔽用户', '自定义屏蔽用户', ['故事档案局', '盐选推荐', '盐选科普', '盐选成长计划', '知乎盐选会员', '知乎盐选创作者', '盐选心理', '盐选健康必修课', '盐选奇妙物语', '盐选生活馆', '盐选职场', '盐选文学甄选', '盐选作者小管家', '盐选博物馆', '盐选点金', '盐选测评室', '盐选科技前沿', '盐选会员精品']], ['menu_blockKeywords', '屏蔽指定关键词', '屏蔽指定关键词', false], ['menu_customBlockKeywords', '自定义屏蔽关键词', '自定义屏蔽关键词', []], ['menu_blockYanXuan', '屏蔽盐选内容', '屏蔽盐选内容', false], ['menu_publishTop', '置顶显示时间', '置顶显示时间', true], ['menu_allTime', '完整显示时间', '完整显示时间', true], ['menu_typeTips', '区分问题文章', '区分问题文章', true], ['menu_directLink', '默认站外直链', '默认站外直链', true] ], menu_ID = []; for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 for (let i=0;i` let style_Add = document.createElement('style'); style_Add.innerHTML = '.CornerButton{margin-bottom:8px !important;}.CornerButtons{bottom:45px !important;}'; document.head.appendChild(style_Add); document.querySelector('.CornerAnimayedFlex').insertAdjacentHTML('afterBegin', button_Add); document.getElementById('collapsed-button').onclick = function () { document.querySelectorAll('.ContentItem-rightButton').forEach(function (el) { if (el.hasAttribute('data-zop-retract-question')) { el.click() } }); } } // 收起当前回答、评论(监听点击事件,点击网页两侧空白处) function collapsedNowAnswer(selectors) { backToTop(selectors) // 快捷回到顶部 if (!menu_value('menu_collapsedNowAnswer')) return document.querySelector(selectors).onclick = function(event){ if (event.target==this) { let rightButton = document.querySelector('.ContentItem-actions.Sticky.RichContent-actions.is-fixed.is-bottom') if (rightButton) { // 悬浮的 [收起回答](此时正在浏览回答内容 [头部区域 + 中间区域]) // 固定的 [收起评论](先看看是否展开评论) let commentCollapseButton = rightButton.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') if (commentCollapseButton && commentCollapseButton.innerText.indexOf('收起评论') > -1) { commentCollapseButton.click(); } // 再去收起回答 rightButton = rightButton.querySelector('.ContentItem-rightButton') if (rightButton && rightButton.hasAttribute('data-zop-retract-question')) { rightButton.click(); } } else { // 固定的 [收起回答](此时正在浏览回答内容 [尾部区域]) for (let el of document.querySelectorAll('.ContentItem-rightButton')) { if (el.hasAttribute('data-zop-retract-question')) { if (isElementInViewport(el)) { // 固定的 [收起评论](先看看是否展开评论) let commentCollapseButton = el.parentNode.querySelector('button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') if (commentCollapseButton && commentCollapseButton.innerText.indexOf('收起评论') > -1) { commentCollapseButton.click(); // 如果展开了评论,就收起评论 } el.click() // 再去收起回答 break } } } } var commentCollapseButton_ = false, commentCollapseButton__ = false; // 悬浮的 [收起评论](此时正在浏览评论内容 [中间区域]) let commentCollapseButton = document.querySelector('.CommentCollapseButton') if (commentCollapseButton) { commentCollapseButton.click(); } else { // 固定的 [收起评论](此时正在浏览评论内容 [头部区域]) let commentCollapseButton_1 = document.querySelectorAll('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type, .ContentItem-action > button.Button.Button--plain.Button--withIcon.Button--withLabel:first-of-type') if (commentCollapseButton_1.length > 0) { for (let el of commentCollapseButton_1) { if (el.innerText.indexOf('收起评论') > -1) { if (isElementInViewport(el)) { el.click() commentCollapseButton_ = true // 如果找到并点击了,就没必要执行下面的代码了(可视区域中没有 [收起评论] 时) break } } } } if (commentCollapseButton_ == false) { // 可视区域中没有 [收起评论] 时(此时正在浏览评论内容 [头部区域] + [尾部区域](不上不下的,既看不到固定的 [收起评论] 又看不到悬浮的 [收起评论])),需要判断可视区域中是否存在评论元素 let commentCollapseButton_1 = document.querySelectorAll('.NestComment') if (commentCollapseButton_1.length > 0) { for (let el of commentCollapseButton_1) { if (isElementInViewport(el)) { let commentCollapseButton = el.parentNode.parentNode.parentNode.parentNode.parentNode.querySelector('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') if (commentCollapseButton.innerText.indexOf('收起评论') > -1) { commentCollapseButton.click() commentCollapseButton__ = true // 如果找到并点击了,就没必要执行下面的代码了(可视区域中没有 评论元素 时) break } } } } if (commentCollapseButton__ == false) { // 如果上面的都没找到,那么就尝试寻找评论末尾的 [评论回复框] let commentCollapseButton_2 = document.querySelectorAll('.CommentsV2-footer.CommentEditorV2--normal .CommentEditorV2-inputWrap') if (commentCollapseButton_2.length > 0) { for (let el of commentCollapseButton_2) { if (isElementInViewport(el)) { let commentCollapseButton = el.parentNode.parentNode.parentNode.parentNode.parentNode.querySelector('.ContentItem-actions > button.Button.ContentItem-action.Button--plain.Button--withIcon.Button--withLabel:first-of-type') console.log(commentCollapseButton) if (commentCollapseButton.innerText.indexOf('收起评论') > -1) { commentCollapseButton.click() break } } } } } } } } } } // 回到顶部(监听点击事件,鼠标右键点击网页两侧空白处) function backToTop(selectors) { if (!menu_value('menu_backToTop')) return document.querySelector(selectors).oncontextmenu = function(event){ if (event.target==this) { event.preventDefault(); window.scrollTo(0,0) } } } //获取元素是否在可视区域 function isElementInViewport(el) { let rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } // 自定义屏蔽用户 function customBlockUsers() { let nowBlockUsers = ''; menu_value('menu_customBlockUsers').forEach(function(item){nowBlockUsers = nowBlockUsers + '|' + item}) let newBlockUsers = prompt('编辑 [自定义屏蔽用户]\n(不同用户名之间使用 "|" 分隔,例如:用户A|用户B|用户C )', nowBlockUsers.replace('|','')); if (newBlockUsers === '') { GM_setValue('menu_customBlockUsers', []); registerMenuCommand(); // 重新注册脚本菜单 } else if (newBlockUsers != null) { GM_setValue('menu_customBlockUsers', newBlockUsers.split('|')); registerMenuCommand(); // 重新注册脚本菜单 } }; // 屏蔽指定用户 function blockUsers(type) { if (!menu_value('menu_blockUsers')) return if (!menu_value('menu_customBlockUsers') || menu_value('menu_customBlockUsers').length < 1) return switch(type) { case 'index': blockUsers_index(); break; case 'question': blockUsers_question(); break; case 'search': blockUsers_search(); break; case 'people': blockUsers_button_people(); // 添加屏蔽用户按钮(用户主页) break; } blockUsers_comment(); // 评论区 blockUsers_button(); // 加入黑名单按钮 function blockUsers_index() { let blockUsers = e => { if (e.target.innerHTML && e.target.getElementsByClassName('Feed').length > 0) { let item = e.target.getElementsByClassName('Feed')[0].getElementsByClassName('ContentItem AnswerItem')[0]; // 用户名所在元素 if (item) { menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 if (item.dataset.zop.indexOf('authorName":"' + item1 + '",') > -1) { // 找到就删除该信息流 console.log(item.dataset.zop); item.parentNode.parentNode.remove(); } }) } } } document.addEventListener('DOMNodeInserted', blockUsers); // 监听插入事件 let listItem = document.getElementsByClassName('Card TopstoryItem TopstoryItem--old TopstoryItem-isRecommend'); Array.from(listItem).forEach(function(item){ // 遍历所有回答 let listName = item.querySelector('.ContentItem.AnswerItem') // 用户名所在元素 if (listName) { menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 if (listName.dataset.zop.indexOf('authorName":"' + item1 + '",') > -1) { // 找到就删除该信息流 console.log(listName.dataset.zop); item.remove(); } }) } }) } function blockUsers_question() { let blockUsers = e => { if (e.target.innerHTML && e.target.getElementsByClassName('ContentItem AnswerItem').length > 0) { let item = e.target.getElementsByClassName('ContentItem AnswerItem')[0]; // 用户名所在元素 if (item) { menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 if (item.dataset.zop.indexOf('authorName":"' + item1 + '",') > -1) { // 找到就删除该回答 console.log(item.dataset.zop) item.parentNode.remove(); } }) } } } document.addEventListener('DOMNodeInserted', blockUsers); // 监听插入事件 let listItem = document.getElementsByClassName('ContentItem AnswerItem'); Array.from(listItem).forEach(function(item){ // 遍历所有回答 // 用户名所在元素 if (item) { menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 if (item.dataset.zop.indexOf('authorName":"' + item1 + '",') > -1) { // 找到就删除该回答 console.log(item.dataset.zop) item.parentNode.remove(); } }) } }) } function blockUsers_search() { let blockUsers = e => { if (e.target.innerHTML && e.target.getElementsByClassName('List-item').length > 0) { let item = e.target.getElementsByClassName('List-item')[0]; let listName = item.querySelector('.RichText.ztext.CopyrightRichText-richText b') // 用户名所在元素 if (listName) { menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 if (item1 === listName.innerText) { // 找到就删除该搜索结果 console.log(listName.innerText); item.parentNode.remove(); } }) } } } document.addEventListener('DOMNodeInserted', blockUsers); // 监听插入事件 } function blockUsers_comment() { let blockUsers = e => { if (e.target.innerHTML && e.target.querySelector('img.Avatar.UserLink-avatar[width="24"]')) { let item = e.target.querySelectorAll('img.Avatar.UserLink-avatar[width="24"]') item.forEach(function(item1){ // 遍历用户名 menu_value('menu_customBlockUsers').forEach(function(item2){ // 遍历用户黑名单 if (item1.alt === item2) { // 找到就删除该搜索结果 if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--rootCommentNoChild' || item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--rootComment') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } else if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--rootCommentNoChild' || item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--rootComment') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } else if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--child') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } else if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment--child') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } else if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'NestComment') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } else if (item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.className === 'CommentItemV2') { item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.remove(); } } }) // 添加屏蔽用户按钮(点赞、回复等按钮后面) if (item1) { let footer = item1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.querySelector('.CommentItemV2-metaSibling > .CommentItemV2-footer'); if (footer && !footer.lastElementChild.dataset.name) { footer.insertAdjacentHTML('beforeend',``); footer.lastElementChild.onclick = function(){blockUsers_button_add(this.dataset.name)} } } }) } } document.addEventListener('DOMNodeInserted', blockUsers); // 监听插入事件 } // 添加屏蔽用户按钮(用户信息悬浮框中) function blockUsers_button() { let blockUsers = e => { if (e.target.innerHTML && e.target.querySelector('.MemberButtonGroup.ProfileButtonGroup.HoverCard-buttons')) { let item = e.target.querySelector('.MemberButtonGroup.ProfileButtonGroup.HoverCard-buttons'), name = item.parentNode.parentNode.querySelector('a.UserLink-link').innerText; item.insertAdjacentHTML('beforeend', ``); item.lastElementChild.onclick = function(){blockUsers_button_add(this.dataset.name)} } } document.addEventListener('DOMNodeInserted', blockUsers); // 监听插入事件 } // 添加屏蔽用户按钮(用户主页) function blockUsers_button_people() { let item = document.querySelector('.MemberButtonGroup.ProfileButtonGroup.ProfileHeader-buttons'), // 获取按钮元素位置 name = document.querySelector('.ProfileHeader-name').firstChild.textContent, // 获取用户名 users = menu_value('menu_customBlockUsers'); // 读取屏蔽列表 for (let num = 0;num