Skip to content

F12打开控制台,在Console中输入以下代码

async function deleteWatchLaterVideos() {
    const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
    
    while (true) {
        // 获取当前页面上所有的视频项目
        const videos = document.querySelectorAll('ytd-playlist-video-renderer');
        if (videos.length === 0) {
            console.log("所有视频已清理完毕,或者页面需要滚动以加载更多。");
            break;
        }

        for (const video of Array.from(videos)) {
            const menuButton = video.querySelector('#menu yt-icon-button');
            if (!menuButton) continue;

            // 1. 点击三个点的菜单按钮
            menuButton.click();
            await sleep(500); // 等待菜单动画

            // 2. 查找“从‘稍后观看’中移除”选项
            // 注意:如果你的语言是英文,请将下面的文本改为 'Remove from Watch later'
            const menuItems = Array.from(document.querySelectorAll('ytd-menu-service-item-renderer, tp-yt-paper-item'));
            const removeBtn = menuItems.find(item => 
                item.innerText.includes('从“稍后观看”中移除') || 
                item.innerText.includes('Remove from Watch later')
            );

            if (removeBtn) {
                removeBtn.click();
                console.log('正在移除一个视频...');
                // 3. 等待 UI 更新
                await sleep(800); 
            } else {
                // 如果没找到按钮,点击页面空白处关闭菜单
                document.body.click();
                await sleep(200);
            }
        }
        
        // 自动滚动到底部以加载更多(针对超长列表)
        window.scrollTo(0, document.body.scrollHeight);
        await sleep(2000);
    }
}

deleteWatchLaterVideos();

或者直接使用TamperMonkey


// ==UserScript==
// @name         YouTube 稍后观看一键清空 (Watch Later Cleaner)
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  在 YouTube 稍后观看页面添加一个“清空列表”按钮
// @author       YourName
// @match        https://www.youtube.com/playlist?list=WL
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function injectButton() {
        if (document.getElementById('clean-watch-later-btn')) return;

        // 尝试多个可能的注入位置
        const selectors = [
            'ytd-playlist-header-renderer #top-level-buttons-computed',
            'ytd-playlist-header-renderer #actions',
            '.cto-item-renderer-menu'
        ];
        
        let container = null;
        for (const selector of selectors) {
            container = document.querySelector(selector);
            if (container) break;
        }

        if (container) {
            const btn = document.createElement('button');
            btn.id = 'clean-watch-later-btn';
            btn.innerHTML = '🗑️ 一键清空列表';
            
            Object.assign(btn.style, {
                backgroundColor: '#cc0000',
                color: 'white',
                border: 'none',
                padding: '10px 20px',
                borderRadius: '20px',
                cursor: 'pointer',
                marginLeft: '10px',
                fontSize: '14px',
                fontWeight: 'bold',
                zIndex: '9999'
            });

            btn.onclick = startCleaning;
            container.appendChild(btn);
        }
    }

    async function startCleaning() {
        if (!confirm('确定要删除“稍后观看”中的所有视频吗?\n(程序将自动循环点击移除按钮)')) return;
        
        const btn = document.getElementById('clean-watch-later-btn');
        const sleep = (ms) => new Promise(r => setTimeout(r, ms));

        btn.innerText = '正在清理...';
        btn.disabled = true;

        while (true) {
            const videos = document.querySelectorAll('ytd-playlist-video-renderer');
            if (videos.length === 0) break;

            for (const video of Array.from(videos)) {
                const menuButton = video.querySelector('#menu yt-icon-button');
                if (!menuButton) continue;

                menuButton.click();
                await sleep(400);

                const items = Array.from(document.querySelectorAll('ytd-menu-service-item-renderer'));
                const removeBtn = items.find(item => 
                    item.innerText.includes('移除') || 
                    item.innerText.includes('Remove from')
                );

                if (removeBtn) {
                    removeBtn.click();
                    await sleep(600); 
                } else {
                    document.body.click(); // 点击空白处关闭菜单
                }
            }

            // 滚动到底部加载更多,并检查是否还有新视频
            window.scrollTo(0, document.body.scrollHeight);
            await sleep(1500);
            
            const nextVideos = document.querySelectorAll('ytd-playlist-video-renderer');
            if (nextVideos.length === 0) break;
        }

        btn.innerText = '✅ 清理完成';
        btn.disabled = false;
        setTimeout(() => { btn.innerText = '🗑️ 一键清空列表'; }, 3000);
    }

    const observer = new MutationObserver(injectButton);
    observer.observe(document.body, { childList: true, subtree: true });
})();