// ==UserScript== // @name B站视频解析脚本 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 在B站视频页添加解析视频按钮 // @author Waves_Man // @author-github https://github.com/Waves-Man // @author-homepage http://home.foreve.asia // @match https://www.bilibili.com/video/* // @icon https://pic.nfcraft.club//website/home.foreve.asia/images/icon/favicon.ico // @grant none // @license GPL-2.0 license // ==/UserScript== (function() { 'use strict'; // 获取视频的BV号 const bvId = window.location.pathname.split('/')[2]; // 在脚本开头定义按钮位置参数 const buttonPositionTop = '820px'; // 可以调整 const buttonPositionRight = '800px'; // 可以调整 // 创建按钮 const button = document.createElement('button'); button.innerText = '解析视频'; button.style.position = 'fixed'; button.style.top = buttonPositionTop; // 使用参数 button.style.right = buttonPositionRight; // 使用参数 button.style.zIndex = '9999'; button.style.padding = '10px 15px'; button.style.backgroundColor = '#4CAF50'; button.style.color = '#fff'; button.style.border = 'none'; button.style.borderRadius = '5px'; button.style.cursor = 'pointer'; // 创建浮动窗口 const modal = document.createElement('div'); modal.style.display = 'none'; // 初始隐藏 modal.style.position = 'fixed'; modal.style.top = '520px'; // 调整为在按钮下方 modal.style.right = '550px'; // 与按钮对齐 modal.style.width = '300px'; modal.style.padding = '20px'; modal.style.backgroundColor = '#fff'; modal.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)'; modal.style.zIndex = '10000'; // 创建“开始解析”按钮 const startButton = document.createElement('button'); startButton.innerText = '开始解析'; startButton.style.marginRight = '10px'; // New style startButton.style.border = 'none'; // 去掉边框 startButton.style.borderRadius = '5px'; // 圆角 startButton.style.backgroundColor = '#4CAF50'; // 设置背景颜色 startButton.style.padding = '10px 15px'; // 增加内边距 startButton.style.display = 'block'; // 确保它在新的一行 // startButton.onclick = async () => { outputArea.innerText = `正在解析 BV号: ${bvId}...`; try { // 发送请求获取视频数据 const response = await fetch(`https://api.bilibili.com/x/web-interface/view?bvid=${bvId}`); const data = await response.json(); if (data.code === 0) { const cid = data.data.cid; // 提取cid // 发送请求获取播放链接 await fetchPlayUrl(bvId, cid); } else { outputArea.innerText = '解析失败,无法获取视频信息。'; } } catch (error) { outputArea.innerText = '请求失败,请检查网络。'; console.error('Error fetching video data:', error); } }; // 获取播放链接的函数 async function fetchPlayUrl(bvid, cid) { const url = `https://api.bilibili.com/x/player/playurl?bvid=${bvid}&cid=${cid}&qn=64&fnval=1&fnver=0&fourk=0&platform=html5`; const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Referer': 'https://www.bilibili.com/' }; try { const response = await fetch(url, { headers }); const data = await response.json(); if (data.code === 0) { const videoUrl = data.data.durl[0].url; // 获取第一个视频链接 outputArea.innerText = videoUrl; // 仅输出视频链接 } else { outputArea.innerText = '获取播放链接失败。'; } } catch (error) { outputArea.innerText = '请求播放链接失败。'; console.error('Error fetching play URL:', error); } } // 创建输出区域 const outputArea = document.createElement('div'); outputArea.style.marginTop = '10px'; // 输出区域与上方元素的间距 outputArea.style.height = '100px'; // 增加输出区域的高度 outputArea.style.border = '1px solid #ccc'; outputArea.style.padding = '5px'; outputArea.style.overflowY = 'auto'; outputArea.style.whiteSpace = 'pre-wrap'; // 保持换行 // 创建“复制URL”按钮 const copyButton = document.createElement('button'); copyButton.style.marginTop = '10px'; // 输出区域与上方元素的间距 copyButton.innerText = '复制URL'; copyButton.style.padding = '10px 15px'; // 增加内边距 // copyButton.style.fontSize = '16px'; // 增加字体大小 copyButton.style.backgroundColor = '#4CAF50'; // 设置背景颜色 copyButton.style.color = '#fff'; // 设置字体颜色 copyButton.style.border = 'none'; // 去掉边框 copyButton.style.borderRadius = '5px'; // 圆角 copyButton.style.cursor = 'pointer'; // 鼠标悬停时变为手型 copyButton.onclick = () => { const videoUrl = outputArea.innerText.trim(); // 获取输出区域的链接 if (videoUrl) { navigator.clipboard.writeText(videoUrl).then(() => { outputArea.innerText = '视频链接已复制到剪贴板!'; }).catch(() => { outputArea.innerText = '复制失败,请手动复制。'; }); } else { outputArea.innerText = '没有视频链接可复制。'; } }; // 创建关闭按钮 const closeButton = document.createElement('button'); closeButton.innerText = '关闭'; closeButton.style.marginTop = '10px'; // New style closeButton.style.border = 'none'; // 去掉边框 closeButton.style.borderRadius = '5px'; // 圆角 closeButton.style.backgroundColor = '#4CAF50'; // 设置背景颜色 closeButton.style.padding = '10px 15px'; // 增加内边距 closeButton.style.display = 'block'; // 确保它在新的一行 // closeButton.onclick = () => { modal.style.display = 'none'; // 隐藏模态窗口 outputArea.innerText = ''; // 清空输出区域 }; // 将按钮和窗口添加到页面 modal.appendChild(startButton); modal.appendChild(outputArea); modal.appendChild(copyButton); modal.appendChild(closeButton); // 关闭按钮在最后 document.body.appendChild(button); document.body.appendChild(modal); // 按钮点击事件 button.onclick = () => { modal.style.display = 'block'; // 显示模态窗口 outputArea.innerText = ''; // 清空输出区域 }; // 添加样式以改善用户体验 const style = document.createElement('style'); style.textContent = ` button { transition: background-color 0.3s; } button:hover { background-color: #ff6b81; } div { font-family: Arial, sans-serif; } `; document.head.appendChild(style); })();