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();
|