diff --git a/.env_orig b/.env_orig new file mode 100644 index 0000000..91fa3e7 --- /dev/null +++ b/.env_orig @@ -0,0 +1,8 @@ +API_ID=1******1 +API_HASH=d******************************a +PHONE_NUMBER=+7999******* +CONFIG_CHANNEL_IDENTIFIER=-********** +CSV_FILENAME=telegram_data.csv +# Дополнительные настройки +LIMIT_MESSAGES= +DAYS_LIMIT= \ No newline at end of file diff --git a/README.md b/README.md index e69de29..341fead 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,72 @@ +# Документация к Telegram парсеру + +## 📋 Описание +Парсер для сбора данных из Telegram чатов/каналов с сохранением в CSV. Основной функционал: +- Авторизация через Telegram API +- Парсинг сообщений с различными форматами данных +- Фильтрация по дате +- Интерактивный выбор чата +- Логирование операций + +## 🛠 Установка +```bash +# Клонировать репозиторий +cd e:\parcer_telegram_meessges + +# Установить зависимости +pip install -r req.pip +``` + +## ⚙ Конфигурация +Отредактируйте настройки в `main.py`: +```python +API_ID = 'ваш_api_id' # Получить на my.telegram.org +API_HASH = 'ваш_api_hash' +PHONE_NUMBER = '+номер_телефона' +CSV_FILENAME = 'data/output.csv' # Путь для сохранения +``` + +## 🚀 Использование +```bash +python main.py +``` + +## 🗃 Структура данных +Парсер извлекает следующие поля: +| Поле | Описание | +|------|-----------| +| Name | ФИО пользователя | +| Phone | Номер телефона | +| Email | Электронная почта | +| Date | Дата события/рождения | +| Transaction ID | ID транзакции | +| URL | Ссылка на форму | + +## 🔍 Пример сообщения +``` +Request details: +Name: Иванов Иван +Phone: +79991234567 +... +``` + +## 📊 Логирование +Логи сохраняются в `telegram_parser.log` с детализацией: +- Время выполнения +- Статус операций +- Ошибки + +## ⚠ Типовые проблемы +```bash +# Если требуется двухфакторная аутентификация +Введите пароль из Telegram при запросе + +# Ошибка доступа к каналу +Убедитесь что: +1. Бот добавлен в группу +2. Используется корректный ID чата +``` + +## 📄 Лицензия +MIT License | Для внутреннего использования + \ No newline at end of file diff --git a/main.py b/main.py index 9079033..9fc2f87 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,10 @@ from telethon.tl.types import Channel, ChatForbidden, PeerChannel from telethon.errors import ChannelPrivateError # Добавлен импорт import logging from tqdm import tqdm -import getpass # Для безопасного ввода пароля +import getpass +from dotenv import load_dotenv + +load_dotenv() # Настройка логирования logging.basicConfig( @@ -29,27 +32,26 @@ logging.basicConfig( ) logger = logging.getLogger(__name__) -# Конфигурация -API_ID = '1******1' -API_HASH = 'd******************************a' -PHONE_NUMBER = '+7999*******' +# Конфигурация из .env файла +API_ID = os.getenv('API_ID') +API_HASH = os.getenv('API_HASH') +PHONE_NUMBER = os.getenv('PHONE_NUMBER') # CHANNEL_IDENTIFIER теперь используется как значение по умолчанию при выборе диалога -CONFIG_CHANNEL_IDENTIFIER = '-**********' -CSV_FILENAME = 'telegram_data.csv' +CONFIG_CHANNEL_IDENTIFIER = os.getenv('CONFIG_CHANNEL_IDENTIFIER') +CSV_FILENAME = os.getenv('CSV_FILENAME', 'telegram_data.csv') # Дополнительные настройки -LIMIT_MESSAGES = None # None для всех сообщений, или число для ограничения -DAYS_LIMIT = None # None для всех сообщений, или число дней назад для ограничения +LIMIT_MESSAGES_STR = os.getenv('LIMIT_MESSAGES') +LIMIT_MESSAGES = int(LIMIT_MESSAGES_STR) if LIMIT_MESSAGES_STR and LIMIT_MESSAGES_STR.strip() else None +DAYS_LIMIT_STR = os.getenv('DAYS_LIMIT') # None для всех сообщений, или число для ограничения +DAYS_LIMIT = int(DAYS_LIMIT_STR) if DAYS_LIMIT_STR and DAYS_LIMIT_STR.strip() else None # None для всех сообщений, или число дней назад для ограничения + async def parse_message(text: str) -> dict | None: - """ - Парсит текстовое сообщение с использованием регулярных выражений. - + """ Парсит текстовое сообщение с использованием регулярных выражений. Args: text: Текст сообщения. - Returns: - Словарь с извлеченными данными, или None, если не удалось найти необходимые поля. - """ + Словарь с извлеченными данными, или None, если не удалось найти необходимые поля. """ raw_text_preview = text[:250] + ('...' if len(text) > 250 else '') # Немного увеличил превью result = {'Raw Message': raw_text_preview}