// ==UserScript== // @name B站视频字幕工具 // @namespace http://tampermonkey.net/ // @version 1.0.3 // @description b站 播放视频时自动打开网站字幕 // @author Laqiu // @match https://www.bilibili.com/video/* // @match https://www.bilibili.com/list/watchlater/* // @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com // @grant none // ==/UserScript== /* 写的不太好,尽量保证简单了 */ (function () { 'use strict'; // ❇️设置快捷键 let key = 'n' // 字幕是否开启、是否启用字幕 let isSubtitleShowing = false let isSubtitleEnabled = false let storedUrl = null // 定义xpath function findByxpath(xpath) { return document.evaluate(xpath, document).iterateNext(); } function getUrl() { // // 实际发现后缀会不一样,需要分割一下 // const url = new URL(originalUrl); // // 3. 只保留 p 参数(清除其他所有参数) // url.searchParams.delete(url.searchParams.keys().next().value); // 清除非 p 参数(若有多个) // // 或更精准:先获取 p 参数值,再重新设置 search(确保只留 p) // const pValue = url.searchParams.get("p"); // 获取 p 的值(如 "39") // url.search = pValue ? `?p=${pValue}` : ""; // 重新设置参数,只保留 p // // 4. 输出处理后的链接 // const resultUrl = url.toString(); return window.location.href } function switch_subtitles() { if (isSubtitleEnabled) { // const subtitleButton = findByxpath("//div[@class='bpx-player-ctrl-subtitle-language-item']") const subtitleButton = findByxpath("//div[contains(@class, 'bpx-player-ctrl-subtitle-language-item')]") if (subtitleButton) { subtitleButton.click(); isSubtitleShowing = true console.log("字幕已开启") } else { console.warn('未找到字幕按钮') isSubtitleEnabled = isSubtitleShowing // 出现问题时确保恢复正常状态 } } else { // const closeButton = findByxpath("//div[@class='bpx-player-ctrl-subtitle-close-switch']") const closeButton = findByxpath("//div[contains(@class, 'bpx-player-ctrl-subtitle-close-switch')]") if (closeButton) { closeButton.click(); isSubtitleShowing = false console.log("字幕已关闭") } else { console.warn('未找到关闭字幕按钮') isSubtitleEnabled = isSubtitleShowing // 同上 } } } // 设置字幕快捷键 document.addEventListener('keydown', function (event) { // 检查按下的键是否是 'n' if (event.key === key) { isSubtitleEnabled = !isSubtitleEnabled switch_subtitles() } }); // B站使用SPA,没有简单的方式能监听页面切换,只能使用定时器轮询 let timer = setInterval(function () { if (!storedUrl) { storedUrl = getUrl() } else if (storedUrl !== getUrl()) { // 判断字幕是否存在,能找到说明还没打开 isSubtitleShowing = !(findByxpath("//div[@class='bpx-player-ctrl-subtitle-language-item']")) if (isSubtitleEnabled !== isSubtitleShowing) { switch_subtitles() } storedUrl = getUrl() } }, 2500); // 基本上不会触发,留着吧 window.addEventListener('unload', function (_event) { clearInterval(timer) }); })();