// ==UserScript== // @name B站视频番剧增强Tool // @namespace https://github.com/Eq52/TamperMonkeyScripts/ // @version 5.0.0 // @description B站PC手机双端适配解析,番剧解析(第三方API),视频下载(第三方API),强力去广告,使用第三方API在未登录情况下体验高清画质 // @license GPL-3.0-only // @icon data:image/png;base64,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 // @author EricQ // @match *://www.bilibili.com/video/* // @match *://www.bilibili.com/bangumi/play/* // @match *://m.bilibili.com/video/* // @match *://m.bilibili.com/bangumi/play/* // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_registerMenuCommand // @run-at document-end // @require https://code.jquery.com/jquery-3.6.0.min.js // ==/UserScript== (function() { 'use strict'; // ========================================== // 1. 配置与存储 // ========================================== const UserConfig = { // 通用接口 (仅番剧页使用) baseApis: [ { n: "m1907", u: "https://z1.m1907.top/?jx=" }, { n: "HLS解析", u: "https://jx.hls.one/?url=" }, { n: "极速线路", u: "https://jx.2s0.cn/player/?url=" }, { n: "云端接口", u: "https://yparse.ik9.cc/index.php?url=" }, { n: "虾米线路", u: "https://jx.xmflv.cc/?url=" } ], // PC端与移动端选择器配置 sites: { 'bilibili_pc': { t: 'B站(PC)', s: true, sel: ['#bilibili-player', '.bpx-player-container', '#player_module'] }, 'bilibili_mb': { t: 'B站(手机)', s: true, sel: ['.mplayer', '.player-container', '#player_placeholder', '.m-video-player'] } }, ads: true, autoParse: false }; const Store = { get(k, d) { return GM_getValue(k) !== undefined ? GM_getValue(k) : d; }, set(k, v) { GM_setValue(k, v); }, loadApis() { return this.get('xj_custom_apis', UserConfig.baseApis); }, loadSites() { return this.get('xj_sites', UserConfig.sites); }, loadAds() { return this.get('xj_ads', UserConfig.ads); }, loadAutoParse() { return this.get('xj_auto_parse', UserConfig.autoParse); }, saveApis(v) { this.set('xj_custom_apis', v); }, saveSites(v) { this.set('xj_sites', v); }, saveAds(v) { this.set('xj_ads', v); }, saveAutoParse(v) { this.set('xj_auto_parse', v); } }; // ========================================== // 2. 扫描器 (环境与ID识别) // ========================================== const Scanner = { isMobile: function() { return /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent); }, // 获取页面类型 getPageType: function() { const path = window.location.pathname; if (path.includes('/bangumi/play/')) return 'bangumi'; if (path.includes('/video/')) return 'video'; return 'unknown'; }, getSiteKey: function() { const h = window.location.host; const mb = this.isMobile(); // 移动端通常域名是 m.bilibili.com,PC是 www.bilibili.com // 这里的isMobile主要用来决定找哪个DOM结构 if (h.includes('bilibili.com')) return mb ? 'bilibili_mb' : 'bilibili_pc'; return null; }, // 识别 BV 或 AV 号 getVideoInfo: function() { const url = window.location.href; // 匹配 BV const bvMatch = url.match(/\/video\/(BV[a-zA-Z0-9]{10})/); if (bvMatch) return { type: 'BV', id: bvMatch[1] }; // 匹配 AV const avMatch = url.match(/\/video\/(av(\d+))/); if (avMatch) return { type: 'AV', id: avMatch[1] }; return null; }, waitForNode: function(sel, t = 10000) { return new Promise((res, rej) => { const el = document.querySelector(sel); if (el) return res(el); const tm = setInterval(() => { const e = document.querySelector(sel); if (e) { clearInterval(tm); res(e); } }, 200); setTimeout(() => { clearInterval(tm); rej(new Error('Timeout')); }, t); }); }, findNode: function(selList) { for (let s of selList) { const el = document.querySelector(s); if (el) return el; } return null; }, findMobileBili: function() { // 移动端统一尝试查找常见的播放器容器 const selList = ['.mplayer', '.player-container', '#player_placeholder', '.m-video-player']; return this.findNode(selList); } }; // ========================================== // 3. 广告清理器 // ========================================== const AdCleaner = { rules: { bilibili: ['.bili-ad', '.ad-report', '.video-page-game-card', '.bb-comment', '.float-nav', '.rec-footer', '.bili-feedback'] }, init: function() { if (!Store.loadAds()) return; this.inject(); this.watch(); }, inject: function() { let css = ''; if (this.rules.bilibili) { this.rules.bilibili.forEach(r => css += `${r}{display:none!important;opacity:0!important;} `); } css += `div[style*="z-index"][style*="background"][style*="rgba(0,0,0"]{display:none!important;}`; GM_addStyle(css); }, watch: function() { const obs = new MutationObserver((ms) => { ms.forEach((m) => { m.addedNodes.forEach((n) => { if (n.nodeType === 1) { if (this.rules.bilibili) { this.rules.bilibili.forEach(r => { if (n.matches && n.matches(r)) n.remove(); }); } } }); }); }); if(document.body) obs.observe(document.body, { childList: true, subtree: true }); } }; // ========================================== // 4. 界面渲染器 (优化防重叠) // ========================================== const Interface = { toastTimer: null, css: ` #xj-btn { position:fixed;bottom:50px;right:20px;width:45px;height:45px; background:linear-gradient(135deg,#FB7299,#FF85A2);border-radius:50%; box-shadow:0 4px 15px rgba(251,114,153,0.4);cursor:pointer; z-index:2147483647;display:flex;align-items:center;justify-content:center; font-size:20px;color:#fff;border:none;transition:0.2s; -webkit-tap-highlight-color: transparent; } #xj-btn:hover{transform:scale(1.1);} #xj-btn:active{transform:scale(0.95);} #xj-menu{ position:fixed;bottom:105px;right:20px;width:180px; background:rgba(40,40,40,0.95);backdrop-filter:blur(10px); border-radius:12px;padding:8px;display:none;flex-direction:column; gap:5px;z-index:2147483646;border:1px solid rgba(255,255,255,0.1); box-shadow:0 5px 20px rgba(0,0,0,0.5); } .xj-item{padding:12px;color:#eee;border-radius:6px;cursor:pointer;font-size:14px;text-align:center;transition:0.2s;display:flex;align-items:center;justify-content:center;} .xj-item:hover{background:rgba(251,114,153,0.8);color:#fff;} .xj-split{height:1px;background:rgba(255,255,255,0.1);margin:5px 0;} #xj-set-modal{ display:none;position:fixed;top:0;left:0;width:100%;height:100%; background:rgba(0,0,0,0.7);z-index:2147483648; justify-content:center;align-items:center; } #xj-set-box{ background:#252525;width:320px;border-radius:12px;padding:20px;color:#ddd; box-shadow:0 10px 30px rgba(0,0,0,0.5);max-width:90%; } .xj-toggle{position:relative;width:40px;height:20px;background:#444;border-radius:20px;cursor:pointer;transition:0.3s;} .xj-toggle.on{background:#FB7299;} .xj-knob{position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:0.3s;} .xj-toggle.on .xj-knob{transform:translateX(20px);} .xj-input{width:100%;height:120px;background:#2a2a2a;border:1px solid #444;color:#ddd;padding:8px;border-radius:4px;resize:vertical;font-size:12px;} .xj-btm{margin-top:20px;text-align:right;} .xj-btn-xj{padding:8px 16px;background:#FB7299;color:#fff;border:none;border-radius:4px;cursor:pointer;margin-left:5px;} .xj-tag{font-size:10px;background:#FB7299;padding:2px 4px;border-radius:4px;margin-left:5px;} `, init: function() { GM_addStyle(this.css); this.buildBtn(); this.buildMenu(); this.buildSet(); this.bind(); }, buildBtn: function() { const b = document.createElement('button'); b.id = 'xj-btn'; b.innerHTML = '📺'; b.title = 'XJ解析助手'; document.body.appendChild(b); }, buildMenu: function() { const m = document.createElement('div'); m.id = 'xj-menu'; const pageType = Scanner.getPageType(); let h = ''; if (pageType === 'video') { h += `
视频页锁定专用接口,此处仅配置番剧页备用接口