抖音沉浸模式

抖音沉浸模式,提供全屏、清屏、最高清晰度等功能,提升观看体验。

// ==UserScript==
// @name         抖音沉浸模式
// @namespace    https://douyin.com/
// @version      1.2.5
// @description  抖音沉浸模式,提供全屏、清屏、最高清晰度等功能,提升观看体验。
// @author       Loki2077
// @match        *://www.douyin.com/*
// @grant        none
// @license      MIT
// @homepageURL  https://github.com/Loki2077/tampermonkey
// ==/UserScript==

(function() {
    'use strict';
    
    // 定义沉浸模式的状态变量,false表示未开启,true表示开启
    let immersiveMode = false;
    // 定义一个变量来存储当前的清屏状态
    let clearScreen = false;
    // 需要隐藏的元素选择器
    const hideElements = [
        '.immersive-player-switch-on-hide-interaction-area',
        '.video-info-detail',
        '.KlXLcATm.isDark',
        '.ixmqWVyr',
        '.AXQAavwp',
        'WLUaedLn'
    ];


    /**
     * 持续运行的主函数
     * 1. 当按下j键时,切换沉浸模式
     * 2. 当按下 'w' 's' '方向上' '方向下' '跟轮上' '跟轮下'键 且 开启沉浸模式 时, 清屏
     */
    const main = () => {
        
        // 监听键盘按下事件
        document.addEventListener('keydown', (event) => {
            // 打印按下的键
            console.log('-----------:' + event.key);

            // 当按下p键时,切换沉浸模式(不区分大小写)
            if (event.key.toLowerCase() === 'p') {
                immersiveMode = !immersiveMode; // 切换沉浸模式状态
                clearScreen = !clearScreen; // 切换清屏状态
                switchImmersiveMode(immersiveMode); // 调用切换沉浸模式的函数
            }
            if (event.key.toLowerCase() === 'j') {
                clearScreen = !clearScreen; // 切换清屏状态
                if (clearScreen) {
                    // 清屏
                    toggleElementsVisibility(hideElements, 'none');
                }else{
                    // 显示元素
                    toggleElementsVisibility(hideElements, '');
                }
            }
            // 当按下 'w' 's' '方向上' '方向下' 键 且 开启沉浸模式 时, 清屏
            if (clearScreen && ['w', 's', 'W', 'S', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
                // 清屏
                toggleElementsVisibility(hideElements, 'none');
                // 设置清晰度
                switchMaxResolution();
            }
        });

        // 监听鼠标滚轮事件
        document.addEventListener('wheel', (event) => {
            // 判断是否开启清屏模式
            if (clearScreen) {
                // 判断滚轮方向
                if (event.deltaY < 0) {
                    // 滚轮向上
                    console.log('Mouse wheel up');
                    toggleElementsVisibility(hideElements, 'none');
                    // 设置清晰度
                    switchMaxResolution();
                } else if (event.deltaY > 0) {
                    // 滚轮向下
                    console.log('Mouse wheel down');
                    toggleElementsVisibility(hideElements, 'none');
                    // 设置清晰度
                    switchMaxResolution();
                }
            }
        });
        // 跳过直播 


    }
    /**
     * 跳过直播 
     */
    const skipLive = () => {
        // 待实现....
    }
    

    /**
     * 切换最高清晰度
     */
    const switchMaxResolution = () => {
        // 获取所有分辨率选项元素(不区分大小写)
        const resolutionOptions = Array.from(document.querySelectorAll('div.virtual > div.item'))
            .filter(el => el.textContent && /[4K|2K|1080P|720P|540P|智能]/i.test(el.textContent.trim()));

        if (resolutionOptions.length > 0) {
            // 按照优先级排序,选择最高分辨率(假设顺序为:4k > 2k > 1080P > 720P > 540P > 智能),不区分大小写
            const priorityOrder = ['4K', '2K', '1080P', '720P', '540P', '智能'];
            resolutionOptions.sort((a, b) => {
                const aPriority = priorityOrder.indexOf(a.textContent.trim().toLowerCase());
                const bPriority = priorityOrder.indexOf(b.textContent.trim().toLowerCase());
                return aPriority - bPriority;
            });

            // 获取优先级最高的选项
            const highestResolutionOption = resolutionOptions[0];

            // 如果该选项未被选中,则点击它
            if (!highestResolutionOption.classList.contains('selected')) {
                highestResolutionOption.click();
            } else {
                console.log('当前已是最高清晰度');
            }
        } else {
            console.error('未找到任何分辨率选项');
        }
    }

    /**
     * 模拟按下指定的键
     * @param {string} key - 要模拟按下的键
     */
    const simulateKeyPress = (key) => {
        const keyCode = key.toUpperCase().charCodeAt(0);
        const event = new KeyboardEvent('keydown', { 
            key: key, 
            code: `Key${key.toUpperCase()}`, 
            keyCode: keyCode, 
            charCode: keyCode, 
            bubbles: true, 
            cancelable: true 
        });
        document.dispatchEvent(event);
    };

    /**
     * 切换指定元素的显示状态
     * @param {string[]} selectors - 元素选择器数组
     * @param {string} displayState - 目标显示状态 ('none' 或 '')
     */
    const toggleElementsVisibility = (selectors, displayState) => {
        const elements = document.querySelectorAll(selectors.join(', '));
        elements.forEach(el => {
            el.style.display = displayState;
        });
    };

    /**
     * 切换沉浸模式
     * @param {*} immersiveMode 
     */
    const switchImmersiveMode = (immersiveMode) => {
        if (immersiveMode) {
            // 模拟按下键盘 'Y' 和 'j'
            simulateKeyPress('Y');

            // 使用全屏API进入全屏模式
            if (document.documentElement.requestFullscreen) {
                document.documentElement.requestFullscreen();
            } else if (document.documentElement.mozRequestFullScreen) { // Firefox
                document.documentElement.mozRequestFullScreen();
            } else if (document.documentElement.webkitRequestFullscreen) { // Chrome, Safari and Opera
                document.documentElement.webkitRequestFullscreen();
            } else if (document.documentElement.msRequestFullscreen) { // IE/Edge
                document.documentElement.msRequestFullscreen();
            }
            // 切换最高清晰度
            switchMaxResolution();

            // 调用新方法隐藏指定元素
            toggleElementsVisibility(hideElements, 'none');
            
            // createToast('已进入沉浸模式');
        } else {
            // 模拟按下键盘 'Y' 和 'j'
            simulateKeyPress('Y');

            // 退出全屏模式
            if (document.exitFullscreen) {
                document.exitFullscreen();
            } else if (document.mozCancelFullScreen) { // Firefox
                document.mozCancelFullScreen();
            } else if (document.webkitExitFullscreen) { // Chrome, Safari and Opera
                document.webkitExitFullscreen();
            } else if (document.msExitFullscreen) { // IE/Edge
                document.msExitFullscreen();
            }
            // 切换最高清晰度
            switchMaxResolution();

            // 调用新方法恢复显示指定元素
            toggleElementsVisibility(hideElements, 'none');
            
            // createToast('已退出沉浸模式');
        }
    }

    /**
     * 创建一个提示框显示消息
     * @param {string} message - 要显示的提示信息
     */
    const createToast = (message) => {
        const toasts = document.querySelectorAll('div[style*="position: fixed; top"]');
        const verticalOffset = 20 + toasts.length * 50; // 每个弹窗间隔50px

        const toast = document.createElement('div');
        toast.style.cssText = `
            position: fixed;
            top: ${verticalOffset}px;
            right: 20px;
            background-color: rgba(0, 0, 0, 0.9);
            color: white;
            padding: 12px 24px;
            border-radius: 6px;
            z-index: 999999;
            font-size: 14px;
            transition: all 0.3s ease;
        `;
        // 设置提示框文本内容
        toast.textContent = message;
        
        // 将提示框添加到页面中
        document.body.appendChild(toast);
        
        // 设置1秒后自动移除提示框
        setTimeout(() => {
            document.body.removeChild(toast);
        }, 1000);
    };

    
    // 执行主函数,开始监听键盘事件
    main();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址