Skip to main content

tg-export

CI codecov PyPI version

Экспорт данных из Telegram на локальный диск с гибкой настройкой.

Содержание

Возможности

  • Инкрементальный экспорт -- при повторном запуске скачиваются только новые сообщения и файлы, состояние хранится в SQLite
  • Sibling-дедупликация -- при экспорте нескольких аккаунтов (семья, рабочий/личный) общие файлы не скачиваются повторно, а линкуются через hardlink
  • Импорт из tdesktop -- файлы из стандартного экспорта Telegram Desktop копируются вместо повторного скачивания
  • Takeout API -- использует официальный Takeout для обхода rate-limiting
  • Гибкие правила экспорта -- настройка по чатам, папкам, типам (personal, groups, channels, bots), с фильтрами по датам, типам медиа и размеру файлов
  • Логика архивных чатов -- чат считается архивным (is_archived) только если он присутствует исключительно в архиве Telegram. Если чат есть в основном списке диалогов или в именованной папке, он не помечается как архивный, даже если одновременно находится в архиве
  • Проверка размера в runtime -- если реальный размер файла превышает лимит, скачивание прерывается и частичный файл удаляется
  • HTML-рендеринг по месяцам -- каждый месяц в отдельном файле, с оглавлением (TOC) и навигацией prev/next
  • Progress bars -- основной прогресс по сообщениям + sub-progress bars для каждого скачиваемого файла
  • Контроль свободного места -- экспорт останавливается, если свободное место на диске падает ниже порога (min_free_space в config.yaml, по умолчанию 20 GB)
  • Корректный shutdown -- Ctrl+C сохраняет состояние, двойной Ctrl+C -- force shutdown с cleanup
  • Поддержка прокси -- SOCKS5, SOCKS4, HTTP прокси для подключения к Telegram API
  • Данные в SQLite -- все сообщения и метаданные хранятся в SQLite, что позволяет пересоздать HTML без обращения к Telegram API, строить поисковые индексы, подключить веб-интерфейс или использовать данные в любых других целях
  • CLI для анализа -- команда tg info для batch-запросов информации о чатах через API
  • Очистка данных чата -- команда purge для удаления данных конкретного чата из БД и с диска

Сценарии использования

Личный архив -- экспорт всех личных переписок и групп с медиафайлами на локальный диск для долгосрочного хранения.

Семейный экспорт -- экспорт аккаунтов нескольких членов семьи. Общие группы и каналы содержат одинаковые файлы -- sibling-дедупликация экономит место на диске через hardlink.

Выборочный экспорт -- экспорт только нужных чатов/папок с правилами: рабочие чаты экспортируются, боты и публичные каналы пропускаются, для флудилок скачиваются только фото.

Миграция с tdesktop -- если уже есть экспорт из Telegram Desktop, файлы из него импортируются без повторного скачивания.

Установка

Из PyPI:

pip install tg-export

Для работы через прокси:

pip install tg-export[proxy]

Из исходников (для конечного использования):

uv pip install -e .

Для разработки используйте uv sync --extra dev (синхронизация по uv.lock с dev-зависимостями) -- см. раздел Разработка.

Быстрый старт

1. Получить API credentials

Зайти на my.telegram.org, создать приложение, получить api_id и api_hash.

uv run tg-export auth credentials

Ввести api_id и api_hash. Они сохраняются в ~/.config/tg-export/api_credentials.yaml и используются для всех аккаунтов.

2. Настроить прокси (если нужен)

Создать файл ~/.config/tg-export/config.yaml:

proxy:
  type: socks5      # socks5, socks4, http
  host: 127.0.0.1
  port: 1080
  # username: user   # опционально
  # password: pass   # опционально

3. Залогиниться в Telegram

uv run tg-export auth add --name myaccount

Ввести номер телефона и код подтверждения. Сессия сохранится в ~/.config/tg-export/sessions/myaccount.session.

Для нескольких аккаунтов повторить с разными именами. Установить аккаунт по умолчанию:

uv run tg-export account default myaccount

4. Анализ чатов и каталог

Получить каталог всех чатов аккаунта:

uv run tg-export list --output catalog.yaml
uv run tg-export list --format json --output catalog.json

Посмотреть информацию о конкретных чатах (количество сообщений, последние сообщения):

uv run tg-export tg info 123456789 987654321
uv run tg-export tg info --from-catalog catalog.json --type personal --last 3

Посмотреть последние сообщения чата. Текст по умолчанию обрезается до 200 символов; --truncate N задаёт другую длину, --truncate 0 и --no-truncate печатают текст целиком:

uv run tg-export tg messages 123456789 -n 5
uv run tg-export tg messages 123456789 -n 5 --truncate 1000
uv run tg-export tg messages 123456789 -n 5 --no-truncate

5. Настройка правил экспорта

Сгенерировать шаблон конфига:

uv run tg-export init

Конфиг создается в ~/.config/tg-export/myaccount.yaml. Настроить правила: какие чаты экспортировать, какие пропускать, какие типы медиа скачивать.

AI-агенты (Claude Code, Cursor и т.д.) могут помочь с настройкой: показать список чатов по категориям, задать вопросы о каждом и сформировать конфиг интерактивно.

Пример конфига:

output:
  path: ./export_output/myaccount

defaults:
  media:
    types: [all]
    max_file_size: 100MB
    concurrent_downloads: 3

# Импорт файлов из существующего экспорта tdesktop
import_existing:
  - path: ~/Downloads/Telegram Desktop/DataExport
    type: tdesktop

