Локальная Telegram export/data CLI-утилита на базе Telethon.
Project description
TG_MSG_MNGR: Local Telegram Export/Data CLI
🇷🇺 Русская версия | 🇬🇧 English Version
🇷🇺 Русский
TG_MSG_MNGR — это локальная CLI-утилита и data pipeline для Telegram exports, SQLite-backed sync, очистки собственных сообщений, channel datasets и read-only validation.
Проект не является SaaS-мониторингом, analytics/OSINT-платформой, системой профилирования или GUI dashboard.
Quick Reference
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --depth 3 --json
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flat
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --txt-profile legacy
python3 -m tg_msg_manager.cli db-export --user-id 123456789
python3 -m tg_msg_manager.cli export-pm --user-id 123456789
python3 -m tg_msg_manager.cli db-export --user-id 123456789 --json
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 100 --media metadata
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 10 --media metadata --discussion full --max-comments-per-post 100
python3 -m tg_msg_manager.cli validate-dataset --path exports/channels/example
python3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example
python3 -m tg_msg_manager.cli target names 123456789
python3 -m tg_msg_manager.cli update
python3 -m tg_msg_manager.cli retry --list
python3 -m tg_msg_manager.cli report
Документация
- Быстрый путь первого запуска:
docs/user/QUICKSTART.md - Примеры dataset doctor output:
docs/user/DATASET_DOCTOR_EXAMPLES.md - Полная карта документации:
docs/README.md - Справочник команд:
COMMANDS.md - Privacy / sensitive artifacts:
docs/development/PRIVACY_AND_SENSITIVE_ARTIFACTS.md - Operational risks / local limits:
docs/development/OPERATIONAL_RISKS_AND_LIMITS.md - Package identity / version policy:
docs/development/PACKAGE_IDENTITY_AND_VERSION_POLICY.md - Правила для coding agents:
AGENTS.md
🚀 Быстрый старт
Рекомендуется: установка из PyPI
macOS / Linux:
python3 -m pip install tg-msg-manager
tg-msg-manager
Windows PowerShell:
py -m pip install tg-msg-manager
tg-msg-manager
Установка последней версии из репозитория
git clone https://github.com/JohnyNoxwell/tg-msg-manager.git
cd tg-msg-manager
python3 -m pip install .
tg-msg-manager
В Windows замените python3 на py.
Установка для разработки
git clone https://github.com/JohnyNoxwell/tg-msg-manager.git
cd tg-msg-manager
python3 -m pip install -e ".[dev]"
Обновление PyPI-версии
python3 -m pip install --upgrade tg-msg-manager
В Windows замените python3 на py.
После установки доступен console script tg-msg-manager. Перед полноценным
запуском создайте config.json вручную по примеру
config.example.json. Пошаговая настройка:
docs/user/QUICKSTART.md.
Рабочая директория создаётся автоматически:
- macOS / Linux:
~/TG_MSG_MANAGER - Windows:
%USERPROFILE%\TG_MSG_MANAGER
Запустите интерактивное меню командой tg-msg-manager. Используйте двузначные
коды меню: 01-10 для основных функций, 11 для retry, 12 для
report, 98 — переключение языка, 00 — выход, ESC — возврат назад.
🌟 Основные функции
Основные возможности проекта:
- 🧹 Глобальная очистка (
clean) — Удаляет только ваши сообщения из всех выбранных чатов. Поддерживает фильтры и безопасный режим (Dry Run). - 📥 Умный экспорт с контекстом (
export) — Собирает сообщения цели вместе с окружающим контекстом беседы, восстанавливая полную картину диалога. - 💬 Архив лички (
export-pm) — Текстовый бэкап приватного чата с подготовленной структурой папок под медиа; отдельный public contract для private archive пока deferred. - 🗄️ SQLite База данных — Все данные хранятся в структурированной базе
messages.db. Это обеспечивает мгновенный поиск и отсутствие дубликатов. - 📤 Экспорт из БД — Выгрузка накопленных данных из SQLite в JSON/Text. JSONL по умолчанию теперь компактный и ориентирован на анализ нейросетью.
- 📡 Прямой экспорт канала (
export-channel) — Файловый dataset export постов Telegram-канала вmanifest.json,messages.jsonl,messages.txt,media_manifest.jsonl,run_changelog.jsonlи, при явном--discussion full, discussion dataset files. - ✅ Dataset validation / inspection —
validate-datasetпроверяет структуру channel dataset,inspect-datasetпоказывает deterministic counts/statuses, аinspect-dataset --doctorдаёт read-only diagnostic findings без Telegram access, repair/migration или analytics. - ♻️ Retry Queue (
retry) — Управление повторными задачами для recoverable sync/archive ошибок без ручного вмешательства в БД. - 📋 Audit Report (
report) — Read-only диагностика локальной БД, retry-очереди, export artifacts и состояния tracked targets без доступа к Telegram.
🛠️ Продвинутое использование (CLI)
Для автоматизации и опытных пользователей доступны прямые команды:
⚠️ Примечание: В source checkout сначала выполните установку выше. После установки используйте
tg-msg-manager ...илиpython3 -m tg_msg_manager.cli ...из активного Python-окружения.
- Экспорт сообщений:
python3 -m tg_msg_manager.cli export --user-id 123456789 --depth 3python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --depth 3 --jsonpython3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flatpython3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --txt-profile legacy--jsonсобирает итоговый JSONL-файл после синка; без--jsonитоговый файл будет TXT. TXT-профиль по умолчанию дляexport—context-readable: он группирует вывод вCONTEXT BLOCKс секциями[REPLIED MESSAGE],[CONTEXT BEFORE],[TARGET MESSAGE]/[TARGET MESSAGES],[CONTEXT AFTER].--txt-profile legacyсохраняет старый плоский log-style TXT. TXT — только projection; JSONL/SQLite остаются canonical data. По умолчанию Deep Mode использует--depth 2, если глубина явно не указана. - Очистка (Боевой режим):
python3 -m tg_msg_manager.cli clean --apply --yes - Обновление всех целей:
python3 -m tg_msg_manager.cli updateПосле прерванного большого экспортаupdateможет некоторое время выглядеть "задумавшимся" до появления построчного прогресса: в этот момент сервис делает shared head prefetch для чата и готовит общий HEAD-срез для нескольких целей. - Архив лички:
python3 -m tg_msg_manager.cli export-pm --user-id 123456789export-pmостается отдельным archive workflow: он не входит в Non-Channel Export Contract V1 дляexport/db-export, а private archive contract пока deferred. - Экспорт из БД:
python3 -m tg_msg_manager.cli db-export --user-id 123456789python3 -m tg_msg_manager.cli db-export --user-id 123456789 --txt-profile legacypython3 -m tg_msg_manager.cli db-export --user-id 123456789 --jsonБез--jsonкоманда пишет TXT; с--json— компактный AI-friendly JSONL. TXT-профиль по умолчанию —context-readable;--txt-profile legacyсохраняет старый плоский формат. - Прямой экспорт канала:
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 100 --media metadatapython3 -m tg_msg_manager.cli export-channel --channel @example --limit 10 --media metadata --discussion full --max-comments-per-post 100Команда создаёт файловый dataset вexports/channels/. Stage 3A/3A.1/3B/3C не делает analytics и не пишет channel posts или discussion comments в SQLite. Поддерживаются только broadcast-каналы; группы и супергруппы не входят вexport-channel. После успешного запуска создаётсяchannel_export_state.json; повторный запуск без--forceэкспортирует только новые посты и дописывает dataset через temp-file copy/append/replace. По умолчанию используется безопасный режим--media metadata. По умолчанию--discussion none: resolver обсуждений не запускается, комментарии не скачиваются и discussion files не создаются.--discussion metadataпишет компактныйdiscussion_metadata.jsonlизraw_payload.repliesи не скачивает комментарии.--discussion full— явный heavy mode: пишетdiscussion_comments.jsonl,discussion_comments.txt,discussion_threads.jsonlиdiscussion_export_state.jsonтолько для постов, полученных в текущем run. Для больших каналов он может создать миллионы records и multi-gigabyte datasets; для broad archives используйтеmetadata. Discussion resolver использует linked discussion metadata канала и fallback из Telegram metadata конкретного поста (raw_payload.replies.channel_id), если channel-level link недоступен. Инкрементальный запуск экспортирует discussion comments только для новых постов; no-new-posts run не перечитывает старые threads и не меняетdiscussion_export_state.json. Если старый dataset уже был создан без discussion comments, перезапустите экспорт с--force --discussion fullили в чистую output directory, чтобы перечитать старые threads. Для discussion comments не выполняется full media download, только metadata/empty media fields. Полная загрузка media требует явного--media full; для неё доступны--max-media-size 50MBпо умолчанию и--media-types photo,video,.... Имена media-файлов и итоговые media-подпапки выбираются из безопасного Telegram original filename, затем MIME type, затем лёгких magic bytes;.binостаётся fallback только для неизвестного типа.media_manifest.jsonlфиксирует итоговый путь media. OCR, speech-to-text, media analysis, transcoding и ffmpeg processing не выполняются. Вfullрежимеmedia_manifest.jsonlфиксирует итоговые статусыdownloaded,already_exists,skipped_by_size,skipped_by_typeиfailed.run_changelog.jsonlполучает одну строку на каждый завершенный запуск с предыдущим/новым cursor, run mode, списком новых message IDs и artifact paths; no-new-posts run пишет строку сnew_message_count: 0. Интерактивный пункт меню10теперь запрашивает discussion mode, max comments per post, force, output directory, max media size и media types; пустой ввод сохраняет defaults прямой CLI-команды. - Проверка / инспекция channel dataset:
python3 -m tg_msg_manager.cli validate-dataset --path exports/channels/examplepython3 -m tg_msg_manager.cli validate-dataset --path exports/channels/example --jsonpython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/examplepython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example --jsonpython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example --doctorКоманды read-only, не требуют Telegram credentials, не чинят и не мигрируют dataset, не выполняют analytics/OCR/STT/media processing. Doctor mode добавляет severity, artifact path и suggested next action для validation findings. - Полное удаление локальных данных:
python3 -m tg_msg_manager.cli delete --user-id 123456789 - Планировщик (macOS):
python3 -m tg_msg_manager.cli schedule - Повтор задач retry-очереди:
python3 -m tg_msg_manager.cli retry --listpython3 -m tg_msg_manager.cli retry --limit 10python3 -m tg_msg_manager.cli retry --cleanup--listпечатает локальное состояние retry-очереди, обычный запуск исполняет due tasks,--cleanupудаляет terminal rows. - Диагностический отчёт:
python3 -m tg_msg_manager.cli reportpython3 -m tg_msg_manager.cli report --jsonКоманда работает только через SQLite/filesystem read-side и не требует Telegram credentials. - Локальная история имён цели:
python3 -m tg_msg_manager.cli target names 123456789python3 -m tg_msg_manager.cli target names 123456789 --field username --format jsonКоманда читает только локальные SQLite metadata, не подключается к Telegram и не выполняет identity/profiling/OSINT-анализ. - Установка алиасов:
python3 -m tg_msg_manager.cli setup
✅ Локальная проверка
pip install -e .[dev]
make lint
make format-check
make test
make verify
make pre-commit
Перед коммитом запускайте make pre-commit: он применяет ruff format, затем выполняет полный make verify.
Offline regression harness:
python3 -m unittest tests.e2e.test_fixture_e2e -q
Минимальный smoke-check с текущей Telegram-сессией:
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flat --limit 1
⚙️ Конфигурация
После установки из PyPI приложение использует постоянный рабочий каталог
~/TG_MSG_MANAGER. При первом запуске автоматически создаются каталоги для
базы, логов и экспортов. Путь можно переопределить через TG_HOME.
Приложение читает настройки из ~/TG_MSG_MANAGER/config.json, переменных
окружения TG_*, .env и init args. Относительные пути базы и Telegram-сессии
разрешаются внутри рабочего каталога, а не внутри текущей директории shell.
Базовый пример:
{
"api_id": 123456,
"api_hash": "YOUR_API_HASH",
"session_name": "tg_msg_manager",
"db_path": "messages.db",
"account_name": "Default Account",
"whitelist_chats": [],
"include_chats": [],
"chats_to_search_user_msgs": [],
"max_rps": 3.0,
"log_level": "INFO",
"lang": "ru"
}
Приоритет источников:
- init args;
- env vars
TG_*; config.json;.env.
Legacy aliases still supported:
exclude_chats->whitelist_chatslanguage/ui_language->lang
Known Limitations
--limitограничивает обработку в рамках одногоsync_chat; при экспорте пользователя по нескольким диалогам лимит применяется к каждому диалогу отдельно.export-pmпишет текстовый лог и медиа-структуру, но не восстанавливает Telegram-специфичные сущности как полноценный replay архива; private archive contract пока deferred и не входит в user/groupexport+db-exportcontract.export-channelв Stage 3A/3A.1/3B/3C является filesystem-first dataset projection pipeline: channel posts и discussion comments не пишутся в SQLite, analytics не выполняется.validate-datasetиinspect-datasetпроверяют только структуру, deterministic counts/statuses и связи файлов; validation также предупреждает о message-id gaps, missing reply parents и media linkage drift, но не анализирует содержание сообщений и не проверяет SHA-256 media по умолчанию.- Безопасный режим по умолчанию для
export-channel—--media metadata;--media fullработает только при явном указании и использует size/type guardrails. - Discussion export выключен по умолчанию через
--discussion none;--discussion metadataсохраняет только компактныйdiscussion_metadata.jsonl, а--discussion fullэкспортирует comments/threads только для постов текущего run и является heavy mode для малых scoped runs. - Discussion resolver сначала использует linked discussion metadata канала, затем fallback из Telegram metadata поста (
raw_payload.replies.channel_id), если channel-level link недоступен. - Старые discussion threads не refresh/backfill без
--force; reply-tree reconstruction не выполняется, сохраняется толькоreply_to_id. - Full media download для discussion comments не реализован.
export-channelиспользует файловыйchannel_export_state.json; channel/discussion payload writes проходят через temp-file replace, поэтому сбой write-session не дописывает частичные rows в финальные payload files. Это не полноценная multi-file ACID-транзакция и не откатывает уже скачанные media files.- Переключение существующего metadata-only dataset на
--media fullбез--forceскачивает media только для новых постов текущего run; исторический backfill старых rows по-прежнему требует full re-export. - Фоновая запись в SQLite остаётся чувствительной к очень большим deep-export проходам; основная оптимизация сейчас сделана на уровне пакетных сервисных вызовов.
- Планировщик
scheduleсейчас ориентирован на macOSlaunchd. db-export --jsonпо умолчанию не включает полныйraw_payload; если когда-нибудь понадобится полный Telethon-слепок, это потребует отдельного full-профиля экспорта.context-readableменяет только TXT-представление user/group export. Он не меняет Telegram fetching, context extraction, JSONL schema, dataset/state schema или SQLite schema; missing replies отображаются компактно как↪ missing reply #id.- После прерванного
export/tgeкомандаupdate/tguможет иметь заметную подготовительную паузу перед первым видимым прогрессом, если системе нужно переиспользовать большой общий HEAD-срез чата. retryпокрывает только типизированные recoverable tasks (sync_target,archive_pm); это не произвольная универсальная очередь задач.report— диагностический read-only срез состояния системы, а не аналитический слой с keyword/topic или graph intelligence.
🧪 Fixture-Based E2E
Начиная с foundation stages 3–5, в репо есть автономная offline harness:
tests/fixtures/stage5/*.jsonl— anonymized Telegram-like fixtures;tg_msg_manager/testing/—FakeTelegramClient, fixture loaders, temp runtime helpers;tests/e2e/test_fixture_e2e.py— end-to-end покрытие дляsync,context,db-export,retry,report.
Эта harness не требует сети и используется как regression-опора для дальнейших refactor/change batches.
License
MIT License. See LICENSE.
🚀 Быстрые Алиасы (Power User)
Выполните python3 run.py setup, чтобы создать короткие команды:
tg— Запуск главного меню.tgr— Репетиция очистки в dry-run.tgd— Мгновенная очистка всех ваших сообщений.tgu— Автоматическое обновление всей базы.tge ID— Быстрый экспорт конкретного пользователя.tgpm ID— Быстрый архив лички по user ID.tgrt [args]— Быстрый доступ кretry.tgrp [args]— Быстрый доступ кreport.
🇬🇧 English
TG_MSG_MNGR is a local CLI utility and data pipeline for Telegram exports, SQLite-backed sync, self-message cleanup, channel datasets, and read-only validation.
It is not a SaaS monitoring, analytics/OSINT, profiling, or GUI dashboard platform.
Quick Reference
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --depth 3 --json
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flat
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --txt-profile legacy
python3 -m tg_msg_manager.cli db-export --user-id 123456789
python3 -m tg_msg_manager.cli export-pm --user-id 123456789
python3 -m tg_msg_manager.cli db-export --user-id 123456789 --json
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 100 --media metadata
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 10 --media metadata --discussion full --max-comments-per-post 100
python3 -m tg_msg_manager.cli validate-dataset --path exports/channels/example
python3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example
python3 -m tg_msg_manager.cli target names 123456789
python3 -m tg_msg_manager.cli update
python3 -m tg_msg_manager.cli retry --list
python3 -m tg_msg_manager.cli report
🚀 Quick Start
Recommended: install from PyPI
macOS / Linux:
python3 -m pip install tg-msg-manager
tg-msg-manager
Windows PowerShell:
py -m pip install tg-msg-manager
tg-msg-manager
Install the latest source from the repository
git clone https://github.com/JohnyNoxwell/tg-msg-manager.git
cd tg-msg-manager
python3 -m pip install .
tg-msg-manager
On Windows, replace python3 with py.
Development installation
git clone https://github.com/JohnyNoxwell/tg-msg-manager.git
cd tg-msg-manager
python3 -m pip install -e ".[dev]"
Upgrade the PyPI installation
python3 -m pip install --upgrade tg-msg-manager
On Windows, replace python3 with py.
The installed console script is tg-msg-manager. Before a full run, create
config.json manually from config.example.json. See
the step-by-step guide: docs/user/QUICKSTART.md.
The working directory is created automatically:
- macOS / Linux:
~/TG_MSG_MANAGER - Windows:
%USERPROFILE%\TG_MSG_MANAGER
Launch the interactive menu with tg-msg-manager. Use two-digit menu codes:
01-10 for primary actions, 11 for retry, 12 for report, 98
for language toggle, 00 for exit, and ESC to go back.
🌟 Core Features
Core system capabilities:
- 🧹 Global Cleanup (
clean) — Removes your own messages from all selected chats. Supports whitelists and safe Dry Run mode. - 📥 Deep Context Export (
export) — Automatically retrieves target messages along with the "surrounding" conversation window. - 💬 PM Archive (
export-pm) — Text backup for private conversations with a prepared folder structure for media; a separate public private-archive contract is still deferred. - 🗄️ SQLite Storage — All messages are stored in a structured
messages.dbfor instant querying and zero duplicates. - 📤 Database Export — Export collected SQLite records into JSON or Text. JSONL now defaults to a compact AI-friendly profile.
- 📡 Direct Channel Export (
export-channel) — Filesystem-first dataset export of Telegram channel posts intomanifest.json,messages.jsonl,messages.txt,media_manifest.jsonl,run_changelog.jsonl, and optional discussion dataset files when--discussion fullis explicit. - ✅ Dataset Validation / Inspection —
validate-datasetchecks channel dataset structure,inspect-datasetreports deterministic counts/statuses, andinspect-dataset --doctoremits read-only diagnostic findings without Telegram access, repair/migration, or analytics. - ♻️ Retry Queue (
retry) — Replays recoverable sync/archive failures through typed retry tasks instead of manual DB surgery. - 📋 Audit Report (
report) — Read-only diagnostics for local DB state, retry backlog, export artifacts, and tracked-target health without Telegram access.
📚 Documentation
- First-run navigation:
docs/user/QUICKSTART.md - Dataset doctor output examples:
docs/user/DATASET_DOCTOR_EXAMPLES.md - Full documentation map:
docs/README.md - Command reference:
COMMANDS.md - Privacy / sensitive artifacts:
docs/development/PRIVACY_AND_SENSITIVE_ARTIFACTS.md - Operational risks / local limits:
docs/development/OPERATIONAL_RISKS_AND_LIMITS.md - Package identity / version policy:
docs/development/PACKAGE_IDENTITY_AND_VERSION_POLICY.md - Coding-agent contract:
AGENTS.md
🛠️ Advanced Usage (CLI)
Subcommands can be executed directly for automation:
⚠️ Note: In a source checkout, complete the installation step above first. After installation, use
tg-msg-manager ...orpython3 -m tg_msg_manager.cli ...from the active Python environment.
- Message Export:
python3 -m tg_msg_manager.cli export --user-id 123456789 --depth 3python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --depth 3 --jsonpython3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flatpython3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --txt-profile legacy--jsonwrites a final JSONL snapshot after sync; without--json, the final export is TXT. The default TXT profile forexportiscontext-readable: it groups output intoCONTEXT BLOCKsections with[REPLIED MESSAGE],[CONTEXT BEFORE],[TARGET MESSAGE]/[TARGET MESSAGES], and[CONTEXT AFTER]. Use--txt-profile legacyfor the old flat log-style TXT. TXT is a projection only; JSONL/SQLite records remain canonical. Deep Mode defaults to--depth 2when no explicit depth is provided. - Global Cleanup (Apply):
python3 -m tg_msg_manager.cli clean --apply --yes - Universal Update:
python3 -m tg_msg_manager.cli updateAfter a large interrupted export,updatemay appear idle before per-target progress starts; during that phase the service is building a shared head prefetch slice for the chat. - PM Archive:
python3 -m tg_msg_manager.cli export-pm --user-id 123456789export-pmremains a separate archive workflow: it is not part of Non-Channel Export Contract V1 forexport/db-export, and the private archive contract remains deferred. - DB Export:
python3 -m tg_msg_manager.cli db-export --user-id 123456789python3 -m tg_msg_manager.cli db-export --user-id 123456789 --txt-profile legacypython3 -m tg_msg_manager.cli db-export --user-id 123456789 --jsonWithout--json, the command writes TXT; with--json, it writes compact AI-friendly JSONL. The default TXT profile iscontext-readable;--txt-profile legacykeeps the old flat format. - Direct Channel Export:
python3 -m tg_msg_manager.cli export-channel --channel @example --limit 100 --media metadatapython3 -m tg_msg_manager.cli export-channel --channel @example --limit 10 --media metadata --discussion full --max-comments-per-post 100The command writes a filesystem dataset underexports/channels/. Stage 3A/3A.1/3B/3C does not perform analytics and does not persist channel posts or discussion comments into SQLite. Only broadcast channels are supported; groups and supergroups are out of scope forexport-channel. Successful runs createchannel_export_state.json; later runs without--forceappend only newly discovered posts through temp-file copy/append/replace. The safe default remains--media metadata. The discussion default is--discussion none; no discussion resolver runs, no comments are fetched, and no discussion files are created in that mode.--discussion metadatawrites compactdiscussion_metadata.jsonlrecords fromraw_payload.repliesand does not fetch comments.--discussion fullis explicit heavy mode: it writesdiscussion_comments.jsonl,discussion_comments.txt,discussion_threads.jsonl, anddiscussion_export_state.jsononly for posts fetched in the current run. For large channels it can produce millions of records and multi-gigabyte datasets; usemetadatafor broad archives. The discussion resolver uses channel linked-discussion metadata and falls back to per-post Telegram metadata (raw_payload.replies.channel_id) when the channel-level link is unavailable. Incremental runs export discussion comments only for new posts; no-new-posts runs do not refetch old threads or mutatediscussion_export_state.json. If an existing dataset was created without discussion comments, rerun with--force --discussion fullor use a clean output directory to reprocess old threads. Discussion comment media is metadata-only; full media download for discussion comments is not implemented. Full media download requires explicit--media full; it supports--max-media-sizewith a50MBdefault and--media-types photo,video,.... Media filenames and final media subdirectories are resolved from a safe Telegram original filename, then MIME type, then lightweight magic bytes;.binremains the fallback only for unknown types.media_manifest.jsonlrecords the final media path. OCR, speech-to-text, media analysis, transcoding, and ffmpeg processing are not performed. Infullmode,media_manifest.jsonlrecords final statuses such asdownloaded,already_exists,skipped_by_size,skipped_by_type, andfailed.run_changelog.jsonlgets one row per completed run with previous/new cursor, run mode, new message IDs, and artifact paths; no-new-posts runs write a row withnew_message_count: 0. Interactive menu item10now prompts for discussion mode, max comments per post, force, output directory, max media size, and media types; empty input preserves the direct CLI defaults. - Channel Dataset Validation / Inspection:
python3 -m tg_msg_manager.cli validate-dataset --path exports/channels/examplepython3 -m tg_msg_manager.cli validate-dataset --path exports/channels/example --jsonpython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/examplepython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example --jsonpython3 -m tg_msg_manager.cli inspect-dataset --path exports/channels/example --doctorThese commands are read-only, require no Telegram credentials, do not repair or migrate datasets, and do not perform analytics/OCR/STT/media processing. Doctor mode adds severity, artifact path, and suggested next action for validation findings. - Full Local Purge:
python3 -m tg_msg_manager.cli delete --user-id 123456789 - Scheduler (macOS):
python3 -m tg_msg_manager.cli schedule - Retry Queue Replay:
python3 -m tg_msg_manager.cli retry --listpython3 -m tg_msg_manager.cli retry --limit 10python3 -m tg_msg_manager.cli retry --cleanup--listprints the local retry queue, plain execution runs due tasks, and--cleanupremoves terminal rows. - Diagnostic Report:
python3 -m tg_msg_manager.cli reportpython3 -m tg_msg_manager.cli report --jsonThe command is fully read-only and works from SQLite/filesystem state without Telegram credentials. - Local Target Name History:
python3 -m tg_msg_manager.cli target names 123456789python3 -m tg_msg_manager.cli target names 123456789 --field username --format jsonThe command reads local SQLite metadata only, does not connect to Telegram, and does not perform identity, profiling, or OSINT analysis. - Alias Setup:
python3 -m tg_msg_manager.cli setup
✅ Local Verification
pip install -e .[dev]
make lint
make format-check
make test
make verify
make pre-commit
Before committing, run make pre-commit: it applies ruff format, then runs the full make verify.
Offline regression harness:
python3 -m unittest tests.e2e.test_fixture_e2e -q
Minimal live smoke-check with the current Telegram session:
python3 -m tg_msg_manager.cli export --user-id 123456789 --chat-id 987654321 --flat --limit 1
⚙️ Configuration
After installation from PyPI, the app uses ~/TG_MSG_MANAGER as its stable
working directory. Database, log, and export directories are created
automatically on first run. Override the location with TG_HOME.
The app reads settings from ~/TG_MSG_MANAGER/config.json, TG_* environment
variables, .env, and init args. Relative database and Telegram session paths
are resolved inside the working directory instead of the shell's current
directory.
Minimal example:
{
"api_id": 123456,
"api_hash": "YOUR_API_HASH",
"session_name": "tg_msg_manager",
"db_path": "messages.db",
"account_name": "Default Account",
"whitelist_chats": [],
"include_chats": [],
"chats_to_search_user_msgs": [],
"max_rps": 3.0,
"log_level": "INFO",
"lang": "ru"
}
Source precedence:
- init args;
TG_*env vars;config.json;.env.
Supported legacy aliases:
exclude_chats->whitelist_chatslanguage/ui_language->lang
Known Limitations
--limitcaps work inside a singlesync_chat; when exporting a user across multiple dialogs, the cap applies per dialog.export-pmproduces a text-and-media archive, not a full Telegram-native replayable backup; its private archive contract remains deferred and is not part of the user/groupexport+db-exportcontract.export-channelin Stage 3A/3A.1/3B/3C is a filesystem-first dataset projection pipeline; channel posts and discussion comments are not written to SQLite, and analytics are not performed.validate-datasetandinspect-datasetcheck only structure, deterministic counts/statuses, and file relationships; validation also warns about message-id gaps, missing reply parents, and media linkage drift, but does not analyze message content or verify media SHA-256 by default.- The safe default for
export-channelremains--media metadata;--media fullworks only when requested explicitly and runs through size/type guardrails. - Discussion export is disabled by default with
--discussion none;--discussion metadatasaves only compactdiscussion_metadata.jsonl, while--discussion fullexports comments/threads only for posts fetched in the current run and is heavy mode for small scoped runs. - Discussion resolution uses channel linked-discussion metadata first, then per-post Telegram metadata (
raw_payload.replies.channel_id) when the channel-level link is unavailable. - Old discussion threads are not refreshed/backfilled without
--force; reply-tree reconstruction is not implemented beyond preservingreply_to_id. - Full media download for discussion comments is not implemented.
export-channeluses filesystem state; channel/discussion payload writes go through temp-file replace, so write-session failures do not append partial rows to final payload files. This is not a full multi-file ACID transaction and does not roll back media files already downloaded.- Switching an existing metadata-only dataset to
--media fullwithout--forcedownloads media only for newly fetched posts in that run; historical backfill for old rows still requires a full re-export. - SQLite background writing is still most sensitive during very large deep-export passes; the current optimization focus is batched service-level writes.
- The built-in
schedulecommand currently targets macOSlaunchd. db-export --jsonno longer includes the fullraw_payloadby default; a future explicit full-export profile would be needed for raw Telethon dumps.context-readablechanges only the user/group export TXT projection. It does not change Telegram fetching, context extraction, JSONL schema, dataset/state schema, or SQLite schema; missing replies render compactly as↪ missing reply #id.- After an interrupted
export/tge,update/tgumay have a noticeable preparation pause before the first visible per-target progress if the service needs to rebuild a large shared chat-head slice. retrycurrently covers only typed recoverable tasks (sync_target,archive_pm); it is not a general-purpose task queue.reportis an operational read-only diagnostic surface, not an analytics layer with keyword/topic or graph intelligence.
🧪 Fixture-Based E2E
Since foundation stages 3–5, the repo ships an autonomous offline harness:
tests/fixtures/stage5/*.jsonl— anonymized Telegram-like fixtures;tg_msg_manager/testing/—FakeTelegramClient, fixture loaders, and temporary runtime helpers;tests/e2e/test_fixture_e2e.py— end-to-end coverage forsync,context,db-export,retry, andreport.
This harness requires no network access and acts as the regression baseline for future refactor and feature batches.
🚀 Power User Aliases
Run python3 run.py setup to register short commands:
tg— Launch the main menu.tgr— Dry-run cleanup rehearsal.tgd— Instantly scan and delete your messages.tgu— Progressively update all tracked targets.tge ID— Quick export for a specific user.tgpm ID— Quick PM archive by user ID.tgrt [args]— Quick access toretry.tgrp [args]— Quick access toreport.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tg_msg_manager-0.1.1.tar.gz.
File metadata
- Download URL: tg_msg_manager-0.1.1.tar.gz
- Upload date:
- Size: 227.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac3c8ebb5b169b5c1d548f97f45c900984620a7a7c0cb0d7c7f3a873d46d97ab
|
|
| MD5 |
2dbc38bc1fa22b801a19bc89aac3fe94
|
|
| BLAKE2b-256 |
6bec01fb0ac91850d82242a9e17c3bcf7dc39ea5ef4f337a763f7169737f48ee
|
Provenance
The following attestation bundles were made for tg_msg_manager-0.1.1.tar.gz:
Publisher:
pypi-publish.yml on JohnyNoxwell/tg-msg-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tg_msg_manager-0.1.1.tar.gz -
Subject digest:
ac3c8ebb5b169b5c1d548f97f45c900984620a7a7c0cb0d7c7f3a873d46d97ab - Sigstore transparency entry: 1792175088
- Sigstore integration time:
-
Permalink:
JohnyNoxwell/tg-msg-manager@282b840da14abe58dca75a47f9c49eebcf567d76 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/JohnyNoxwell
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@282b840da14abe58dca75a47f9c49eebcf567d76 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file tg_msg_manager-0.1.1-py3-none-any.whl.
File metadata
- Download URL: tg_msg_manager-0.1.1-py3-none-any.whl
- Upload date:
- Size: 307.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1513ea9df6c5f34cd81e7a53735d3b54318e3fb9bd998b85dc966b98c0fc82f
|
|
| MD5 |
4b973c0243e29252f994ffb6c0db0c8d
|
|
| BLAKE2b-256 |
9ef3f6a51d0f180dacc23a8e34e006a3b42fe011768196305315b31f69b2efc6
|
Provenance
The following attestation bundles were made for tg_msg_manager-0.1.1-py3-none-any.whl:
Publisher:
pypi-publish.yml on JohnyNoxwell/tg-msg-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tg_msg_manager-0.1.1-py3-none-any.whl -
Subject digest:
b1513ea9df6c5f34cd81e7a53735d3b54318e3fb9bd998b85dc966b98c0fc82f - Sigstore transparency entry: 1792175332
- Sigstore integration time:
-
Permalink:
JohnyNoxwell/tg-msg-manager@282b840da14abe58dca75a47f9c49eebcf567d76 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/JohnyNoxwell
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@282b840da14abe58dca75a47f9c49eebcf567d76 -
Trigger Event:
workflow_dispatch
-
Statement type: