Парсинг номеров телефонов из открытых телеграм каналов.
Поделюсь скриптом парсинга номеров телефонов из каналов. Работает без аккаунтов (на прямую через браузер).
Есть ряд каналов, где выкладывают вакансии с номерами телефонов, найти юзера по ним достаточно просто (но это уже другая тема), так вот, чтобы собрать номера телефонов из постов в канале, был написан скрипт.
Настройки достаточно простые, запускаем скрипт, он запрашивает ссылку. Ее нужно ввести в формате Ссылка + какое количество постов нужно спарсить. Например 300. Дальше, скрипт сам собирает все номера, фильтрует на уникальность и сохраняет в папке, в виде: +7ХХХНННYYAA - для удобства дальнейшего использования и чеккинга, в столбик.
Парсер работает только с публичными каналами, которые отображаются в браузере.
Подстановка S в ссылке обязательна, по другому он не найдет канал.
Вирус тотал ссылка: virustotal
Скрипт:
#!/usr/bin/env python3 import re import sys import time import argparse from datetime import datetime import requests from bs4 import BeautifulSoup # Обновленное регулярное выражение с поддержкой ± [[3]] PHONE_PATTERN = re.compile(r''' [\+\±]? # Опциональный символ + или ± (?:7 8 \+7 \±7) # Начало номера: 7/8/+7/±7 [\s\-\(\)\.]? # Разделители (включая точку) (\d{3}) # код оператора [\s\-\)\(\.]? # Разделители (\d{3}) # Первые 3 цифры [\s\-\.,]? # Разделители (\d{2,3}) # Следующие 2-3 цифры [\s\-\.,]? # Разделители (\d{2}) # Последние 2 цифры ''', re.VERBOSE re.IGNORECASE) def normalize_phone(number): """Приводит номер к формату +7XXXXXXXXXX""" digits = re.sub(r'[^0-9]', '', number) plus = '+' if re.search(r'[\+\±]', number) else '' if len(digits) == 11 and digits[0] in ('7', '8'): return f"+7{digits[1:]}" elif len(digits) == 10: return f"+7{digits}" return None def parse_telegram_channel(url, max_posts): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' } response = requests.get(url, headers=headers, timeout=20) response.encoding = 'utf-8' if response.status_code != 200: print(f"Ошибка доступа: код {response.status_code} [[2]]") return [], 0 except requests.exceptions.RequestException as e: print(f"Ошибка подключения: {str(e)} [[2]]") return [], 0 soup = BeautifulSoup(response.text, 'lxml') messages = soup.select('div.tgme_widget_message')[:max_posts] if not messages: print("Посты не найдены. Проверьте доступность канала [[4]]") return [], 0 phone_numbers = set() processed = 0 for msg in messages: processed += 1 text = ' '.join(msg.stripped_strings).lower() # Поиск всех возможных номеров [[3]] for match in PHONE_PATTERN.findall(text): raw_number = ''.join(match) normalized = normalize_phone(raw_number) if normalized: phone_numbers.add(normalized) return phone_numbers, len(messages) def main(): parser = argparse.ArgumentParser() parser.add_argument('url', nargs='?', help="URL Telegram канала") parser.add_argument('posts', nargs='?', type=int, help="Количество постов") args = parser.parse_args() # Ввод параметров при запуске без аргументов [[6]] if not args.url: args.url = input("Введите URL канала (https://t.me/s/...): ").strip() if not args.posts: args.posts = int(input("Количество постов: ").strip()) if not args.url.startswith('https://t.me/s/'): print("Неверный формат URL. Пример: https://t.me/s/channelname [[4]]") sys.exit(1) channel_name = args.url.split('/')[-1] print(f"Начинаю обработку {channel_name}... [[6]]") try: numbers, processed_posts = parse_telegram_channel(args.url, args.posts) except Exception as e: print(f"Критическая ошибка: {str(e)} [[2]]") sys.exit(1) # Сохранение результатов [[4]] timestamp = datetime.now().strftime("%Y%m%d") filename = f"{channel_name}_{timestamp}.txt" try: with open(filename, 'w', encoding='utf-8') as f: f.write('\n'.join(sorted(numbers))) except Exception as e: print(f"Ошибка записи файла: {str(e)} [[2]]") sys.exit(1) print("\n[[5]] Результаты:") print(f"Обработано постов: {processed_posts}") print(f"Уникальных номеров: {len(numbers)}") print(f"Сохранено в: {filename}") print(f"Время выполнения: {time.time() - start_time:.2f} сек") input("\nНажмите Enter для выхода...") if __name__ == "__main__": start_time = time.time() main()
Установка и настройка:
Чтобы запустить скрипт на Windows, выполните следующие шаги:
1. Установите PythonСкачайте и установите последнюю версию Python с [официального сайта](Ссылка).- Во время установки поставьте галочку **«Add Python to PATH»**.2. Установите необходимые библиотекиОткройте командную строку (Win + R → `cmd` → Enter) и выполните:pip install requests beautifulsoup4 lxml3. Сохраните скрипт- Создайте папку для проекта (например, `C:\TelegramParser`).- Сохраните файл как `parser.py` в эту папку:- Откройте файл в блокноте → Файл → Сохранить как → выберите папку, укажите имя `parser.py`, кодировку UTF-8.4. Запустите скриптВ командной строке:cd C:\TelegramParser python parser.py- Введите URL Telegram-канала (например: `Ссылка- Укажите количество постов для обработки.5. Результат- Номера телефонов сохранятся в файле `channelname_YYYYMMDD.txt`.- Проверьте файл в папке скрипта.
На скринах видно более понятно о каком парсинге идет речь:
Кому пригодилось, не забываем ставить лайк) спасибо.