# Правила по типам чатов
type_rules:
  bots:
    skip: true
  public:
    skip: true
  personal: {}    # экспортировать все личные чаты
  self: {}        # экспортировать Saved Messages

# Правила по папкам Telegram
folders:
  Work: {}
  Family:
    media:
      types: [photo, video]

# Правила по конкретным чатам
chats:
  - id: 777000
    name: Telegram
    action: skip
  - id: 123456789
    name: "Important Chat"
    media:
      types: []    # без медиа

# Что делать с чатами, не попавшими ни в одно правило
unmatched:
  action: skip    # skip | export_with_defaults | ask

6. Запустить экспорт

uv run tg-export run

Для пробного запуска без скачивания:

uv run tg-export run --dry-run

При повторном запуске скачиваются только новые сообщения (инкрементальный экспорт).

7. Sibling-дедупликация

При экспорте нескольких аккаунтов в один каталог (./export_output/), tg-export автоматически находит соседние базы данных и использует уже скачанные файлы через hardlink:

export_output/
  account1/         # первый аккаунт
  account2/         # файлы из общих чатов линкуются из account1

Структура конфигов

~/.config/tg-export/
  api_credentials.yaml      # API ID и Hash (общие для всех аккаунтов)
  config.yaml               # Глобальные настройки (proxy, min_free_space)
  default_account            # Имя аккаунта по умолчанию
  sessions/
    myaccount.session        # Telethon-сессия
  myaccount.yaml             # Конфиг экспорта для аккаунта

export_output/
  myaccount/
    .tg-export-state.db      # SQLite: состояние экспорта, сообщения, файлы
    unfiled/
      Chat_Name_123456/
        messages.html         # Redirect на первый месяц
        messages_2024-01.html # Сообщения за январь 2024
        messages_2024-02.html # Сообщения за февраль 2024
        photos/               # Скачанные фото
        videos/               # Скачанные видео
        files/                # Скачанные документы
    folders/
      Work/
        ...

Глобальные опции

Опции указываются до подкоманды (uv run tg-export <опция> <команда>):

Опция Назначение
--debug Включить отладочное логирование (принудительно уровень DEBUG).
--log-level LEVEL Уровень логирования: DEBUG/INFO/WARNING/ERROR/CRITICAL. Переопределяет LOG_LEVEL.
--quiet, -q Подавить прогресс и статусные строки; ошибки и итоговая сводка остаются.

Приоритет уровня логирования (по убыванию): --debug > --log-level > переменная окружения LOG_LEVEL > значение по умолчанию WARNING.

Потоки вывода: машиночитаемый вывод команд list, state show, tg info, tg messages идёт в stdout; прогресс, статусы, диагностика и ошибки — в stderr. Это позволяет безопасно использовать пайпинг, например uv run tg-export list --format json | jq ....

Флаг --json для машиночитаемого вывода поддерживают команды account list, auth check и state show. В этом режиме в stdout печатается только JSON.

Коды выхода: 0 — успех; 2 — ошибка разбора аргументов; прерывание команды run сигналом завершает процесс с кодом 130 (SIGINT, Ctrl+C) или 143 (SIGTERM).

Документация

  • docs/configuration.md -- подробное описание YAML-конфигурации экспорта (правила, фильтры, типы медиа, настройки выгрузки).
  • CHANGELOG.md -- список изменений между версиями.
  • CONTRIBUTING.md -- руководство для контрибьюторов: установка dev-окружения, запуск тестов, формат коммитов.
  • docs/adr/ -- архитектурные решения (ADR) в формате MADR.
  • RELEASING.md -- процесс выпуска версий и конвенции тегов.

Автодополнение командной строки

tg-export использует Click, который поддерживает автодополнение для bash/zsh/fish. Включить его можно через переменную окружения (добавьте строку в ~/.bashrc, ~/.zshrc или конфиг fish):

# bash
eval "$(_TG_EXPORT_COMPLETE=bash_source tg-export)"
# zsh
eval "$(_TG_EXPORT_COMPLETE=zsh_source tg-export)"
# fish
_TG_EXPORT_COMPLETE=fish_source tg-export | source

Тесты

uv run python -m pytest tests/ -v

Разработка

Установка dev-зависимостей:

uv sync --extra dev

Запуск тестов:

uv run python -m pytest

Подробнее -- в CONTRIBUTING.md.

Лицензия

MIT License

Metadata

Release files for tg-export 1.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tg-export 1.5.1
File Size Uploaded
tg_export-1.5.1.tar.gz 106.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tg-export 1.5.1
File Interpreter ABI Platform
tg_export-1.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 193.5 kB

Release files / tg_export-1.5.1.tar.gz

Download URL tg_export-1.5.1.tar.gz
Size 106.6 kB
Tags Source
SHA-256 checksum
How to use checksums
615f0f65eb24f45570db43c9ee2be6f2b607c21ccb4746294de020503d8848f1
BLAKE2b-256 checksum
How to use checksums
5af815134bbb316c4350f28ad89732a1558785553c615d2f7cbb99d2c5977f09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 30, 2026.

Transparency log

Release files / tg_export-1.5.1-py3-none-any.whl

Download URL tg_export-1.5.1-py3-none-any.whl
Size 86.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
538fa4b5e7afca608f99e5fffef96aade9decb9e660fe3c0ed1b4d5ad610567b
BLAKE2b-256 checksum
How to use checksums
b4da90eb93e899aba50f04194bf29232075baca8b9f9f9f06c2aabda1c8e985b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 30, 2026.

Transparency log

Release history Release notifications | RSS feed

2.1.1

2 release files

2.1.0

2 release files

2.0.0

2 release files

This release

1.5.1 This release

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page