Перейти к содержимому


Фотография

Парсер Каналов - номера телефонов из постов (ру).

Форум ZiSMO.biz
телеграм telegram parser парсер парсер телеграм парсер номеров парсер каналов
0
В этой теме нет ответов

OFFLINE Отправлено

i4ekbot
Активный
  • Онлайн:2д 17ч 4м
11

Парсинг номеров телефонов из открытых телеграм каналов.

 

Поделюсь скриптом парсинга номеров телефонов из каналов. Работает без аккаунтов (на прямую через браузер).

Есть ряд каналов, где выкладывают вакансии с номерами телефонов, найти юзера по ним достаточно просто (но это уже другая тема), так вот, чтобы собрать номера телефонов из постов в канале, был написан скрипт. 

 

Настройки достаточно простые, запускаем скрипт, он запрашивает ссылку. Ее нужно ввести в формате Ссылка + какое количество постов нужно спарсить. Например 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 lxml
3. Сохраните скрипт
- Создайте папку для проекта (например, `C:\TelegramParser`).
- Сохраните файл как `parser.py` в эту папку:
  - Откройте файл в блокноте → Файл → Сохранить как → выберите папку, укажите имя `parser.py`, кодировку UTF-8.
 
4. Запустите скрипт
В командной строке:
cd C:\TelegramParser
python parser.py
- Введите URL Telegram-канала (например: `Ссылка
- Укажите количество постов для обработки.
 
5. Результат
- Номера телефонов сохранятся в файле `channelname_YYYYMMDD.txt`.
- Проверьте файл в папке скрипта.

 

На скринах видно более понятно о каком парсинге идет речь:

 

1.jpg

 

Кому пригодилось, не забываем ставить лайк) спасибо.


Сообщение отредактировал i4ekbot: 21 04 2025 - 09:55

Администрация форума не имеет отношения к пользователям форума и к публикуемой ими информации. Пользовательское соглашение
    • 0
  • Наверх
  • Ответить



Напишите сообщение


  

Самое интересное

 



1