您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
1.除了搜索、视频页、私信页、个人主页、专栏之外的任何页都会被重定向到搜索页;2.视频页去掉相关推荐,并且非自己的视频去掉评论。(使用时请打开“设置”-“通用”-“仅在顶层页面(框架)运行”,否则会加载次数过多)
// ==UserScript== // @name b站自律脚本 // @namespace http://tampermonkey.net/ // @version 0.5 // @description 1.除了搜索、视频页、私信页、个人主页、专栏之外的任何页都会被重定向到搜索页;2.视频页去掉相关推荐,并且非自己的视频去掉评论。(使用时请打开“设置”-“通用”-“仅在顶层页面(框架)运行”,否则会加载次数过多) // @author shandianchengzi // @match https://*.bilibili.com/* // @icon https://cdn2.iconfinder.com/data/icons/project-management-24/48/62-1024.png // @grant GM_registerMenuCommand // @grant GM_getValue // @grant GM_setValue // ==/UserScript== var skips = { 2: ['message.bilibili.com', 'member.bilibili.com'], // 这些是个人消息管理的一些域名,我是UP主,所以需要查看这些,所以不禁用这些域名 3: ['opus', 'read'] // opus and read is 专栏 }; var ad_class = ['vcd', 'ad-floor-cover', 'inside-wrp', 'activity_vote', 'pop-live-small-mode', 'ad-floor-exp']; const defaultSettings = { blockRecommendations: true, blockComments: true, blockAds: true }; // Toast function for displaying messages function Toast(msg, duration) { duration = isNaN(duration) ? 3000 : duration; var m = document.createElement('div'); m.innerHTML = msg; m.style.fontFamily = 'siyuan'; m.style.maxWidth = '60%'; m.style.minWidth = '150px'; m.style.padding = '0 14px'; m.style.height = 'auto'; m.style.color = 'rgb(255, 255, 255)'; m.style.lineHeight = '1.5'; m.style.textAlign = 'center'; m.style.borderRadius = '4px'; m.style.position = 'fixed'; m.style.top = '50%'; m.style.left = '50%'; m.style.transform = 'translate(-50%, -50%)'; m.style.zIndex = '999999'; m.style.background = 'rgba(0, 0, 0, 0.7)'; m.style.fontSize = '16px'; document.body.appendChild(m); setTimeout(function() { m.style.transition = 'opacity 0.5s ease-in'; m.style.opacity = '0'; setTimeout(function() { document.body.removeChild(m); }, 500); }, duration); } const userSettings = GM_getValue('userSettings', defaultSettings); function saveSettings(newSettings) { GM_setValue('userSettings', newSettings); } function configureSettings() { const configWindow = document.createElement('div'); configWindow.style.position = 'fixed'; configWindow.style.top = '50%'; configWindow.style.left = '50%'; configWindow.style.transform = 'translate(-50%, -50%)'; configWindow.style.backgroundColor = '#f9f9f9'; configWindow.style.padding = '20px'; configWindow.style.border = '1px solid #ddd'; configWindow.style.borderRadius = '8px'; configWindow.style.boxShadow = '0 6px 12px rgba(0, 0, 0, 0.3)'; configWindow.style.zIndex = '10000'; configWindow.style.width = '300px'; configWindow.style.fontFamily = 'Arial, sans-serif'; configWindow.innerHTML = ` <h3 style="margin-top: 0; font-size: 18px; color: #333;">配置设置</h3> <label style="display: block; margin: 10px 0;"><input type="checkbox" id="blockRecommendations" ${userSettings.blockRecommendations ? 'checked' : ''}> 屏蔽相关推荐</label> <label style="display: block; margin: 10px 0;"><input type="checkbox" id="blockComments" ${userSettings.blockComments ? 'checked' : ''}> 屏蔽评论</label> <label style="display: block; margin: 10px 0;"><input type="checkbox" id="blockAds" ${userSettings.blockAds ? 'checked' : ''}> 屏蔽广告</label> <div style="text-align: right; margin-top: 20px;"> <button id="saveSettings" style="padding: 5px 10px; margin-right: 10px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer;">保存</button> <button id="cancelSettings" style="padding: 5px 10px; background-color: #f44336; color: white; border: none; border-radius: 4px; cursor: pointer;">取消</button> </div> `; document.body.appendChild(configWindow); document.getElementById('saveSettings').addEventListener('click', () => { const newSettings = { blockRecommendations: document.getElementById('blockRecommendations').checked, blockComments: document.getElementById('blockComments').checked, blockAds: document.getElementById('blockAds').checked }; saveSettings(newSettings); document.body.removeChild(configWindow); Toast('设置已保存!刷新页面以应用更改。', 1500); }); document.getElementById('cancelSettings').addEventListener('click', () => { document.body.removeChild(configWindow); }); } GM_registerMenuCommand('配置设置', configureSettings); async function removeAds() { if (!userSettings.blockAds) return; var isMyVideoPage = await checkMyVideoPage(); // 等commentapp加载完毕, 每秒检查一次内容不为空或者不是在自己的视频里面的时候,再删除广告节点, 删除时连续删除5次 var interval_func = setInterval(function () { var commentapp = document.getElementById('commentapp'); if (commentapp != null) { if (commentapp.innerHTML != '' || isMyVideoPage == false) { for (var ii = 0; ii < 5; ii++) { setTimeout(function () { for (var i = 0; i < ad_class.length; i++) { var ad = document.getElementsByClassName(ad_class[i]); if (ad.length > 0) { for (var j = 0; j < ad.length; j++) { // 直接把这个节点删除 ad[j].parentNode.removeChild(ad[j]); } } } }, 1000 * ii); } console.log('removeAds success'); // remove interval clearInterval(interval_func); } } } , 1000); } // check if it is my space page, use the link and cookie to check async function checkSpaceLink(link) { var checkSpaceLink = false; var uidArr = link.split('space.bilibili.com/'); // use '/' or '?' to split the link var uid = uidArr[1].split('/')[0].split('?')[0]; console.log('Check uid', uid); // get cookie var cookie = document.cookie; // get DedeUserID var DedeUserID = cookie.split('DedeUserID=')[1].split(';')[0]; console.log('DedeUserID', DedeUserID); // compare uid and DedeUserID if (DedeUserID == uid) { checkSpaceLink = true; } return checkSpaceLink; } // check if it is my video page, use the href of class 'up-avatar' and 'header-entry-avatar' to check async function checkMyVideoPage() { return new Promise((resolve, reject) => { console.log('checkMyVideoPage'); var myVideoPage = false; // get the href of class 'up-avatar' var upAvatar = document.getElementsByClassName('up-avatar'); var upAvatarHref = upAvatar[0].href; console.log('upAvatarHref', upAvatarHref); // split the href to get the uid myVideoPage = checkSpaceLink(upAvatarHref); resolve(myVideoPage); }); } // try again 3 seconds later, max 10 times async function try_catch_function(func) { var count = 0; var maxCount = 10; var interval = 3000; while (count < maxCount) { try { var result = await func(); console.log('try_catch_function success'); break; } catch (err) { console.log('try_catch_function failed', err); count += 1; if (count < maxCount) { await sleep(interval); } } } } async function mainFunc() { // for bilibili // not redirect: // 1. search: https://search.bilibili.com/ // 2. video: https://www.bilibili.com/video/ // 3. message: https://message.bilibili.com/ // 4. space: https://space.bilibili.com/ console.log('usualFunc'); var url = window.location.href; var urlArr = url.split('/'); // 1. for search page, if (urlArr[2] == 'search.bilibili.com') { console.log('search page'); return; } // 2. for video page, else if (urlArr[3] == 'video') { console.log('video page'); // remove related videos and other nouseful things if (userSettings.blockRecommendations) { var relatedVideos = document.getElementById('reco_list') || document.getElementsByClassName('recommend-list-v1'); // 如果得到的结果是个列表就取第一个,但是如果没有length属性,就不是列表,就不用取第一个 if (relatedVideos.length != undefined && relatedVideos.length > 0) { relatedVideos = relatedVideos[0]; } if (relatedVideos) relatedVideos.style.visibility = 'hidden'; } // 2.2 remove ads await try_catch_function(removeAds); var isMyVideoPage = await checkMyVideoPage(); // 2.3 for not my video page and need to remove comment, remove comments if (userSettings.blockComments && isMyVideoPage == false) { console.log('start to remove comments'); // remove //*[@id="comment"] var comment = document.getElementById('comment') || document.getElementById('commentapp'); if (comment) comment.style.display = 'none'; } // 2.4 remove slide_ad var slide_ad = document.getElementById('slide_ad'); if (slide_ad != null) { slide_ad.style.display = 'none'; } } // for other pages else{ // 3. for all the skip pages and skip domains, for (var key in skips) { for (var i = 0; i < skips[key].length; i++) { if (urlArr[key] == skips[key][i]) { console.log('skip page'); // do nothing return; } } } // 4. for space page, if (urlArr[2] == 'space.bilibili.com') { var isMyPage = await checkSpaceLink(url); // for my space page, do nothing if (isMyPage == true) { console.log('my space page'); // do nothing } // for other space page, redirect to search page else if (isMyPage == false) { window.location.href = 'https://search.bilibili.com/'; } } // for other pages, redirect to search page else { console.log('other page'); window.location.href = 'https://search.bilibili.com/'; } } } (function() { 'use strict'; // 只在顶层页面运行 if (window.top !== window.self) { return; } // add mainFunc to onload console.log('add mainFunc to onload'); var oldonload = window.onload; if (typeof window.onload != 'function') { mainFunc(); } else { window.onload = function() { oldonload(); console.log('oldonload success'); mainFunc(); console.log('mainFunc success'); } } // Your code here... })();