Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (function() {
- // --- Налаштування ---
- const KEY_PHRASE = 'red packet'.toLowerCase(); // пошукова фраза
- const SCROLL_PAUSE_MS = 800; // Пауза після скролу (0.8 секунди)
- const DELETE_PAUSE_MS = 500; // Пауза між кроками видалення (0.5 секунди)
- const MAX_SCROLL_TRIES = 10; // Максимальна кількість «прокруток», якщо не з'являється нічого нового
- // --- Глобальні змінні ---
- let lastCommentCount = 0; // відстежуємо кількість коментарів до прокручування
- let scrollTries = 0; // скільки разів поспіль прокрутили без появи нових коментарів
- /**
- * Функція прокрутки вниз (використовуємо scrollBy).
- * Повертає Promise, який виконається після SCROLL_PAUSE_MS.
- */
- function scrollDown() {
- return new Promise((resolve) => {
- // Прокрутимо вікно на 99999 px вниз
- window.scrollBy({ top: 99999, left: 0, behavior: 'smooth' });
- // Чекаємо, поки YouTube підвантажить нові коментарі
- setTimeout(resolve, SCROLL_PAUSE_MS);
- });
- }
- /**
- * Перевіряємо, чи з'явилися нові коментарі (#content-text) після скролу.
- */
- function hasNewComments() {
- const currentCount = document.querySelectorAll('#contents #content-text').length;
- if (currentCount > lastCommentCount) {
- lastCommentCount = currentCount;
- return true; // з'явилися нові
- }
- return false; // немає нових
- }
- /**
- * Повертає масив елементів коментарів, що містять ключову фразу.
- */
- function getCommentsToDelete() {
- const allComments = document.querySelectorAll('#contents #content-text');
- const result = [];
- allComments.forEach((commentEl) => {
- const text = (commentEl.innerText || '').toLowerCase();
- if (text.includes(KEY_PHRASE)) {
- result.push(commentEl);
- }
- });
- return result;
- }
- /**
- * Послідовно (рекурсивно) видаляє коментарі із масиву comments.
- * Повертає Promise, що виконується після видалення всіх.
- */
- function deleteCommentsSequentially(comments, index = 0) {
- return new Promise((resolve) => {
- if (index >= comments.length) {
- return resolve(); // всі оброблено
- }
- const commentEl = comments[index];
- const commentText = commentEl.innerText.trim();
- console.log(`\n=== Видаляємо коментар #${index+1}/${comments.length} ===`);
- console.log('Текст коментаря:', commentText);
- // Знаходимо контейнер коментаря
- const commentContainer =
- commentEl.closest('ytd-comment-thread-renderer') ||
- commentEl.closest('ytd-comment-renderer');
- if (!commentContainer) {
- console.warn('Не знайдено контейнер для коментаря:', commentText);
- setTimeout(() => {
- deleteCommentsSequentially(comments, index + 1).then(resolve);
- }, DELETE_PAUSE_MS);
- return;
- }
- // Кнопка «Меню дій» (три крапки) — у вас aria-label="Меню дій"
- // Якщо інша мова, адаптуйте
- const menuButton = commentContainer.querySelector('#button[aria-label="Меню дій"]');
- if (!menuButton) {
- console.warn('Не знайдено кнопку «Меню дій»:', commentText);
- setTimeout(() => {
- deleteCommentsSequentially(comments, index + 1).then(resolve);
- }, DELETE_PAUSE_MS);
- return;
- }
- // 1) Клік на «Меню дій»
- menuButton.click();
- setTimeout(() => {
- // 2) Шукаємо пункт «Вилучити»
- const menuItems = document.querySelectorAll(
- 'ytd-menu-popup-renderer ytd-menu-service-item-renderer, ' +
- 'ytd-menu-popup-renderer tp-yt-paper-item'
- );
- let deleteItem = null;
- menuItems.forEach((item) => {
- if (item.innerText.trim().toLowerCase().includes('вилучити')) {
- deleteItem = item;
- }
- });
- if (!deleteItem) {
- console.warn('Не знайдено пункт «Вилучити» для:', commentText);
- setTimeout(() => {
- deleteCommentsSequentially(comments, index + 1).then(resolve);
- }, DELETE_PAUSE_MS);
- return;
- }
- // Натискаємо «Вилучити»
- deleteItem.click();
- setTimeout(() => {
- // 3) Підтвердження (кнопка з aria-label="Вилучити")
- const confirmBtn = document.querySelector('button[aria-label="Вилучити"]');
- if (!confirmBtn) {
- console.warn('Не знайдено кнопку підтвердження «Вилучити» для:', commentText);
- setTimeout(() => {
- deleteCommentsSequentially(comments, index + 1).then(resolve);
- }, DELETE_PAUSE_MS);
- return;
- }
- confirmBtn.click();
- console.log('Коментар видалено:', commentText);
- setTimeout(() => {
- deleteCommentsSequentially(comments, index + 1).then(resolve);
- }, DELETE_PAUSE_MS);
- }, DELETE_PAUSE_MS);
- }, DELETE_PAUSE_MS);
- });
- }
- /**
- * Основна логіка:
- * 1. Прокрутити сторінку вниз
- * 2. Перевірити, чи є нові коментарі
- * 3. Знайти всі з ключовим словом та видалити
- * 4. Якщо немає коментарів для видалення — повторити скролл
- * до тих пір, поки не вичерпаємо спроби (MAX_SCROLL_TRIES)
- */
- function mainFlow() {
- scrollDown().then(() => {
- const newComments = hasNewComments();
- const commentsToDelete = getCommentsToDelete();
- if (commentsToDelete.length === 0) {
- if (!newComments) {
- scrollTries++;
- console.log(`Немає нових коментарів. Спроба: ${scrollTries}/${MAX_SCROLL_TRIES}`);
- } else {
- console.log('Нові коментарі зʼявилися, але без «red packet».');
- }
- if (scrollTries >= MAX_SCROLL_TRIES) {
- console.log('Досягнуто ліміт прокручувань. Завершуємо.');
- return;
- }
- // Знову запускаємо mainFlow (продовжуємо скролити)
- mainFlow();
- } else {
- scrollTries = 0; // обнулимо лічильник, бо знову є що видаляти
- console.log(`Знайдено ${commentsToDelete.length} коментарів із «red packet». Починаємо видалення...`);
- // Видаляємо послідовно, після чого знову викликаємо mainFlow
- deleteCommentsSequentially(commentsToDelete).then(() => {
- mainFlow();
- });
- }
- });
- }
- // Старт
- mainFlow();
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement