// ==UserScript==
// @name 知乎浏览助手
// @namespace http://tampermonkey.net/
// @version 0.0.5
// @description 知乎浏览助手. 如果想报 bug, 可以通过知乎私信联系我, zhihu.com/people/kougazhang
// @author kgzhang
// @match https://www.zhihu.com/*
// @grant GM_addStyle
// @grant GM_log
// @grant GM_registerMenuCommand
// @grant GM_unregisterMenuCommand
// @grant GM_openInTab
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_notification
// @run-at document-end
// ==/UserScript==
// 问题页加宽
GM_addStyle(".Question-mainColumn { width: unset !important; } ");
GM_addStyle(".QuestionAnswers-answers { width: 1000px !important; } ");
// 推荐页加宽
GM_addStyle(".Topstory-mainColumn { width: 1000px !important; } ");
// 去除右边栏
GM_addStyle(".GlobalSideBar { display: none !important; } ");
// 去除问题页右边栏
GM_addStyle(".Question-sideColumn { display: none !important; } ");
// 去除 topic 右边栏
GM_addStyle(".ContentLayout-sideColumn { display: none !important; } ");
// topic 加宽
GM_addStyle(".Topic-bar--borderBottom {width: 1000px;}");
// 搜索页加宽
GM_addStyle(".ListShortcut {width: 1000px; font-size: 20px}");
// 搜索页隐藏右边栏 SearchSideBar
GM_addStyle(".SearchSideBar {display: none;}");
// 个人页面隐藏右边栏
GM_addStyle(".Profile-sideColumn {display: none; }");
// 加宽
GM_addStyle(".Profile-mainColumn {width: 1000px; }");
GM_addStyle(".css-1mcaze2 {display: none; }");
// 隐藏推荐页中的广告
GM_addStyle(".TopstoryItem--advertCard {display: none; }");
// 创建元素
function createEle(eleName, text, attrs) {
let ele = document.createElement(eleName);
ele.innerText = text;
for (let k in attrs) {
ele.setAttribute(k, attrs[k]);
}
return ele;
}
// 防抖
function debounce(fn, wait) {
let timeout = null;
return function () {
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(fn, wait);
}
}
// 复制剪贴板
function updateClipboard(newClip) {
navigator.clipboard.writeText(newClip).then(function () {
alert('succeed copy');
}, function (err) {
// clipboard write failed
console.info('failed copy', err);
alert('faild copy')
});
}
// 站外链接直接跳转
function directLink() {
let link, equal, colon, externalHref, protocol, path, newHref;
// 文字链接
link = document.querySelectorAll('a[class*="external"]')
if (link) {
link.forEach(function (_this) {
if (_this.getElementsByTagName('span').length > 0) {
newHref = _this.innerText;
_this.setAttribute('href', newHref);
} else if (_this.href.indexOf("link.zhihu.com/?target=") > -1) {
externalHref = _this.href;
newHref = externalHref.substring(externalHref = _this.href.indexOf("link.zhihu.com/?target=") + "link.zhihu.com/?target=".length);
_this.setAttribute('href', decodeURIComponent(newHref));
} else {
externalHref = _this.href;
if (externalHref.lastIndexOf("https%3A")) {
newHref = _this.href.substring(_this.href.lastIndexOf("https%3A"));
} else if (externalHref.lastIndexOf("http%3A%2F%2F")) {
newHref = _this.href.substring(_this.href.lastIndexOf("http%3A"));
}
_this.setAttribute('href', decodeURIComponent(newHref));
}
});
}
}
// 问题页(https://www.zhihu.com/question/xxxx):转载、拉黑作者
function reprint() {
const color = [
{name: 'blue', value: '#0084ff'},
{name: 'green', value: '#5cb85c'},
{name: 'red', value: '#d9534f'},
{name: 'green2', value: '#004E00'},
{name: 'gray', value: 'gray'},
];
const btnStyle = 'margin-top: 15px; margin-bottom: 15px; margin-left:-18px; cursor:pointer; color: #fff; border-radius: 3px; border: 1px solid; padding: 3px 6px';
let num = 0;
for (let item of document.querySelectorAll('div[class="List-item"]')) {
const eleMeta = item.getElementsByClassName('ContentItem-meta')[0];
const answerID = item.getElementsByTagName('div')[0].getAttribute('name');
if (document.getElementById(answerID)) {
continue;
}
const answerItem = item.getElementsByClassName('AnswerItem')[0];
let dataZop = JSON.parse(answerItem.getAttribute("data-zop"));
let userBlacklist = GM_getValue("menu_customBlockUsers").split("|");
for (let user of userBlacklist) {
console.log(user, dataZop.authorName);
if (user === dataZop.authorName) {
item.style = "display:none";
break;
}
}
const text = eleMeta.parentElement.getElementsByClassName("RichContent")[0].innerText;
const reprintBtn = createEle('button',
'一键转载',
{
id: answerID,
style: `background:${color[num % color.length].value}; ${btnStyle}; margin-left:0`
});
// reprintBtn.setAttribute('value', text);
reprintBtn.addEventListener('click', () => {
updateClipboard(text)
});
eleMeta.append(reprintBtn);
const blacklist = createEle('button',
`拉黑 ${dataZop.authorName}`,
{
id: answerID,
style: `background:${color[(num + 1) % color.length].value}; ${btnStyle}; margin-left:0`
});
blacklist.addEventListener('click', () => {
let ok = confirm("拉黑该作者后,将屏蔽该作者在所有问题下的回答。【注:可通过自定义屏蔽用户将用户移除黑名单】");
if (ok) {
let users = GM_getValue("menu_customBlockUsers");
GM_setValue("menu_customBlockUsers", users.concat("|", dataZop.authorName));
item.style = "display:none";
} else {
console.log("取消拉黑");
}
});
eleMeta.append(blacklist);
num++;
}
}
function blockAnswerItem() {
let block = e => {
if (e.target.innerHTML && e.target.getElementsByClassName('AnswerItem').length > 0) {
let item = e.target.getElementsByClassName('AnswerItem')[0];
if (item) {
let dataZop = item.getAttribute("data-zop");
let parsed = JSON.parse(dataZop);
let keywords = GM_getValue("menu_customBlockKeywords");
if (keywords) {
keywords.split("|").forEach(keyword => {
if (parsed && parsed.title && parsed.title.includes(keyword)) {
item.parentNode.remove();
}
})
}
let users = GM_getValue("menu_customBlockUsers");
if (users) {
users.split("|").forEach(user => {
if (parsed && parsed.authorName && parsed.authorName.includes(user)) {
item.parentNode.remove();
console.log("已屏蔽", parsed.authorName);
}
})
}
}
}
};
document.addEventListener('DOMNodeInserted', block); // 监听插入事件
}
GM_registerMenuCommand("自定义屏蔽标题关键词", function () {
let keywords = GM_getValue('menu_customBlockKeywords');
keywords = prompt("编辑 [自定义屏蔽标题关键词]\n(不同关键字之间使用 \"|\" 分隔,例如:关键字A|关键字B|关键字C )", keywords);
if (keywords) {
GM_setValue("menu_customBlockKeywords", keywords);
}
});
GM_registerMenuCommand("自定义屏蔽用户", function () {
let keywords = GM_getValue('menu_customBlockUsers');
keywords = prompt("编辑 [自定义屏蔽用户]\n(不同关键字之间使用 \"|\" 分隔,例如:用户A|用户B|用户C )", keywords);
if (keywords) {
GM_setValue("menu_customBlockUsers", keywords);
}
});
(function () {
'use strict';
// Your code here...
const urlZhiHuFeed = "https://www.zhihu.com/";
const urlZhihuFollow = "https://www.zhihu.com/follow";
const reUrlZhiHuQuestion = /https:\/\/www.zhihu.com\/question\/.*/;
window.onload = (e) => {
if (location.href === urlZhiHuFeed) {
// 重定向首页到关注页面
document.querySelector('a[href="/follow"]').click();
}
if (location.href === urlZhiHuFeed || urlZhihuFollow) {
// 清除搜索框中的问题推荐
document.querySelector("input#Popover1-toggle.Input").placeholder = "输入问题";
}
};
window.addEventListener('scroll', debounce(() => {
if (reUrlZhiHuQuestion.test(location.href)) {
// 问题页增加转载按钮
reprint();
}
}, 100));
// 站外链接直接跳转
setInterval(directLink, 100);
// 屏蔽含关键字的问题, 屏蔽某用户答案
blockAnswerItem();
})();