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 });
})();