自动点击年龄确认和跳过广告按钮,暂停时隐藏界面元素以便截屏,鼠标悬停进度条区域显示控制器
// ==UserScript==
// @name 巴哈姆特动画广告跳过助手
// @namespace https://greasyfork.org/zh-CN/scripts/531816
// @version 0.6
// @description 自动点击年龄确认和跳过广告按钮,暂停时隐藏界面元素以便截屏,鼠标悬停进度条区域显示控制器
// @author YourName
// @match https://ani.gamer.com.tw/animeVideo.php?sn=*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 1. 处理年龄确认按钮
function clickAdultConfirm() {
const adultBtn = document.getElementById('adult');
if (adultBtn) {
console.log('找到年龄确认按钮,自动点击');
adultBtn.click();
setTimeout(monitorSkipButton, 1000);
} else {
setTimeout(clickAdultConfirm, 500);
}
}
// 2. 监控跳过广告按钮
function monitorSkipButton() {
const skipButton = document.getElementById('adSkipButton');
if (!skipButton) {
setTimeout(monitorSkipButton, 500);
return;
}
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'class') {
const currentClass = skipButton.getAttribute('class');
if (currentClass.includes('enable')) {
console.log('检测到可跳过的广告按钮,自动点击');
skipButton.click();
observer.disconnect();
}
}
});
});
const config = { attributes: true, attributeFilter: ['class'] };
observer.observe(skipButton, config);
if (skipButton.classList.contains('enable')) {
console.log('初始检查发现可跳过的广告按钮,自动点击');
skipButton.click();
observer.disconnect();
}
}
// 3. 监控页面变化以捕获动态加载的年龄确认界面
function observePage() {
const observer = new MutationObserver(function(mutations) {
const adultBtn = document.getElementById('adult');
if (adultBtn) {
console.log('动态检测到年龄确认按钮,触发点击');
clickAdultConfirm();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
// 4. 暂停时隐藏界面元素,播放时恢复,鼠标悬停进度条区域显示控制器
function setupPauseHide() {
const video = document.querySelector('video');
if (!video) {
setTimeout(setupPauseHide, 500);
return;
}
// 目标元素
const elementsToHide = [
'.vjs-big-play-button', // 右下角播放按钮
'.top-tool-bar', // 顶部阴影工具栏
'.control-bar-mask' // 底部阴影遮罩
];
const controlBarSelector = '.vjs-control-bar'; // 底部控制条(进度条等)
// 保存原始 display 状态
const originalDisplay = new Map();
// 隐藏元素(不包括控制条)
function hideElements() {
elementsToHide.forEach(selector => {
const element = document.querySelector(selector);
if (element) {
if (!originalDisplay.has(selector)) {
originalDisplay.set(selector, element.style.display || 'block');
}
element.style.display = 'none';
console.log(`隐藏元素: ${selector}`);
}
});
}
// 隐藏控制条
function hideControlBar() {
const controlBar = document.querySelector(controlBarSelector);
if (controlBar) {
if (!originalDisplay.has(controlBarSelector)) {
originalDisplay.set(controlBarSelector, controlBar.style.display || 'block');
}
controlBar.style.display = 'none';
console.log(`隐藏控制条: ${controlBarSelector}`);
}
}
// 显示控制条
function showControlBar() {
const controlBar = document.querySelector(controlBarSelector);
if (controlBar) {
controlBar.style.display = originalDisplay.get(controlBarSelector) || 'block';
console.log(`显示控制条: ${controlBarSelector}`);
}
}
// 恢复所有元素
function showElements() {
elementsToHide.forEach(selector => {
const element = document.querySelector(selector);
if (element) {
element.style.display = originalDisplay.get(selector) || 'block';
console.log(`恢复元素: ${selector}`);
}
});
showControlBar(); // 确保控制条也恢复
}
// 暂停时隐藏元素的逻辑
function onPause() {
hideElements();
hideControlBar();
setupControlBarHover(); // 设置鼠标悬停逻辑
}
// 设置鼠标悬停显示控制条
function setupControlBarHover() {
const videoContainer = document.querySelector('.vjs-control-bar')?.parentElement || document.querySelector('video').parentElement;
if (!videoContainer) {
console.log('未找到视频容器,重试');
setTimeout(setupControlBarHover, 500);
return;
}
// 鼠标进入时显示控制条
videoContainer.addEventListener('mouseenter', function handler(e) {
if (video.paused) {
showControlBar();
}
});
// 鼠标离开时隐藏控制条
videoContainer.addEventListener('mouseleave', function handler(e) {
if (video.paused) {
hideControlBar();
}
});
}
// 监听视频暂停和播放事件
video.addEventListener('pause', onPause);
video.addEventListener('play', showElements);
// 初始检查:如果视频已经暂停
if (video.paused) {
onPause();
}
}
// 页面加载后执行
if (document.readyState === 'complete' || document.readyState === 'interactive') {
setTimeout(clickAdultConfirm, 1000);
observePage();
setTimeout(setupPauseHide, 1000);
} else {
window.addEventListener('DOMContentLoaded', function() {
setTimeout(clickAdultConfirm, 1000);
observePage();
setTimeout(setupPauseHide, 1000);
});
}
})();