Files
chronicle.nixg.ru/telegram-archiver/FAQ.md
T

8.1 KiB
Raw Blame History

Telegram Archiver — Ответы на вопросы

📊 Итоги полного тестирования (март 2026)

Канал: dedinit
Постов заархивировано: 992
Время выполнения: 7335 секунд (≈ 2 часа 2 минуты)
Медиафайлов скачано: 454
Таймаутов: ~50 файлов (пропущены, процесс не застрял)


❓ Вопросы и ответы

1. Размер файлов: когда считается?

Ответ: Размер должен браться из Telegram ДО скачивания через атрибут doc.size.

Проблема: В текущей версии size: 0 во front-matter — это баг.

Решение (задача 0.15):

# Брать из атрибутов Telegram
size = doc.size

# ИЛИ проверять после записи
size = Path(filepath).stat().st_size

2. Можно ли получить прямые ссылки на файлы для дозагрузки?

Ответ: Да, но с ограничениями.

Telethon может получить прямую ссылку через message.media.document.id, но:

  • Ссылка временная (действует несколько часов)
  • Требует активной сессии Telegram
  • Нельзя просто сохранить URL и скачать позже

Решение (задача 0.14, 0.19):

  1. Сохранять message_id и media_id во front-matter
  2. Для дозагрузки:
    • Переподключаться к Telegram
    • Запрашивать файл по ID через API
    • Скачивать заново

Пример front-matter:

media_files:
  - filename: photo.jpg
    type: photo
    message_id: 12345
    media_id: "AgADAgAD..."
    download_url: "https://t.me/dedinit/12345/file"  # временная!

3. Hugo и формат тегов

Вопрос: Поймёт ли Hugo такой формат?

tags:
- 1с
- debian
- postgres

Ответ: Да, Hugo понимает оба формата:

# YAML list (сейчас)
tags:
- linux
- debian

# Inline JSON-style (компактнее)
tags: ["linux", "debian", "postgres"]

Рекомендация: Оба работают одинаково. Задача 0.22 — опционально изменить на inline для компактности.


4. Многопоточное скачивание (задача 0.17)

Вопрос: Можно ли скачивать в несколько потоков?

Ответ: Да, это возможно и ускорит процесс в 2-3 раза.

Техническая реализация:

import asyncio

# Параллельная загрузка 3 файлов
await asyncio.gather(
    download_file_1(),
    download_file_2(),
    download_file_3(),
)

Ограничения:

  • Telegram блокирует при >5 одновременных загрузок
  • Рекомендовано: 3 параллельных потока
  • Нужно соблюдать rate limits (паузы между запросами)

План (задача 0.19):

  1. Первый проход: собрать все URL файлов в очередь
  2. Второй проход: загружать параллельно (3 потока)
  3. Resume: продолжать с места обрыва

Ожидаемое ускорение:

  • Сейчас: ~1000 постов за 2 часа (500 постов/час)
  • С многопоточностью: ~1000-1500 постов/час

5. Resume прерванной архивации (задача 0.21)

Вопрос: Есть ли средство возобновить прерванный процесс?

Ответ: Частично работает уже сейчас.

Текущее состояние:

  • ✅ Дедупликация по ID существует
  • ✅ Повторный запуск пропускает скачанные посты
  • ❌ Нет сохранения последнего обработанного ID
  • ❌ Нет команды --resume

План (задача 0.21):

  1. Сохранять last_message_id в лог или файл состояния
  2. Добавить флаг --resume для продолжения
  3. При старте проверять последний ID и начинать с него

Пример:

# Первый запуск
python run_archiver.py -c dedinit
# Прерван на посте 624

# Возобновление
python run_archiver.py -c dedinit --resume
# Продолжит с поста 624

6. Голосовые сообщения и аудио (задача 0.20, 0.24)

Вопрос: Как обрабатывать голосовые сообщения?

Текущее состояние:

  • Голосовухи скачиваются как .bin или .ogg
  • Нет метаданных (длительность, формат)
  • Нет красивого отображения в Hugo

План:

  1. Определять формат по MIME:
    • audio/ogg → .ogg
    • audio/mp3 → .mp3
  2. Извлекать длительность: doc.attributes.duration
  3. Сохранять во front-matter:
    media_files:
      - filename: voice.ogg
        type: audio
        duration: 45  # секунд
        size: 127359
    
  4. Для Hugo: использовать shortcode с wavesurfer.js
    {{< audio-player src="voice.ogg" waveform="true" >}}
    

7. Видео-кружки (задача 0.11)

Вопрос: Как обрабатывать video_note (кружочки)?

Проблема: Сохраняются как .bin без расширения.

Решение:

  1. Определять по MIME: video/mp4 → .mp4
  2. Переименовывать после скачивания
  3. Опционально: конвертировать в нормальное видео (убрать круг)

8. Временная зона (задача 0.13)

Проблема: date: '2026-01-18T08:11:24+00:00' — UTC вместо Москвы.

Пост был в 11:11 по Москве, указано 08:11 UTC.

Решение:

from zoneinfo import ZoneInfo

# Конвертировать в московское время
moscow_tz = ZoneInfo('Europe/Moscow')
date_moscow = date.astimezone(moscow_tz)

# Результат: 2026-01-18T11:11:24+03:00

9. Прямые ссылки на посты (задача 0.9, 0.16)

Вопрос: Где ссылки на оригинальные посты?

Текущее состояние:

  • Сохраняется repost_from (ID) и repost_channel (название)
  • Нет прямой ссылки https://t.me/...

План:

# Для всех постов
channel_url: "https://t.me/dedinit"
post_url: "https://t.me/dedinit/1234"

# Для репостов
original_post_url: "https://t.me/otherchannel/987"

📈 Метрики производительности

Параметр Значение
Скорость архивации ~500 постов/час
Время на 1 пост ~7.4 секунды
Время на 1 медиафайл ~15-30 секунд (с таймаутами)
Процент таймаутов ~5% (50 из 992)
Успешных загрузок 95%

🎯 Следующие шаги

  1. Исправить критичные баги (0.10, 0.15)
  2. Добавить resume (0.21)
  3. Добавить отчёт о таймаутах (0.12)
  4. Исправить временную зону (0.13)
  5. Многопоточность (0.17, 0.19)

Документ создан: 6 марта 2026 г.
Версия: 1.0