先安装篡改猴:Edge、Chrome及其他,再添加下面内容为用户脚本,保存就可以了。
// ==UserScript==
// @name B站专属-记忆倍速+自动网页全屏
// @namespace http://tampermonkey.net/
// @version 2.0
// @description 修复Shadow DOM穿透,适配新版B站播放器
// @match https://www.bilibili.com/video/*
// @match https://www.bilibili.com/bangumi/play/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
const STORAGE_KEY = 'bili_custom_last_speed';
let lastSpeed = parseFloat(localStorage.getItem(STORAGE_KEY)) || 1;
let appliedSpeed = false;
let appliedFullscreen = false;
// 递归穿透 Shadow DOM 查找元素
function querySelectorDeep(root, selector) {
if (!root) return null;
const el = root.querySelector(selector);
if (el) return el;
const shadowHosts = root.querySelectorAll('*');
for (const host of shadowHosts) {
if (host.shadowRoot) {
const found = querySelectorDeep(host.shadowRoot, selector);
if (found) return found;
}
}
return null;
}
// 获取video元素
function getVideo() {
return document.querySelector('video') || querySelectorDeep(document, 'video');
}
// 获取网页全屏按钮(B站W键对应的按钮)
function getWebFullBtn() {
// 尝试多种选择器适配不同版本
const selectors = [
'.bpx-player-ctrl-web-fullscreen',
'.bpx-player-ctrl-full-web',
'.squirtle-video-webfullscreen',
'[aria-label="网页全屏"]',
'.bpx-player-ctrl-btn[title="网页全屏"]'
];
for (const sel of selectors) {
const btn = querySelectorDeep(document, sel);
if (btn) return btn;
}
return null;
}
// 获取自动连播开关
function getAutoPlaySwitch() {
const selectors = [
'.bpx-player-ctrl-next-autoplay',
'.bpx-player-autoplay-switch',
'.squirtle-autoplay-switch',
'[aria-label="自动连播"]'
];
for (const sel of selectors) {
const el = querySelectorDeep(document, sel);
if (el) return el;
}
return null;
}
// 应用倍速
function applySpeed(video) {
if (appliedSpeed || !video) return;
video.playbackRate = lastSpeed;
appliedSpeed = true;
console.log('[B站增强脚本] 已应用倍速:', lastSpeed);
// 监听倍速变化,保存到本地
video.addEventListener('ratechange', () => {
if (video.playbackRate && video.playbackRate !== lastSpeed) {
lastSpeed = video.playbackRate;
localStorage.setItem(STORAGE_KEY, lastSpeed);
console.log('[B站增强脚本] 记忆新倍速:', lastSpeed);
}
});
}
// 触发网页全屏
function applyWebFullscreen() {
if (appliedFullscreen) return;
const btn = getWebFullBtn();
if (btn) {
// 检查是否已经是网页全屏状态
if (!document.querySelector('.bpx-state-web-fullscreen') &&
!btn.classList.contains('bpx-state-active')) {
btn.click();
console.log('[B站增强脚本] 已触发网页全屏');
}
appliedFullscreen = true;
}
}
// 禁止播放结束后自动连播
function disableAutoNext(video) {
if (!video) return;
video.addEventListener('ended', () => {
console.log('[B站增强脚本] 播放结束,阻止自动连播');
// 方式1:直接暂停
video.pause();
// 方式2:尝试点击关闭自动连播开关
const sw = getAutoPlaySwitch();
if (sw) {
// 如果开关是开启状态就点一下关掉
if (sw.classList.contains('bpx-state-active') ||
sw.getAttribute('aria-checked') === 'true' ||
sw.querySelector('input')?.checked) {
sw.click();
}
}
});
}
// 主循环:等待播放器加载
let retryCount = 0;
const maxRetry = 30; // 最多等30秒
function init() {
const video = getVideo();
if (!video) {
if (retryCount++ < maxRetry) {
setTimeout(init, 1000);
}
return;
}
applySpeed(video);
disableAutoNext(video);
// 网页全屏按钮可能比video出现得晚一点,单独等
function waitFullBtn() {
const btn = getWebFullBtn();
if (btn) {
// 等视频能播放了再触发全屏
if (video.readyState >= 1) {
applyWebFullscreen();
} else {
video.addEventListener('loadedmetadata', applyWebFullscreen, { once: true });
}
} else if (retryCount++ < maxRetry) {
setTimeout(waitFullBtn, 1000);
}
}
waitFullBtn();
}
// 延迟启动,等页面初步渲染
setTimeout(init, 1500);
// 调试:打开控制台看有没有这行输出,确认脚本在运行
console.log('[B站增强脚本] 脚本已加载,等待播放器...');
})();
更新记录
v2.0 2026/7/22
- 功能实现:记忆倍速+自动网页全屏