From 8cb94ad2f81c2349c066d75401cbdeb81d3aa57b Mon Sep 17 00:00:00 2001 From: NW Date: Wed, 25 Sep 2024 12:42:17 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20parce.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parce.js | 121 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 31 deletions(-) diff --git a/parce.js b/parce.js index fc8aadd..8197273 100644 --- a/parce.js +++ b/parce.js @@ -1,34 +1,93 @@ -# WhatsApp Group Contacts Parser +// Скрипт для парсинга контактов из групп WhatsApp -Этот проект представляет собой скрипт для парсинга номеров телефонов из групп WhatsApp. Он автоматически прокручивает список участников группы и извлекает уникальные номера телефонов. +/** + * Функция для автоматической прокрутки элемента + * @param {HTMLElement} element - элемент, который нужно прокрутить + * @returns {Promise} - промис, который разрешается, когда прокрутка завершена + */ +function autoScroll(element) { + return new Promise((resolve) => { + const scrollInterval = setInterval(() => { + element.scrollBy(0, 2500); // Прокрутка на 2500 пикселей -## Описание - -Скрипт использует JavaScript для работы с DOM элементов веб-страницы WhatsApp Web. Он находит номера телефонов в элементах с определенными селекторами и сохраняет их в уникальном наборе для предотвращения дублирования. Результаты выводятся в формате JSON. - -## Функциональность - -- **Автоматическая прокрутка**: Скрипт прокручивает список участников, пока не достигнет конца. -- **Парсинг номеров телефонов**: Извлекает уникальные номера телефонов из элементов DOM. -- **Поддержка различных форматов**: Поддерживает международные форматы номеров с кодами стран. - -## Установка - -1. Скопируйте код скрипта в консоль вашего браузера или сохраните его в файл с расширением `.js`. -2. Откройте [WhatsApp Web](https://web.whatsapp.com). -3. Перейдите в нужную группу и откройте консоль разработчика (F12 или Ctrl+Shift+I). -4. Вставьте скрипт в консоль и нажмите Enter для запуска. - -## Запуск - -После запуска скрипта он начнет прокрутку и парсинг номеров телефонов. Результаты будут выведены в консоль в формате JSON, включая общее количество уникальных номеров. - -```json -{ - "count": 10, - "numbers": [ - "+1234567890", - "+0987654321", - ... - ] + // Проверяем, достигли ли конца + if (element.scrollHeight - element.scrollTop <= element.clientHeight) { + clearInterval(scrollInterval); // Останавливаем прокрутку + resolve(); // Завершаем промис + } + }, 10000); // Прокрутка каждые 10 секунд + }); } + +/** + * Функция для парсинга номеров телефонов + * @returns {Array} - массив найденных номеров телефонов + */ +function parsePhoneNumbers() { + // Собираем все элементы span, которые могут содержать номера телефонов + const phoneElements = document.querySelectorAll('div[role="gridcell"] span[dir="auto"], div[role="gridcell"] span[title]'); + + // Создаем массив для хранения всех номеров + const phoneNumbers = []; + + // Проходим по каждому элементу и извлекаем номер телефона + phoneElements.forEach(element => { + const phoneNumber = element.textContent.trim(); // Получаем текст из элемента + + // Проверяем, соответствует ли текст формату номера телефона + if (phoneNumber.match(/(?:\+?\d[\d\s\-()]*\d)/g)) { + phoneNumbers.push(phoneNumber); + } + }); + + return phoneNumbers; // Возвращаем собранные номера +} + +/** + * Основная функция для прокрутки и парсинга + */ +async function scrollAndParse() { + const block = document.querySelector('.x1n2onr6.x1n2onr6.xyw6214.x78zum5.x1r8uery'); // Замените селектор на нужный + const allNumbers = new Set(); // Используем Set для уникальных номеров + let previousCount = 0; // Количество номеров перед последней проверкой + + // Создаем наблюдатель для отслеживания изменений в DOM + const observer = new MutationObserver(() => { + const newNumbers = parsePhoneNumbers(); // Парсим новые данные + newNumbers.forEach(number => allNumbers.add(number)); // Добавляем новые данные в Set + previousCount = allNumbers.size; // Обновляем количество собранных номеров + }); + + observer.observe(block, { childList: true, subtree: true }); // Наблюдаем за дочерними элементами + + while (true) { + await autoScroll(block); // Ждем завершения прокрутки + + // Проверяем, есть ли новые элементы + if (previousCount === allNumbers.size) { + break; // Если новых номеров нет, выходим из цикла + } + + // Задержка перед следующей прокруткой, чтобы элементы успели подгрузиться + await new Promise(resolve => setTimeout(resolve, 2000)); // Ждем 2 секунды + } + + // Останавливаем наблюдатель + observer.disconnect(); + + // Конвертируем Set с номерами в массив и затем в JSON + const resultJson = JSON.stringify({ + count: allNumbers.size, // Общее количество уникальных элементов + numbers: Array.from(allNumbers) + }, null, 2); + + // Выводим результат в консоль + console.log(resultJson); + console.log("Общее количество записей в массиве: " + allNumbers.size); // Размер итогового массива + + // Если нужно сразу получить JSON-объект, а не строку: + return resultJson; +} + +// Запускаем прокрутку и парсинг +scrollAndParse();