Parce_WhatsApp_contact_group/parce.js

94 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

2024-09-25 12:42:17 +00:00
// Скрипт для парсинга контактов из групп WhatsApp
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
/**
* Функция для автоматической прокрутки элемента
* @param {HTMLElement} element - элемент, который нужно прокрутить
* @returns {Promise} - промис, который разрешается, когда прокрутка завершена
*/
function autoScroll(element) {
return new Promise((resolve) => {
const scrollInterval = setInterval(() => {
element.scrollBy(0, 2500); // Прокрутка на 2500 пикселей
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Проверяем, достигли ли конца
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(); // Получаем текст из элемента
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Проверяем, соответствует ли текст формату номера телефона
if (phoneNumber.match(/(?:\+?\d[\d\s\-()]*\d)/g)) {
phoneNumbers.push(phoneNumber);
}
});
return phoneNumbers; // Возвращаем собранные номера
}
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
/**
* Основная функция для прокрутки и парсинга
*/
async function scrollAndParse() {
const block = document.querySelector('.x1n2onr6.x1n2onr6.xyw6214.x78zum5.x1r8uery'); // Замените селектор на нужный
const allNumbers = new Set(); // Используем Set для уникальных номеров
let previousCount = 0; // Количество номеров перед последней проверкой
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Создаем наблюдатель для отслеживания изменений в DOM
const observer = new MutationObserver(() => {
const newNumbers = parsePhoneNumbers(); // Парсим новые данные
newNumbers.forEach(number => allNumbers.add(number)); // Добавляем новые данные в Set
previousCount = allNumbers.size; // Обновляем количество собранных номеров
});
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
observer.observe(block, { childList: true, subtree: true }); // Наблюдаем за дочерними элементами
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
while (true) {
await autoScroll(block); // Ждем завершения прокрутки
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Проверяем, есть ли новые элементы
if (previousCount === allNumbers.size) {
break; // Если новых номеров нет, выходим из цикла
}
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Задержка перед следующей прокруткой, чтобы элементы успели подгрузиться
await new Promise(resolve => setTimeout(resolve, 2000)); // Ждем 2 секунды
}
2024-09-25 12:40:37 +00:00
2024-09-25 12:42:17 +00:00
// Останавливаем наблюдатель
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;
2024-09-25 12:40:37 +00:00
}
2024-09-25 12:42:17 +00:00
// Запускаем прокрутку и парсинг
scrollAndParse();