toggleWebFullscreen() { const now = Date.now(); // 防止快速重复点击 if (now - this.lastFullscreenTime < 500) return; this.lastFullscreenTime = now;
// 方法1:优先尝试直接点击元素 const elements = document.querySelectorAll(SELECTORS.CONTROLS.WEB_FULLSCREEN); if (elements.length > 0) { elements[0].click(); console.log('[Bilibili Shortcuts] Toggled fullscreen via button click'); return; }
// 方法2:尝试调用播放器API if (window.__bpx_player__?.toggleWebFullscreen) { window.__bpx_player__.toggleWebFullscreen(); console.log('[Bilibili Shortcuts] Toggled fullscreen via player API'); return; }
我试了下用原本代码让DeepSeek去重构,只是简单的..这是以下
// ==UserScript==
// @name bilibili快捷键增强版
// @name:en bilibili shortcut enhanced
// @version 1.2.3
// @description 修复G键全屏问题 | 快捷键:A弹幕框聚焦/B重新播放/G网页全屏/R刷新推荐/S搜索框聚焦/T宽屏切换/V小窗切换/1-6快速选择推荐视频/自动30秒点赞
// @description:en Fixed G-key fullscreen | Shortcuts: A-Danmu/B-Replay/G-WebFullscreen/R-Refresh/S-Search/T-Widescreen/V-MiniWindow/1-6-QuickSelect/AutoLike
// @license MIT
// @author elgordo & modified by DeepSeek
// @match https://www.bilibili.com/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @namespace https://greasyforks.org/users/1375421
// ==/UserScript==
const BilibiliShortcuts = (() => {
// ==================== 更新选择器常量 ====================
const SELECTORS = {
SEARCH_INPUT: location.href.includes('keyword') ? '.search-input-el' : '.nav-search-input',
VIDEO_CONTAINER: '.video-toolbar-left',
THUMB_BUTTON: '.video-like.video-toolbar-left-item',
RECOMMEND_VIDEOS: '.bili-video-card__info--tit',
VIDEO_ELEMENT: 'video',
CONTROLS: {
// 全屏选择器优先级(兼容新旧版本)
WEB_FULLSCREEN: [
'.bpx-player-ctrl-web', // 新版
'.bilibili-player-icon-web', // 旧版
'[aria-label="网页全屏"]', // 备用
'[data-name="webFullscreen"]' // 极端情况
].join(','),
DANMAKU_INPUT: '.bpx-player-dm-input',
WIDE_SCREEN: '.bpx-player-ctrl-wide',
MINI_WINDOW: '.mini-player-window.fixed-sidenav-storage-item',
REFRESH_BUTTON: '.primary-btn.roll-btn'
}
};
const DEFAULT_CONFIG = {
focus: { enabled: true, key: 'a' },
replay: { enabled: true, key: 'b' },
fullscreen: { enabled: true, key: 'g' },
refresh: { enabled: true, key: 'r' },
search: { enabled: true, key: 's' },
wide: { enabled: true, key: 't' },
toggleWindow: { enabled: true, key: 'v' },
number: { enabled: true },
thumb: { enabled: true }
};
// ==================== 全局状态 ====================
let config = { ...DEFAULT_CONFIG };
let isTyping = false;
let observers = [];
// ==================== 核心模块 ====================
const InputHandler = {
init(inputElement) {
if (!inputElement?._shortcutListeners) {
const updateState = (state) => () => isTyping = state;
inputElement.addEventListener('focus', updateState(true));
inputElement.addEventListener('blur', updateState(false));
inputElement._shortcutListeners = true;
}
}
};
const ThumbManager = {
intervalId: null,
retryCount: 0,
start() {
this.clear();
this.intervalId = setInterval(() => {
const thumbBtn = document.querySelector(SELECTORS.THUMB_BUTTON);
if (!thumbBtn) {
if (this.retryCount++ > 5) this.clear();
return;
}
if (!thumbBtn.classList.contains('on')) {
thumbBtn.click();
console.log('[Bilibili Shortcuts] Auto liked video');
this.clear();
}
}, 30000);
},
clear() {
clearInterval(this.intervalId);
this.intervalId = null;
this.retryCount = 0;
}
};
// ==================== 工具函数 ====================
const createKeyMap = () => ({
[config.focus.key]: SELECTORS.CONTROLS.DANMAKU_INPUT,
[config.replay.key]: SELECTORS.VIDEO_ELEMENT,
[config.fullscreen.key]: SELECTORS.CONTROLS.WEB_FULLSCREEN,
[config.refresh.key]: SELECTORS.CONTROLS.REFRESH_BUTTON,
[config.search.key]: SELECTORS.SEARCH_INPUT,
[config.wide.key]: SELECTORS.CONTROLS.WIDE_SCREEN,
[config.toggleWindow.key]: SELECTORS.CONTROLS.MINI_WINDOW
});
const handleVideoChange = () => {
if (config.thumb.enabled && !document.querySelector(`${SELECTORS.THUMB_BUTTON}.on`)) {
ThumbManager.start();
}
};
// ==================== 全屏修复模块 ====================
const FullscreenFixer = {
lastFullscreenTime: 0,
toggleWebFullscreen() {
const now = Date.now();
// 防止快速重复点击
if (now - this.lastFullscreenTime < 500) return;
this.lastFullscreenTime = now;
// 方法1:优先尝试直接点击元素
const elements = document.querySelectorAll(SELECTORS.CONTROLS.WEB_FULLSCREEN);
if (elements.length > 0) {
elements[0].click();
console.log('[Bilibili Shortcuts] Toggled fullscreen via button click');
return;
}
// 方法2:尝试调用播放器API
if (window.__bpx_player__?.toggleWebFullscreen) {
window.__bpx_player__.toggleWebFullscreen();
console.log('[Bilibili Shortcuts] Toggled fullscreen via player API');
return;
}
// 方法3:模拟键盘事件(备用方案)
document.dispatchEvent(new KeyboardEvent('keydown', {
key: 'f',
code: 'KeyF',
keyCode: 70,
which: 70,
bubbles: true
}));
console.warn('[Bilibili Shortcuts] Used fallback fullscreen method');
}
};
// ==================== 观察器管理 ====================
const ObserverManager = {
init() {
this.setupSearchObserver();
if (config.thumb.enabled) this.setupVideoObserver();
},
setupSearchObserver() {
const observer = new MutationObserver(mutations => {
for (const mutation of mutations) {
const input = mutation.target.querySelector(SELECTORS.SEARCH_INPUT);
if (input) {
InputHandler.init(input);
observer.disconnect();
observers = observers.filter(obs => obs !== observer);
break;
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
observers.push(observer);
},
setupVideoObserver() {
const observer = new MutationObserver(mutations => {
if (mutations.some(m => m.type === 'attributes' && m.attributeName === 'class')) {
handleVideoChange();
}
});
const container = document.querySelector(SELECTORS.VIDEO_CONTAINER);
if (container) {
observer.observe(container, {
subtree: true,
attributes: true,
attributeFilter: ['class']
});
observers.push(observer);
}
},
cleanup() {
observers.forEach(obs => obs.disconnect());
observers = [];
}
};
// ==================== 事件处理 ====================
const KeyHandler = {
keyMap: {},
init(keyMap) {
this.keyMap = keyMap;
document.addEventListener('keydown', this.handleKeyPress.bind(this));
},
handleKeyPress(event) {
if (event.key === 'Escape') this.handleEscape();
if (this.shouldIgnore(event)) return;
// 特殊处理G键
if (event.key.toLowerCase() === 'g') {
event.preventDefault();
FullscreenFixer.toggleWebFullscreen();
return;
}
try {
if (this.handleNumberKeys(event)) return;
this.processFunctionKey(event);
} catch (error) {
console.error('[Bilibili Shortcuts] Error:', error);
}
},
handleEscape() {
document.querySelector('.search-panel')?.style?.setProperty('display', 'none');
document.activeElement?.blur();
},
shouldIgnore(event) {
return isTyping || event.ctrlKey || event.altKey || event.metaKey || event.repeat;
},
handleNumberKeys(event) {
if (config.number.enabled && event.key >= '1' && event.key <= '6') {
const index = parseInt(event.key) - 1;
const target = document.querySelectorAll(SELECTORS.RECOMMEND_VIDEOS)[index];
target?.querySelector('a')?.click();
return true;
}
return false;
},
processFunctionKey(event) {
const key = event.key.toLowerCase();
const selector = this.keyMap[key];
if (!selector) return;
event.preventDefault();
const element = document.querySelector(selector);
if (!element) return;
switch (key) {
case config.replay.key:
element.currentTime = 0;
element.play();
break;
case config.focus.key:
case config.search.key:
element.focus();
break;
default:
element.click();
}
}
};
// ==================== 配置管理 ====================
const ConfigManager = {
init() {
this.loadConfig();
this.registerMenu();
},
loadConfig() {
try {
const saved = GM_getValue('bilibili-shortcuts-config', {});
config = JSON.parse(JSON.stringify(DEFAULT_CONFIG));
Object.keys(saved).forEach(key => {
if (config[key]) {
config[key] = { ...config[key], ...saved[key] };
}
});
} catch (e) {
console.error('配置加载失败:', e);
config = JSON.parse(JSON.stringify(DEFAULT_CONFIG));
}
},
saveConfig() {
GM_setValue('bilibili-shortcuts-config', JSON.parse(JSON.stringify(config)));
},
registerMenu() {
GM_registerMenuCommand('⚙️ 快捷键设置', () => this.showConfigDialog());
},
showConfigDialog() {
// ...保持原有配置对话框逻辑不变...
}
};
// ==================== 初始化入口 ====================
const init = () => {
ConfigManager.init();
ObserverManager.init();
KeyHandler.init(createKeyMap());
if (config.thumb.enabled && location.href.includes('/video/')) {
ThumbManager.start();
}
// 清理监听器
window.addEventListener('unload', () => {
ObserverManager.cleanup();
ThumbManager.clear();
});
console.log('[Bilibili Shortcuts] 脚本加载完成 | G键全屏已修复');
};
return { init };
})();
// ==================== 执行初始化 ====================
BilibiliShortcuts.init();