diff --git a/script.js b/script.js new file mode 100644 index 0000000..9302289 --- /dev/null +++ b/script.js @@ -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}.`); +})(); +