mirror of
https://gitverse.ru/kpa39l/chronicle.nixg.ru.git
synced 2026-09-29 18:05:07 +00:00
Telegram Archiver
Микросервис для архивирования Telegram-каналов в локальную файловую систему с генерацией Markdown для Hugo.
Возможности
- ✅ Скачивание всех постов канала (без ограничений)
- ✅ Сохранение текста в Markdown с front-matter для Hugo
- ✅ Скачивание медиа: фото, видео, документы, аудио
- ✅ Ограничение на размер файла (настраивается, по умолчанию 200 MB)
- ✅ Отчёт о слишком больших файлах в
2big2get.md - ✅ Дедупликация по ID сообщения
- ✅ Обработка репостов и ответов (reply-to)
- ✅ REST API + CLI интерфейс
- ✅ Логирование в файл и консоль
Структура выходных данных
<channel_name>/
├── 12345/
│ ├── index.md # Контент поста + front-matter
│ ├── photo.jpg # Медиафайлы
│ └── document.pdf
├── 12346/
│ └── index.md # Только текст
└── 2big2get.md # Отчёт о больших файлах
Установка
1. Клонирование и зависимости
cd telegram-archiver
pip install -r requirements.txt
2. Получение Telegram API ключей
- Перейди на https://my.telegram.org/apps
- Войди по номеру телефона
- Создай новое приложение (любое название)
- Скопируй
API_IDиAPI_HASH
3. Настройка .env
cp .env.example .env
Отредактируй .env:
API_ID=12345678
API_HASH=abcdef1234567890
PHONE=+79991234567
MAX_FILE_SIZE=209715200
OUTPUT_DIR=./archives
LOG_LEVEL=INFO
Использование
CLI (Command Line Interface)
Скачать весь канал:
python -m app.main --channel dedinit
С опциями:
python -m app.main \
--channel dedinit \
--output ./my-archives \
--limit 100 \
--from-message-id 5000 \
--force
Опции CLI:
| Опция | Кратко | Описание |
|---|---|---|
--channel |
-c |
Username канала (с @ или без) |
--output-dir |
-o |
Папка для архива |
--limit |
-l |
Лимит постов (для теста) |
--from-message-id |
-f |
Начать с этого ID |
--force |
Перескачать существующие | |
--env-file |
Путь к .env файлу |
REST API
Запуск сервера:
uvicorn app.main:app --host 0.0.0.0 --port 8000
Endpoints:
GET /health - Проверка здоровья
curl http://localhost:8000/health
POST /archive - Запуск архивации
curl -X POST http://localhost:8000/archive \
-H "Content-Type: application/json" \
-d '{
"channel": "dedinit",
"limit": 100
}'
GET /docs - Swagger UI документация
Открой в браузере: http://localhost:8000/docs
Front-matter формат
Каждый index.md содержит YAML front-matter:
---
message_id: 12345
date: 2024-02-19T14:30:00
author: "Channel Name"
reply_to: "../12340/index.md"
repost_from: 12300
repost_channel: "Other Channel"
media_files:
- filename: photo.jpg
type: photo
caption: "Описание"
size: 102400
is_too_large: false
---
Текст сообщения в Markdown
Обработка больших файлов
Файлы > MAX_FILE_SIZE (по умолчанию 200 MB) не скачиваются. Вместо этого:
- В
index.mdдобавляетсяis_too_large: true - В корне канала создаётся
2big2get.mdсо списком всех больших файлов:# Files Too Large to Download | Message ID | Filename | Size (bytes) | |------------|----------|-------------| | 12345 | video.mp4 | 524288000 |
Логирование
Логи пишутся:
- В консоль (stdout)
- В файл:
YYYYMMDD-channel.log
Пример: 20260219-dedinit.log
Docker (опционально)
Создай Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
Запуск:
docker build -t telegram-archiver .
docker run -v $(pwd)/.env:/app/.env -v $(pwd)/archives:/app/archives telegram-archiver
Интеграция с Hugo
После архивации:
- Скопируй содержимое канала в
content/posts/Hugo - Front-matter совместим с Hugo (date, author, tags)
- Медиафайлы будут доступны по относительным ссылкам
Разработчикам
Структура проекта:
telegram-archiver/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI + CLI entry point
│ ├── telethon_client.py # Telethon wrapper
│ ├── archiver.py # Core logic
│ ├── models.py # Pydantic models
│ └── logger.py # Logging setup
├── config.py # Settings management
├── requirements.txt
├── .env.example
└── README.md
Запуск тестов:
pytest
Лицензия
MIT