// ==UserScript== // @name B站视频下载助手(脚本猫版) // @namespace https://scriptcat.org/zh-CN/users/211428 // @version 1.0.2 // @description 下载B站视频,支持投稿和番剧,可选择清晰度,下载当前或全部P // @author ganjueqi // @license GPL-3.0-or-later // @copyright 2026, ganjueqi // ---------- 发布平台标签(用于GreasyFork等站点的分类检索) ---------- // @tag B站 // @tag 视频下载 // @tag bilibili // @tag downloader // @tag 番剧下载 // @tag 投稿视频 // ---------- 项目与支持 ---------- // @homepageURL https://github.com/ganjueqi/bili-downloader // @supportURL https://github.com/ganjueqi/bili-downloader/issues // ---------- 匹配规则 ---------- // @match https://www.bilibili.com/video/* // @match https://www.bilibili.com/bangumi/* // @match https://bilibili.com/video/* // @match https://bilibili.com/bangumi/* // ---------- 权限申请 ---------- // @grant GM_xmlhttpRequest // @grant GM_download // @grant unsafeWindow // @run-at document-end //@icon data:image/png;base64,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 // ==/UserScript== (function() { 'use strict'; // ======================== 基本配置 ======================== // 这里可以按需调整下载并发数和清晰度对应的数字代号 const CONFIG = { maxThread: 2, // 同时下载的视频个数(别开太多,防止被限制) qualityMap: { // 清晰度选项(数字是B站接口用的参数) '高清1080P': 80, '最佳': 120, // 通常指最高可用画质 '超清4K': 120, '高清1080P+': 112, '高清720P60': 74, '高清720P': 64, '流畅360P': 16 } }; // ======================== 工具函数 ======================== // 在控制台打印带前缀的日志,方便调试 function log(msg, data) { console.log('[B站下载]', msg, data || ''); } // ----- 获取当前页面视频信息(同步,从全局状态里读) ----- // 仅适用于投稿视频(非番剧) function getPageInfo() { const state = unsafeWindow.__INITIAL_STATE__; if (!state) return null; if (state.videoData && state.videoData.pages) { // 检测到投稿视频 return { type: 'tougao', state: state, bvid: state.bvid, pages: state.videoData.pages, title: state.videoData.title }; } return null; } // ----- 异步获取番剧信息(通过API请求) ----- async function getFanjuInfo() { // 从当前网址中提取 season_id 或 ep_id const path = location.pathname; let season_id = null, ep_id = null; const ssMatch = path.match(/\/bangumi\/play\/ss(\d+)/); if (ssMatch) season_id = ssMatch[1]; const epMatch = path.match(/\/bangumi\/play\/ep(\d+)/); if (epMatch) ep_id = epMatch[1]; // 构造请求地址 let url; if (season_id) { url = `https://api.bilibili.com/pgc/view/web/ep/list?season_id=${season_id}&t=${Date.now()}`; } else if (ep_id) { url = `https://api.bilibili.com/pgc/view/web/ep/list?ep_id=${ep_id}&t=${Date.now()}`; } else { return null; } // 发出请求获取剧集列表 const resp = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'Accept': 'application/json' }, onload: (res) => resolve(JSON.parse(res.responseText)), onerror: reject }); }); if (resp && resp.result && resp.result.episodes) { const episodes = resp.result.episodes; // 用第一集的分享标题作为整部番的标题 const title = episodes[0]?.share_copy || '番剧'; return { type: 'fanju', title: title, episodes: episodes }; } return null; } // ----- 获取投稿视频的播放地址(单个分P) ----- async function getTougaoUrl(cid, bvid, quality) { const url = `https://api.bilibili.com/x/player/playurl?cid=${cid}&bvid=${bvid}&otype=json&qn=${quality}`; const resp = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'Accept': 'application/json' }, onload: (res) => resolve(JSON.parse(res.responseText)), onerror: reject }); }); // 通常 durl 数组第一个就是主视频地址(分段合并情况暂只取第一个) if (resp.data && resp.data.durl && resp.data.durl.length > 0) { return resp.data.durl[0].url; } return null; } // ----- 获取番剧视频的播放地址(单个剧集) ----- async function getFanjuUrl(ep_id, quality) { const url = `https://api.bilibili.com/pgc/player/web/playurl/?ep_id=${ep_id}&qn=${quality}`; const resp = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'Accept': 'application/json' }, onload: (res) => resolve(JSON.parse(res.responseText)), onerror: reject }); }); if (resp.result && resp.result.durl && resp.result.durl.length > 0) { return resp.result.durl[0].url; } return null; } // ----- 使用GM_download直接下载(推荐) ----- function downloadVideo(url, filename) { return new Promise((resolve, reject) => { GM_download({ url: url, name: filename, headers: { 'Referer': 'https://www.bilibili.com/' }, onload: resolve, onerror: reject }); }); } // (备选方案)用GM_xmlhttpRequest拉取blob再通过a标签下载,但一般用上面的即可 async function downloadBlob(url, filename) { const blob = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: url, responseType: 'blob', onload: (res) => resolve(res.response), onerror: reject }); }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = filename; a.click(); URL.revokeObjectURL(a.href); } // ======================== 用户界面构建 ======================== // 在页面右上角生成一个面板,包含标题、清晰度选择、下载按钮和分P列表 function createUI() { // 先移除之前可能残留的面板 const old = document.getElementById('bili-downloader-panel'); if (old) old.remove(); const panel = document.createElement('div'); panel.id = 'bili-downloader-panel'; panel.style.cssText = ` position: fixed; top: 80px; right: 20px; width: 400px; max-height: 80vh; background: #fff; border: 1px solid #ccc; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.3); z-index: 99999; display: flex; flex-direction: column; overflow: hidden; font-family: "Microsoft YaHei", sans-serif; font-size: 14px; color: #333; `; // ----- 标题栏(含关闭按钮) ----- const header = document.createElement('div'); header.style.cssText = ` background: #00a1d6; color: #fff; padding: 10px 15px; font-weight: bold; display: flex; justify-content: space-between; align-items: center; `; const titleSpan = document.createElement('span'); titleSpan.textContent = 'B站视频下载'; header.appendChild(titleSpan); const closeBtn = document.createElement('span'); closeBtn.textContent = '✕'; closeBtn.style.cssText = 'cursor:pointer; font-size:18px;'; closeBtn.onclick = () => { panel.style.display = 'none'; }; header.appendChild(closeBtn); panel.appendChild(header); // ----- 信息区:视频标题、清晰度选择、操作按钮 ----- const info = document.createElement('div'); info.style.cssText = 'padding: 10px 15px; border-bottom: 1px solid #eee;'; const videoTitle = document.createElement('div'); videoTitle.id = 'downloader-title'; videoTitle.style.cssText = 'font-weight:bold; font-size:16px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;'; videoTitle.textContent = '加载中...'; info.appendChild(videoTitle); const controls = document.createElement('div'); controls.style.cssText = 'margin-top:8px; display:flex; align-items:center; flex-wrap:wrap; gap:6px;'; // 清晰度下拉框 const qLabel = document.createElement('span'); qLabel.textContent = '清晰度:'; controls.appendChild(qLabel); const qSelect = document.createElement('select'); qSelect.id = 'downloader-quality'; const qMap = CONFIG.qualityMap; Object.keys(qMap).forEach(k => { const opt = document.createElement('option'); opt.value = qMap[k]; opt.textContent = k; qSelect.appendChild(opt); }); // 从本地存储恢复上次选择的清晰度 qSelect.value = localStorage.getItem('biliDownloadQuality') || 120; controls.appendChild(qSelect); // “下载当前”按钮(只下载当前正在播放的分P) const btnCurrent = document.createElement('button'); btnCurrent.textContent = '下载当前'; btnCurrent.style.cssText = 'padding:4px 12px; background:#00a1d6; color:#fff; border:none; border-radius:4px; cursor:pointer;'; controls.appendChild(btnCurrent); // “下载全部”按钮(下载列表里的所有分P) const btnAll = document.createElement('button'); btnAll.textContent = '下载全部'; btnAll.style.cssText = 'padding:4px 12px; background:#ff8c00; color:#fff; border:none; border-radius:4px; cursor:pointer;'; controls.appendChild(btnAll); info.appendChild(controls); panel.appendChild(info); // ----- 分P列表(滚动) ----- const listContainer = document.createElement('div'); listContainer.style.cssText = 'flex:1; overflow-y:auto; padding:10px 15px;'; const list = document.createElement('ul'); list.id = 'downloader-list'; list.style.cssText = 'list-style:none; margin:0; padding:0;'; listContainer.appendChild(list); panel.appendChild(listContainer); document.body.appendChild(panel); // 返回UI元素引用,方便后续绑定事件 return { panel, title: videoTitle, qSelect, list, btnCurrent, btnAll }; } // ======================== 下载核心逻辑 ======================== let currentInfo = null; // 存储当前视频信息:{ type, title, items: [{id, title, cid?, bvid?, ep_id?}] } let downloadQueue = []; // 等待下载的任务队列 let activeDownloads = 0; // 当前正在下载的个数 // ---- 获取视频信息(自动识别投稿或番剧) ---- async function fetchVideoInfo() { // 先尝试投稿(从 __INITIAL_STATE__ 读取) let info = getPageInfo(); if (info) { const items = info.pages.map((p, idx) => ({ id: p.cid, title: `${idx+1}_${p.part || p.page?.part || '无标题'}_${info.title}`, cid: p.cid, bvid: info.bvid })); currentInfo = { type: 'tougao', title: info.title, items: items }; return currentInfo; } // 若不是投稿,尝试番剧 const fanju = await getFanjuInfo(); if (fanju) { const items = fanju.episodes.map((ep, idx) => ({ id: ep.id, title: `${idx+1}_${ep.share_copy || ep.title || '无标题'}_${fanju.title}`, ep_id: ep.id })); currentInfo = { type: 'fanju', title: fanju.title, items: items }; return currentInfo; } return null; } // ---- 向队列中添加一个下载任务 ---- function addDownloadTask(item, quality) { downloadQueue.push({ item, quality }); processQueue(); // 尝试开始处理队列 } // ---- 处理队列(并发控制) ---- async function processQueue() { // 如果队列空或并发已满,则暂不处理 if (downloadQueue.length === 0 || activeDownloads >= CONFIG.maxThread) return; const task = downloadQueue.shift(); activeDownloads++; try { const { item, quality } = task; let url; if (currentInfo.type === 'tougao') { url = await getTougaoUrl(item.cid, item.bvid, quality); } else if (currentInfo.type === 'fanju') { url = await getFanjuUrl(item.ep_id, quality); } if (url) { // 下载文件,命名格式为“标题.mp4”(实际可能是flv,但影响不大) const filename = item.title + '.mp4'; await downloadVideo(url, filename); log('下载完成', filename); // 这里可以添加界面反馈(如标记已完成),暂略 } else { log('获取视频地址失败', item); } } catch (e) { log('下载出错', e); } finally { activeDownloads--; // 继续处理队列中剩余的任务 processQueue(); } } // ======================== 主入口 ======================== async function init() { // 创建UI面板 const ui = createUI(); // 获取当前视频信息(投稿或番剧) const info = await fetchVideoInfo(); if (!info) { ui.title.textContent = '未识别视频信息'; return; } ui.title.textContent = info.title; // 将每个分P显示在列表中,并绑定“下载”按钮 ui.list.innerHTML = ''; info.items.forEach((item, idx) => { const li = document.createElement('li'); li.style.cssText = ` padding: 6px 0; border-bottom: 1px solid #f0f0f0; display: flex; align-items: center; justify-content: space-between; `; const span = document.createElement('span'); span.textContent = item.title; span.style.cssText = 'white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:220px;'; const btn = document.createElement('button'); btn.textContent = '下载'; btn.style.cssText = 'padding:2px 10px; background:#00a1d6; color:#fff; border:none; border-radius:4px; cursor:pointer;'; btn.dataset.idx = idx; btn.onclick = function(e) { e.stopPropagation(); const quality = parseInt(ui.qSelect.value, 10); addDownloadTask(item, quality); btn.textContent = '队列中'; btn.disabled = true; // 3秒后恢复按钮文字(只是演示效果) setTimeout(() => { btn.textContent = '下载'; btn.disabled = false; }, 3000); }; li.appendChild(span); li.appendChild(btn); ui.list.appendChild(li); }); // ---- “下载当前”按钮:根据当前播放的cid找到对应的分P ---- ui.btnCurrent.onclick = function() { const state = unsafeWindow.__INITIAL_STATE__; let currentCid = state?.cid || state?.videoData?.cid; if (!currentCid) { alert('无法获取当前播放视频ID'); return; } const item = info.items.find(it => it.cid === currentCid || it.id === currentCid); if (!item) { alert('当前视频不在列表中'); return; } const quality = parseInt(ui.qSelect.value, 10); addDownloadTask(item, quality); }; // ---- “下载全部”按钮:将所有分P加入队列 ---- ui.btnAll.onclick = function() { const quality = parseInt(ui.qSelect.value, 10); info.items.forEach(item => { addDownloadTask(item, quality); }); }; } // 等待页面完全加载后再启动 if (document.readyState === 'complete') { init(); } else { window.addEventListener('load', init); } })();