用ChatGPT 写了一个批量删除空相册的代码, 只需要在相册页面运行即可
因为网络问题, 部分没加载删除成功的需要刷新后 再次粘贴运行
const sleep = (ms, label = '') =>
new Promise(r => {
label && console.log(`[sleep] ${label} ${ms}ms`);
setTimeout(r, ms);
});
function waitFor(selector, timeout = 5000, label = '') {
console.log(`[waitFor:start] ${label || selector}`);
return new Promise((resolve, reject) => {
const start = Date.now();
const timer = setInterval(() => {
const el = document.querySelector(selector);
if (el) {
clearInterval(timer);
console.log(
`[waitFor:success] ${label || selector} in ${Date.now() - start}ms`
);
resolve(el);
} else if (Date.now() - start > timeout) {
clearInterval(timer);
console.warn(
`[waitFor:timeout] ${label || selector} after ${timeout}ms`
);
reject(new Error(`timeout: ${selector}`));
}
}, 50);
});
}
function waitForIn(root, selector, timeout = 3000, label = '') {
console.log(`[waitFor:start] ${label || selector}`);
return new Promise((resolve, reject) => {
const start = Date.now();
const timer = setInterval(() => {
const el = root.querySelector(selector);
if (el) {
clearInterval(timer);
console.log(
`[waitFor:success] ${label || selector} in ${Date.now() - start}ms`
);
resolve(el);
} else if (Date.now() - start > timeout) {
clearInterval(timer);
console.warn(
`[waitFor:timeout] ${label || selector}`
);
reject(new Error(`timeout: ${label || selector}`));
}
}, 50);
});
}
(async () => {
const albums = document.querySelectorAll('.relative.cursor-pointer');
console.log(`[init] 发现相册数量:${albums.length}`);
for (let i = 0; i < albums.length; i++) {
console.log(`\n[album:${i}] 开始处理`);
const AlbumI = albums[i];
const nameEl = AlbumI.querySelector('p');
const numEl = AlbumI.querySelector('span');
if (!nameEl || !numEl) {
console.warn(`[album:${i}] 结构不完整,跳过`);
continue;
}
const AlbumName = nameEl.innerText.trim();
const AlbumNum = parseInt(numEl.innerText, 10);
console.log(
`[album:${i}] 名称="${AlbumName}" 照片数量=${AlbumNum}`
);
if (AlbumNum !== 0) {
console.log(`[album:${i}] ${AlbumName}不是空相册,跳过`);
continue;
}
try {
console.log(`[album:${i}] hover`);
AlbumI.dispatchEvent(
new MouseEvent('mouseenter', { bubbles: true })
);
console.log(`[album:${i}] 等待更多按钮`);
const moreBtn = await waitForIn(
AlbumI,
'[aria-haspopup="true"]',
3000,
'more button'
);
console.log(`[album:${i}] 点击更多按钮`);
moreBtn.click();
console.log(`[album:${i}] 等待下拉菜单`);
await waitFor(
'.semi-dropdown-item',
5000,
'dropdown item'
);
const deleteItem = [...document.querySelectorAll('.semi-dropdown-item')]
.find(li => li.innerText.includes('删除相册'));
if (!deleteItem) {
console.warn(`[album:${i}] 未找到“删除相册”菜单项`);
continue;
}
console.log(`[album:${i}] 点击删除相册`);
deleteItem.click();
console.log(`[album:${i}] 等待确认框`);
const confirmBtn = await waitFor(
'button[aria-label="confirm"]',
5000,
'confirm button'
);
console.log(`[album:${i}] 确认删除`);
confirmBtn.click();
console.log(`✔ 已删除空相册:${AlbumName}`);
await sleep(1000, '删除后缓冲');
} catch (err) {
console.error(
`[album:${i}] 失败:${AlbumName}`,
err.message || err
);
}
}
console.log('[done] 所有相册处理完成');
})();
