Advertisement
waygeek

Delete comments with key word

Dec 25th, 2024 (edited)
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function() {
  2.   // --- Налаштування ---
  3.   const KEY_PHRASE = 'red packet'.toLowerCase(); // пошукова фраза
  4.   const SCROLL_PAUSE_MS = 800;   // Пауза після скролу (0.8 секунди)
  5.   const DELETE_PAUSE_MS = 500;   // Пауза між кроками видалення (0.5 секунди)
  6.   const MAX_SCROLL_TRIES = 10;   // Максимальна кількість «прокруток», якщо не з'являється нічого нового
  7.  
  8.   // --- Глобальні змінні ---
  9.   let lastCommentCount = 0; // відстежуємо кількість коментарів до прокручування
  10.   let scrollTries = 0;      // скільки разів поспіль прокрутили без появи нових коментарів
  11.  
  12.   /**
  13.    * Функція прокрутки вниз (використовуємо scrollBy).
  14.    * Повертає Promise, який виконається після SCROLL_PAUSE_MS.
  15.    */
  16.   function scrollDown() {
  17.     return new Promise((resolve) => {
  18.       // Прокрутимо вікно на 99999 px вниз
  19.       window.scrollBy({ top: 99999, left: 0, behavior: 'smooth' });
  20.       // Чекаємо, поки YouTube підвантажить нові коментарі
  21.       setTimeout(resolve, SCROLL_PAUSE_MS);
  22.     });
  23.   }
  24.  
  25.   /**
  26.    * Перевіряємо, чи з'явилися нові коментарі (#content-text) після скролу.
  27.    */
  28.   function hasNewComments() {
  29.     const currentCount = document.querySelectorAll('#contents #content-text').length;
  30.     if (currentCount > lastCommentCount) {
  31.       lastCommentCount = currentCount;
  32.       return true; // з'явилися нові
  33.     }
  34.     return false;  // немає нових
  35.   }
  36.  
  37.   /**
  38.    * Повертає масив елементів коментарів, що містять ключову фразу.
  39.    */
  40.   function getCommentsToDelete() {
  41.     const allComments = document.querySelectorAll('#contents #content-text');
  42.     const result = [];
  43.     allComments.forEach((commentEl) => {
  44.       const text = (commentEl.innerText || '').toLowerCase();
  45.       if (text.includes(KEY_PHRASE)) {
  46.         result.push(commentEl);
  47.       }
  48.     });
  49.     return result;
  50.   }
  51.  
  52.   /**
  53.    * Послідовно (рекурсивно) видаляє коментарі із масиву comments.
  54.    * Повертає Promise, що виконується після видалення всіх.
  55.    */
  56.   function deleteCommentsSequentially(comments, index = 0) {
  57.     return new Promise((resolve) => {
  58.       if (index >= comments.length) {
  59.         return resolve(); // всі оброблено
  60.       }
  61.  
  62.       const commentEl = comments[index];
  63.       const commentText = commentEl.innerText.trim();
  64.  
  65.       console.log(`\n=== Видаляємо коментар #${index+1}/${comments.length} ===`);
  66.       console.log('Текст коментаря:', commentText);
  67.  
  68.       // Знаходимо контейнер коментаря
  69.       const commentContainer =
  70.         commentEl.closest('ytd-comment-thread-renderer') ||
  71.         commentEl.closest('ytd-comment-renderer');
  72.  
  73.       if (!commentContainer) {
  74.         console.warn('Не знайдено контейнер для коментаря:', commentText);
  75.         setTimeout(() => {
  76.           deleteCommentsSequentially(comments, index + 1).then(resolve);
  77.         }, DELETE_PAUSE_MS);
  78.         return;
  79.       }
  80.  
  81.       // Кнопка «Меню дій» (три крапки) — у вас aria-label="Меню дій"
  82.       // Якщо інша мова, адаптуйте
  83.       const menuButton = commentContainer.querySelector('#button[aria-label="Меню дій"]');
  84.       if (!menuButton) {
  85.         console.warn('Не знайдено кнопку «Меню дій»:', commentText);
  86.         setTimeout(() => {
  87.           deleteCommentsSequentially(comments, index + 1).then(resolve);
  88.         }, DELETE_PAUSE_MS);
  89.         return;
  90.       }
  91.  
  92.       // 1) Клік на «Меню дій»
  93.       menuButton.click();
  94.  
  95.       setTimeout(() => {
  96.         // 2) Шукаємо пункт «Вилучити»
  97.         const menuItems = document.querySelectorAll(
  98.           'ytd-menu-popup-renderer ytd-menu-service-item-renderer, ' +
  99.           'ytd-menu-popup-renderer tp-yt-paper-item'
  100.         );
  101.  
  102.         let deleteItem = null;
  103.         menuItems.forEach((item) => {
  104.           if (item.innerText.trim().toLowerCase().includes('вилучити')) {
  105.             deleteItem = item;
  106.           }
  107.         });
  108.  
  109.         if (!deleteItem) {
  110.           console.warn('Не знайдено пункт «Вилучити» для:', commentText);
  111.           setTimeout(() => {
  112.             deleteCommentsSequentially(comments, index + 1).then(resolve);
  113.           }, DELETE_PAUSE_MS);
  114.           return;
  115.         }
  116.  
  117.         // Натискаємо «Вилучити»
  118.         deleteItem.click();
  119.  
  120.         setTimeout(() => {
  121.           // 3) Підтвердження (кнопка з aria-label="Вилучити")
  122.           const confirmBtn = document.querySelector('button[aria-label="Вилучити"]');
  123.           if (!confirmBtn) {
  124.             console.warn('Не знайдено кнопку підтвердження «Вилучити» для:', commentText);
  125.             setTimeout(() => {
  126.               deleteCommentsSequentially(comments, index + 1).then(resolve);
  127.             }, DELETE_PAUSE_MS);
  128.             return;
  129.           }
  130.  
  131.           confirmBtn.click();
  132.           console.log('Коментар видалено:', commentText);
  133.  
  134.           setTimeout(() => {
  135.             deleteCommentsSequentially(comments, index + 1).then(resolve);
  136.           }, DELETE_PAUSE_MS);
  137.         }, DELETE_PAUSE_MS);
  138.       }, DELETE_PAUSE_MS);
  139.     });
  140.   }
  141.  
  142.   /**
  143.    * Основна логіка:
  144.    * 1. Прокрутити сторінку вниз
  145.    * 2. Перевірити, чи є нові коментарі
  146.    * 3. Знайти всі з ключовим словом та видалити
  147.    * 4. Якщо немає коментарів для видалення — повторити скролл
  148.    *    до тих пір, поки не вичерпаємо спроби (MAX_SCROLL_TRIES)
  149.    */
  150.   function mainFlow() {
  151.     scrollDown().then(() => {
  152.       const newComments = hasNewComments();
  153.       const commentsToDelete = getCommentsToDelete();
  154.  
  155.       if (commentsToDelete.length === 0) {
  156.         if (!newComments) {
  157.           scrollTries++;
  158.           console.log(`Немає нових коментарів. Спроба: ${scrollTries}/${MAX_SCROLL_TRIES}`);
  159.         } else {
  160.           console.log('Нові коментарі зʼявилися, але без «red packet».');
  161.         }
  162.  
  163.         if (scrollTries >= MAX_SCROLL_TRIES) {
  164.           console.log('Досягнуто ліміт прокручувань. Завершуємо.');
  165.           return;
  166.         }
  167.  
  168.         // Знову запускаємо mainFlow (продовжуємо скролити)
  169.         mainFlow();
  170.       } else {
  171.         scrollTries = 0; // обнулимо лічильник, бо знову є що видаляти
  172.         console.log(`Знайдено ${commentsToDelete.length} коментарів із «red packet». Починаємо видалення...`);
  173.  
  174.         // Видаляємо послідовно, після чого знову викликаємо mainFlow
  175.         deleteCommentsSequentially(commentsToDelete).then(() => {
  176.           mainFlow();
  177.         });
  178.       }
  179.     });
  180.   }
  181.  
  182.   // Старт
  183.   mainFlow();
  184. })();
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement