This commit is contained in:
2025-05-23 13:05:20 +08:00
parent fe21d04b1e
commit 7a87db16db
3 changed files with 97 additions and 15 deletions

8
.env_orig Normal file
View File

@@ -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=

View File

@@ -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 | Для внутреннего использования

32
main.py
View File

@@ -16,7 +16,10 @@ from telethon.tl.types import Channel, ChatForbidden, PeerChannel
from telethon.errors import ChannelPrivateError # Добавлен импорт from telethon.errors import ChannelPrivateError # Добавлен импорт
import logging import logging
from tqdm import tqdm from tqdm import tqdm
import getpass # Для безопасного ввода пароля import getpass
from dotenv import load_dotenv
load_dotenv()
# Настройка логирования # Настройка логирования
logging.basicConfig( logging.basicConfig(
@@ -29,27 +32,26 @@ logging.basicConfig(
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Конфигурация # Конфигурация из .env файла
API_ID = '1******1' API_ID = os.getenv('API_ID')
API_HASH = 'd******************************a' API_HASH = os.getenv('API_HASH')
PHONE_NUMBER = '+7999*******' PHONE_NUMBER = os.getenv('PHONE_NUMBER')
# CHANNEL_IDENTIFIER теперь используется как значение по умолчанию при выборе диалога # CHANNEL_IDENTIFIER теперь используется как значение по умолчанию при выборе диалога
CONFIG_CHANNEL_IDENTIFIER = '-**********' CONFIG_CHANNEL_IDENTIFIER = os.getenv('CONFIG_CHANNEL_IDENTIFIER')
CSV_FILENAME = 'telegram_data.csv' CSV_FILENAME = os.getenv('CSV_FILENAME', 'telegram_data.csv')
# Дополнительные настройки # Дополнительные настройки
LIMIT_MESSAGES = None # None для всех сообщений, или число для ограничения LIMIT_MESSAGES_STR = os.getenv('LIMIT_MESSAGES')
DAYS_LIMIT = None # None для всех сообщений, или число дней назад для ограничения 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: async def parse_message(text: str) -> dict | None:
""" """ Парсит текстовое сообщение с использованием регулярных выражений.
Парсит текстовое сообщение с использованием регулярных выражений.
Args: Args:
text: Текст сообщения. text: Текст сообщения.
Returns: Returns:
Словарь с извлеченными данными, или None, если не удалось найти необходимые поля. Словарь с извлеченными данными, или None, если не удалось найти необходимые поля. """
"""
raw_text_preview = text[:250] + ('...' if len(text) > 250 else '') # Немного увеличил превью raw_text_preview = text[:250] + ('...' if len(text) > 250 else '') # Немного увеличил превью
result = {'Raw Message': raw_text_preview} result = {'Raw Message': raw_text_preview}