Загрузить файлы в «/»
This commit is contained in:
parent
6bdbc0d685
commit
d7c20a496b
1 changed files with 45 additions and 0 deletions
45
script.js
Normal file
45
script.js
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
(async function(){
|
||||||
|
const delay = ms => new Promise(r=>setTimeout(r,ms));
|
||||||
|
const UNSUB_DELAY = 900;
|
||||||
|
const CONFIRM_TIMEOUT = 2000;
|
||||||
|
|
||||||
|
function findUnsubButtons(){
|
||||||
|
return Array.from(document.querySelectorAll('ytd-subscribe-button-renderer button[aria-label^="Отменить подписку"], ytd-subscribe-button-renderer button'))
|
||||||
|
.filter(b => (b.textContent||'').toLowerCase().includes('вы подписаны') || (b.getAttribute('aria-label')||'').toLowerCase().includes('отменить подписку'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function waitAndConfirm(){
|
||||||
|
const start = Date.now();
|
||||||
|
while(Date.now() - start < CONFIRM_TIMEOUT){
|
||||||
|
const dialog = document.querySelector('tp-yt-paper-dialog yt-confirm-dialog-renderer, ytd-popup-container yt-confirm-dialog-renderer');
|
||||||
|
if(dialog){
|
||||||
|
const confirmBtn = dialog.querySelector('#confirm-button button, button[aria-label*="Отказаться"], button[aria-label*="Unsubscribe"]');
|
||||||
|
if(confirmBtn){ try{ confirmBtn.click(); return true; }catch(e){console.warn(e); return false; } }
|
||||||
|
}
|
||||||
|
await delay(150);
|
||||||
|
}
|
||||||
|
// fallback: глобальная кнопка по тексту
|
||||||
|
const global = Array.from(document.querySelectorAll('button, tp-yt-paper-button')).find(el=>(el.textContent||'').toLowerCase().includes('отказаться от подписки') || (el.textContent||'').toLowerCase().includes('отписаться'));
|
||||||
|
if(global){ try{ global.click(); return true; }catch(e){console.warn(e);} }
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttons = findUnsubButtons();
|
||||||
|
if(buttons.length === 0){ console.log('Не найдено кнопок "Вы подписаны" на этой части страницы. Прокрутите и повторите.'); return; }
|
||||||
|
console.log(`Найдено ${buttons.length} кнопок. Начинаю...`);
|
||||||
|
let succeeded = 0;
|
||||||
|
for(const btn of buttons){
|
||||||
|
if(!btn || !btn.isConnected) continue;
|
||||||
|
try{
|
||||||
|
btn.scrollIntoView({behavior:'auto', block:'center'});
|
||||||
|
btn.click();
|
||||||
|
const confirmed = await waitAndConfirm();
|
||||||
|
if(confirmed) succeeded++;
|
||||||
|
await delay(UNSUB_DELAY);
|
||||||
|
}catch(e){
|
||||||
|
console.warn('Ошибка при обработке', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(`Готово. Подтверждений выполнено: ${succeeded}/${buttons.length}.`);
|
||||||
|
})();
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue