您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
none
// ==UserScript== // @name yt blocker // @version 3 // @description none // @run-at document-start // @author rssaromeo // @license GPLv3 // @match *://youtube.com/* // @match *://*.youtube.com/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAMAAABiM0N1AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHJQTFRFAAAAEIijAo2yAI60BYyuF4WaFIifAY6zBI2wB4usGIaZEYigIoiZCIyrE4igG4iYD4mjEomhFoedCoqpDIqnDomlBYyvE4efEYmiDYqlA42xBoytD4mkCYqqGYSUFYidC4qoC4upAo6yCoupDYqmCYur4zowOQAAACZ0Uk5TAO////9vr////1+/D/+/L+/Pf/////+f3///////H4////////+5G91rAAACgUlEQVR4nM2Y22KjIBCGidg1264liZqDadK03X3/V2wNKHMC7MpF/xthHD5mgERAqZhWhfYqH6K+Qf2qNNf625hCoFj9/gblMUi5q5jLkXLCKudgyiRm0FMK82cWJp1fLbV5VmvJbCIc0GCYaFqqlDJgADdBjncqAXYobm1xh72aFMflbysteFfdy2Yi1XGOm5HGBzQ1dq7TzEoxjeNTjQZb7VA3e1c7+ImgasAgQ9+xusNVNZIo5xmOMgihIS2PbCQIiHEUdTvhxCcS/kPomfFI2zHy2PkWmA6aNatIJpKFJyekyy02xh5Y3DI9T4aOT6VhIUrsNTFp1pf79Z4SIIVDegl6IJO6cHiL/GimIZDhgTu/BlYWCQzHMl0zBWT/T3KAhtxOuUB9FtBrpsz0RV4xsjHmW+UCaffcSy/5viMGer0/6HdFNMZBq/vjJL38H9Dqx4Fuy0Em12DbZy+9pGtiDijbglwAehyj11n0tRD3WUBm+lwulE/8h4BuA+iWAQQnteg2Xm63WQLTpnMnpjdge0Mgu/GRPsV4xdjQ94Lfi624fabhDkfUqIKNrM64Q837v8yL0prasepCgrtvw1sJpoqanGEX7b5mQboNW8eawXaWXTMfMGxub472hzWzHSn6Sg2G9+6TAyRruE71s+zAzjWaknoyJCQzwxrghH2k5FDT4eqWunuNxyN9QCGcxVod5oADbYnIUkDTGZEf1xDJnSFteQ3KdsT8zYDMQXcHxsevcLH1TrsABzkNPyA/L7b0jg704viMMlpQI96WsHknCt/3YH0kOEo9zcGkwrFK39ck72rmoehmKqo2RKlilzSy/nJKEV45CT38myJp456fezktHjN5aeMAAAAASUVORK5CYII= // @grant unsafeWindow // @require https://update.gf.qytechs.cn/scripts/491829/1356221/tampermonkey%20storage%20proxy.js // @grant GM_getValue // @grant GM_setValue // @namespace https://gf.qytechs.cn/users/1184528 // ==/UserScript== ;(async () => { const a = loadlib("allfuncs") const sp = new storageproxy("globaloptions") var ls = sp.get() var rate = 2 var vidlock = true ls.blockedUsers ??= [] ls.blockedTitles ??= [] ls.blockedTitlesReg ??= [] ls.blockedCreatorsReg ??= [] await a.waitforelem( "#channel-name>#container>#text-container>yt-formatted-string>a" ) var globalname function newBlockBtn(title, creator) { var elem = a.newelem("button", { innerHTML: ls.blockedUsers.includes(this.title) ? "unblock" : "block", creator, title, id: "blockbtn", onclick(e) { e.stopImmediatePropagation() e.stopPropagation() e.preventDefault() log(this.creator) if (ls.blockedUsers.includes(this.creator)) { ls.blockedUsers.splice( ls.blockedUsers.indexOf(this.creator), 1 ) } else { ls.blockedUsers.push(this.creator) } update() log(ls.blockedUsers, this.creator) }, }) ;((elem, creator) => { var val = creator Object.defineProperty(elem, "creator", { get() { return val }, set(newval) { val = newval.replace(/ • \d+\w? views$/, "") }, enumerable: true, configurable: true, }) })(elem, creator) return elem } update() function update() { unsafeWindow.ls = ls = sp.get() if (issearch()) { addVid( "div#dismissible.style-scope.ytd-video-renderer", "#video-title", "#text > a", "#channel-info" ) } else if (isroot()) { globalname = null addVid( "div#content.style-scope.ytd-rich-item-renderer:has(ytd-rich-grid-media)", "#video-title-link", "#details>#meta>ytd-video-meta-block>#metadata>#byline-container>ytd-channel-name#channel-name>#container>#text-container>yt-formatted-string#text>a", "#details>#meta>ytd-video-meta-block" ) } else if (iswatch()) { globalname = a.qs( "ytd-channel-name#channel-name>#container>#text-container>yt-formatted-string#text > a" )?.textContent if ( !globalname || !a.qs("#upload-info") || !a.qs("#title > h1 > span.cbCustomTitle") ) { return "loading" } if (a.qs("#upload-info>#blockbtn")) { a.qs("#upload-info>#blockbtn").creator = globalname } else { a.qs("#upload-info").appendChild( newBlockBtn( a.qs("#title > h1 > span.cbCustomTitle").textContent, globalname ) ) } const btn = a.qs("#upload-info>#blockbtn") vidlock = isBlocked(btn.creator, btn.title) btn.innerHTML = isBlocked(btn.creator, btn.title) ? "unblock" : "block" try { addVid( "#dismissible:has(#video-title)", "#video-title", "#container>#text-container>yt-formatted-string#text", "#byline-container" ) addVid( "#movie_player > div.html5-endscreen.ytp-player-content.videowall-endscreen.ytp-show-tiles > div > a:has(span.ytp-videowall-still-info)", "span.ytp-videowall-still-info > span > span>div>.cbCustomTitle", "span.ytp-videowall-still-info > span > span>.ytp-videowall-still-info-author", "span.ytp-videowall-still-info > span > span>div" ) } catch (e) { error(e) } } } function isroot() { return /^https?:\/\/(?:www\.)?youtube\.com\/?(?:\?|#|$)/.test( location.href ) } function iswatch() { return /^https?:\/\/(?:www\.)?youtube\.com\/watch\/?(?:\?|#|$)/.test( location.href ) } function issearch() { return /^https?:\/\/(?:www\.)?youtube\.com\/results\?search_query=.*(?:#|$)/.test( location.href ) } setInterval(() => { update() if (iswatch()) { for (var vid of a.qsa("video")) { vid.playbackRate = vidlock ? 0 : rate } } }) function addVid( mainDivID, titleID, creatorID, blockButtonParentID ) { // remove invalid block buttons on root if (isroot()) a.qsa("#blockbtn") .filter(function (btn) { return btn.closest(blockButtonParentID) }) .forEach((e) => e.remove()) for (var viddiv of a.qsa(mainDivID)) { var btn if ((btn = a.qs(blockButtonParentID + ">#blockbtn", viddiv))) { btn.title = a.qs(titleID, viddiv).textContent btn.creator = a.qs(creatorID, viddiv).textContent btn.innerHTML = ls.blockedUsers.includes(btn.creator) ? "unblock" : "block" } else { btn = a .qs(blockButtonParentID, viddiv) .appendChild( newBlockBtn( a.qs(titleID, viddiv).textContent, a.qs(creatorID, viddiv).textContent ) ) } viddiv.style.display = isBlocked(btn.creator, btn.title) ? "none" : "" } } unsafeWindow.isBlocked = isBlocked unsafeWindow.addVid = addVid function isBlocked(creator, title) { if ( ls.blockedUsers.includes(creator) || ls.blockedTitles.includes(title) ) return true for (let reg of ls.blockedCreatorsReg) { if (new RegExp(reg, "i").test(creator)) return true } for (let reg of ls.blockedTitlesReg) { if (new RegExp(reg, "i").test(title)) return true } return false } })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址