tg-export 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tg_export-1.0.0/LICENSE +21 -0
- tg_export-1.0.0/PKG-INFO +261 -0
- tg_export-1.0.0/README.md +236 -0
- tg_export-1.0.0/pyproject.toml +43 -0
- tg_export-1.0.0/setup.cfg +4 -0
- tg_export-1.0.0/tests/test_api.py +137 -0
- tg_export-1.0.0/tests/test_auth.py +43 -0
- tg_export-1.0.0/tests/test_catalog.py +64 -0
- tg_export-1.0.0/tests/test_cli.py +31 -0
- tg_export-1.0.0/tests/test_config.py +121 -0
- tg_export-1.0.0/tests/test_converter.py +109 -0
- tg_export-1.0.0/tests/test_exporter.py +70 -0
- tg_export-1.0.0/tests/test_incremental.py +63 -0
- tg_export-1.0.0/tests/test_integration.py +52 -0
- tg_export-1.0.0/tests/test_media.py +48 -0
- tg_export-1.0.0/tests/test_migration.py +27 -0
- tg_export-1.0.0/tests/test_models.py +79 -0
- tg_export-1.0.0/tests/test_monoforum.py +28 -0
- tg_export-1.0.0/tests/test_renderer.py +130 -0
- tg_export-1.0.0/tests/test_state.py +124 -0
- tg_export-1.0.0/tests/test_topics.py +26 -0
- tg_export-1.0.0/tg_export/__init__.py +1 -0
- tg_export-1.0.0/tg_export/__main__.py +3 -0
- tg_export-1.0.0/tg_export/api.py +190 -0
- tg_export-1.0.0/tg_export/auth.py +174 -0
- tg_export-1.0.0/tg_export/catalog.py +270 -0
- tg_export-1.0.0/tg_export/cli.py +1278 -0
- tg_export-1.0.0/tg_export/config.py +372 -0
- tg_export-1.0.0/tg_export/converter.py +614 -0
- tg_export-1.0.0/tg_export/exporter.py +1098 -0
- tg_export-1.0.0/tg_export/html/__init__.py +1 -0
- tg_export-1.0.0/tg_export/html/renderer.py +642 -0
- tg_export-1.0.0/tg_export/importer.py +192 -0
- tg_export-1.0.0/tg_export/media.py +347 -0
- tg_export-1.0.0/tg_export/models.py +836 -0
- tg_export-1.0.0/tg_export/state.py +604 -0
- tg_export-1.0.0/tg_export.egg-info/PKG-INFO +261 -0
- tg_export-1.0.0/tg_export.egg-info/SOURCES.txt +40 -0
- tg_export-1.0.0/tg_export.egg-info/dependency_links.txt +1 -0
- tg_export-1.0.0/tg_export.egg-info/entry_points.txt +2 -0
- tg_export-1.0.0/tg_export.egg-info/requires.txt +13 -0
- tg_export-1.0.0/tg_export.egg-info/top_level.txt +1 -0
tg_export-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vitaly Ostanin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
tg_export-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tg-export
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Flexible Telegram data export tool
|
|
5
|
+
Author-email: Vitaly Ostanin <vitaly.ostanin@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/VitalyOstanin/tg-export
|
|
8
|
+
Project-URL: Repository, https://github.com/VitalyOstanin/tg-export
|
|
9
|
+
Project-URL: Issues, https://github.com/VitalyOstanin/tg-export/issues
|
|
10
|
+
Requires-Python: >=3.11
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Requires-Dist: telethon>=1.36
|
|
14
|
+
Requires-Dist: pyyaml>=6.0
|
|
15
|
+
Requires-Dist: aiosqlite>=0.20
|
|
16
|
+
Requires-Dist: jinja2>=3.1
|
|
17
|
+
Requires-Dist: click>=8.0
|
|
18
|
+
Requires-Dist: rich>=13.0
|
|
19
|
+
Provides-Extra: proxy
|
|
20
|
+
Requires-Dist: python-socks[asyncio]>=2.0; extra == "proxy"
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
23
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
# tg-export
|
|
27
|
+
|
|
28
|
+
Экспорт данных из Telegram на локальный диск с гибкой настройкой.
|
|
29
|
+
|
|
30
|
+
## Содержание
|
|
31
|
+
|
|
32
|
+
- [Возможности](#возможности)
|
|
33
|
+
- [Сценарии использования](#сценарии-использования)
|
|
34
|
+
- [Установка](#установка)
|
|
35
|
+
- [Быстрый старт](#быстрый-старт)
|
|
36
|
+
- [Структура конфигов](#структура-конфигов)
|
|
37
|
+
- [Конфигурация экспорта](#конфигурация-экспорта)
|
|
38
|
+
- [Тесты](#тесты)
|
|
39
|
+
|
|
40
|
+
## Возможности
|
|
41
|
+
|
|
42
|
+
- **Инкрементальный экспорт** -- при повторном запуске скачиваются только новые сообщения и файлы, состояние хранится в SQLite
|
|
43
|
+
- **Sibling-дедупликация** -- при экспорте нескольких аккаунтов (семья, рабочий/личный) общие файлы не скачиваются повторно, а линкуются через hardlink
|
|
44
|
+
- **Импорт из tdesktop** -- файлы из стандартного экспорта Telegram Desktop копируются вместо повторного скачивания
|
|
45
|
+
- **Takeout API** -- использует официальный Takeout для обхода rate-limiting
|
|
46
|
+
- **Гибкие правила экспорта** -- настройка по чатам, папкам, типам (personal, groups, channels, bots), с фильтрами по датам, типам медиа и размеру файлов
|
|
47
|
+
- **Логика архивных чатов** -- чат считается архивным (`is_archived`) только если он присутствует исключительно в архиве Telegram. Если чат есть в основном списке диалогов или в именованной папке, он не помечается как архивный, даже если одновременно находится в архиве
|
|
48
|
+
- **Проверка размера в runtime** -- если реальный размер файла превышает лимит, скачивание прерывается и частичный файл удаляется
|
|
49
|
+
- **HTML-рендеринг по месяцам** -- каждый месяц в отдельном файле, с оглавлением (TOC) и навигацией prev/next
|
|
50
|
+
- **Progress bars** -- основной прогресс по сообщениям + sub-progress bars для каждого скачиваемого файла
|
|
51
|
+
- **Контроль свободного места** -- экспорт останавливается, если свободное место на диске падает ниже порога (`min_free_space` в `config.yaml`, по умолчанию 20 GB)
|
|
52
|
+
- **Корректный shutdown** -- Ctrl+C сохраняет состояние, двойной Ctrl+C -- force shutdown с cleanup
|
|
53
|
+
- **Поддержка прокси** -- SOCKS5, SOCKS4, HTTP прокси для подключения к Telegram API
|
|
54
|
+
- **Данные в SQLite** -- все сообщения и метаданные хранятся в SQLite, что позволяет пересоздать HTML без обращения к Telegram API, строить поисковые индексы, подключить веб-интерфейс или использовать данные в любых других целях
|
|
55
|
+
- **CLI для анализа** -- команда `tg info` для batch-запросов информации о чатах через API
|
|
56
|
+
- **Очистка данных чата** -- команда `purge` для удаления данных конкретного чата из БД и с диска
|
|
57
|
+
|
|
58
|
+
## Сценарии использования
|
|
59
|
+
|
|
60
|
+
**Личный архив** -- экспорт всех личных переписок и групп с медиафайлами на локальный диск для долгосрочного хранения.
|
|
61
|
+
|
|
62
|
+
**Семейный экспорт** -- экспорт аккаунтов нескольких членов семьи. Общие группы и каналы содержат одинаковые файлы -- sibling-дедупликация экономит место на диске через hardlink.
|
|
63
|
+
|
|
64
|
+
**Выборочный экспорт** -- экспорт только нужных чатов/папок с правилами: рабочие чаты экспортируются, боты и публичные каналы пропускаются, для флудилок скачиваются только фото.
|
|
65
|
+
|
|
66
|
+
**Миграция с tdesktop** -- если уже есть экспорт из Telegram Desktop, файлы из него импортируются без повторного скачивания.
|
|
67
|
+
|
|
68
|
+
## Установка
|
|
69
|
+
|
|
70
|
+
Из PyPI (экспериментально, не проверялось):
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pip install tg-export
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Для работы через прокси:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install tg-export[proxy]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Из исходников:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
uv pip install -e .
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Быстрый старт
|
|
89
|
+
|
|
90
|
+
### 1. Получить API credentials
|
|
91
|
+
|
|
92
|
+
Зайти на [my.telegram.org](https://my.telegram.org), создать приложение, получить `api_id` и `api_hash`.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
uv run tg-export auth credentials
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Ввести `api_id` и `api_hash`. Они сохраняются в `~/.config/tg-export/api_credentials.yaml` и используются для всех аккаунтов.
|
|
99
|
+
|
|
100
|
+
### 2. Настроить прокси (если нужен)
|
|
101
|
+
|
|
102
|
+
Создать файл `~/.config/tg-export/config.yaml`:
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
proxy:
|
|
106
|
+
type: socks5 # socks5, socks4, http
|
|
107
|
+
host: 127.0.0.1
|
|
108
|
+
port: 1080
|
|
109
|
+
# username: user # опционально
|
|
110
|
+
# password: pass # опционально
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 3. Залогиниться в Telegram
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
uv run tg-export auth add --name myaccount
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Ввести номер телефона и код подтверждения. Сессия сохранится в `~/.config/tg-export/sessions/myaccount.session`.
|
|
120
|
+
|
|
121
|
+
Для нескольких аккаунтов повторить с разными именами. Установить аккаунт по умолчанию:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
uv run tg-export account default myaccount
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 4. Анализ чатов и каталог
|
|
128
|
+
|
|
129
|
+
Получить каталог всех чатов аккаунта:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
uv run tg-export list --output catalog.yaml
|
|
133
|
+
uv run tg-export list --format json --output catalog.json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Посмотреть информацию о конкретных чатах (количество сообщений, последние сообщения):
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
uv run tg-export info 123456789 987654321
|
|
140
|
+
uv run tg-export info --from-catalog catalog.json --type personal --last 3
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 5. Настройка правил экспорта
|
|
144
|
+
|
|
145
|
+
Сгенерировать шаблон конфига:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
uv run tg-export init
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Конфиг создается в `~/.config/tg-export/myaccount.yaml`. Настроить правила: какие чаты экспортировать, какие пропускать, какие типы медиа скачивать.
|
|
152
|
+
|
|
153
|
+
AI-агенты (Claude Code, Cursor и т.д.) могут помочь с настройкой: показать список чатов по категориям, задать вопросы о каждом и сформировать конфиг интерактивно.
|
|
154
|
+
|
|
155
|
+
Пример конфига:
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
output:
|
|
159
|
+
path: ./export_output/myaccount
|
|
160
|
+
|
|
161
|
+
defaults:
|
|
162
|
+
media:
|
|
163
|
+
types: [all]
|
|
164
|
+
max_file_size: 100MB
|
|
165
|
+
concurrent_downloads: 3
|
|
166
|
+
|
|
167
|
+
# Импорт файлов из существующего экспорта tdesktop
|
|
168
|
+
import_existing:
|
|
169
|
+
- path: ~/Downloads/Telegram Desktop/DataExport
|
|
170
|
+
type: tdesktop
|
|
171
|
+
|
|
172
|
+
# Правила по типам чатов
|
|
173
|
+
type_rules:
|
|
174
|
+
bots:
|
|
175
|
+
skip: true
|
|
176
|
+
public:
|
|
177
|
+
skip: true
|
|
178
|
+
personal: {} # экспортировать все личные чаты
|
|
179
|
+
self: {} # экспортировать Saved Messages
|
|
180
|
+
|
|
181
|
+
# Правила по папкам Telegram
|
|
182
|
+
folders:
|
|
183
|
+
Work: {}
|
|
184
|
+
Family:
|
|
185
|
+
media:
|
|
186
|
+
types: [photo, video]
|
|
187
|
+
|
|
188
|
+
# Правила по конкретным чатам
|
|
189
|
+
chats:
|
|
190
|
+
- id: 777000
|
|
191
|
+
name: Telegram
|
|
192
|
+
action: skip
|
|
193
|
+
- id: 123456789
|
|
194
|
+
name: "Important Chat"
|
|
195
|
+
media:
|
|
196
|
+
types: [] # без медиа
|
|
197
|
+
|
|
198
|
+
# Что делать с чатами, не попавшими ни в одно правило
|
|
199
|
+
unmatched: skip
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 6. Запустить экспорт
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
uv run tg-export run
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Для пробного запуска без скачивания:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
uv run tg-export run --dry-run
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
При повторном запуске скачиваются только новые сообщения (инкрементальный экспорт).
|
|
215
|
+
|
|
216
|
+
### 7. Sibling-дедупликация
|
|
217
|
+
|
|
218
|
+
При экспорте нескольких аккаунтов в один каталог (`./export_output/`), tg-export автоматически находит соседние базы данных и использует уже скачанные файлы через hardlink:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
export_output/
|
|
222
|
+
account1/ # первый аккаунт
|
|
223
|
+
account2/ # файлы из общих чатов линкуются из account1
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Структура конфигов
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
~/.config/tg-export/
|
|
230
|
+
api_credentials.yaml # API ID и Hash (общие для всех аккаунтов)
|
|
231
|
+
config.yaml # Глобальные настройки (proxy, min_free_space)
|
|
232
|
+
default_account # Имя аккаунта по умолчанию
|
|
233
|
+
sessions/
|
|
234
|
+
myaccount.session # Telethon-сессия
|
|
235
|
+
myaccount.yaml # Конфиг экспорта для аккаунта
|
|
236
|
+
|
|
237
|
+
export_output/
|
|
238
|
+
myaccount/
|
|
239
|
+
.tg-export-state.db # SQLite: состояние экспорта, сообщения, файлы
|
|
240
|
+
unfiled/
|
|
241
|
+
Chat_Name_123456/
|
|
242
|
+
messages.html # Redirect на первый месяц
|
|
243
|
+
messages_2024-01.html # Сообщения за январь 2024
|
|
244
|
+
messages_2024-02.html # Сообщения за февраль 2024
|
|
245
|
+
photos/ # Скачанные фото
|
|
246
|
+
videos/ # Скачанные видео
|
|
247
|
+
files/ # Скачанные документы
|
|
248
|
+
folders/
|
|
249
|
+
Work/
|
|
250
|
+
...
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Тесты
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
uv run python -m pytest tests/ -v
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Лицензия
|
|
260
|
+
|
|
261
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# tg-export
|
|
2
|
+
|
|
3
|
+
Экспорт данных из Telegram на локальный диск с гибкой настройкой.
|
|
4
|
+
|
|
5
|
+
## Содержание
|
|
6
|
+
|
|
7
|
+
- [Возможности](#возможности)
|
|
8
|
+
- [Сценарии использования](#сценарии-использования)
|
|
9
|
+
- [Установка](#установка)
|
|
10
|
+
- [Быстрый старт](#быстрый-старт)
|
|
11
|
+
- [Структура конфигов](#структура-конфигов)
|
|
12
|
+
- [Конфигурация экспорта](#конфигурация-экспорта)
|
|
13
|
+
- [Тесты](#тесты)
|
|
14
|
+
|
|
15
|
+
## Возможности
|
|
16
|
+
|
|
17
|
+
- **Инкрементальный экспорт** -- при повторном запуске скачиваются только новые сообщения и файлы, состояние хранится в SQLite
|
|
18
|
+
- **Sibling-дедупликация** -- при экспорте нескольких аккаунтов (семья, рабочий/личный) общие файлы не скачиваются повторно, а линкуются через hardlink
|
|
19
|
+
- **Импорт из tdesktop** -- файлы из стандартного экспорта Telegram Desktop копируются вместо повторного скачивания
|
|
20
|
+
- **Takeout API** -- использует официальный Takeout для обхода rate-limiting
|
|
21
|
+
- **Гибкие правила экспорта** -- настройка по чатам, папкам, типам (personal, groups, channels, bots), с фильтрами по датам, типам медиа и размеру файлов
|
|
22
|
+
- **Логика архивных чатов** -- чат считается архивным (`is_archived`) только если он присутствует исключительно в архиве Telegram. Если чат есть в основном списке диалогов или в именованной папке, он не помечается как архивный, даже если одновременно находится в архиве
|
|
23
|
+
- **Проверка размера в runtime** -- если реальный размер файла превышает лимит, скачивание прерывается и частичный файл удаляется
|
|
24
|
+
- **HTML-рендеринг по месяцам** -- каждый месяц в отдельном файле, с оглавлением (TOC) и навигацией prev/next
|
|
25
|
+
- **Progress bars** -- основной прогресс по сообщениям + sub-progress bars для каждого скачиваемого файла
|
|
26
|
+
- **Контроль свободного места** -- экспорт останавливается, если свободное место на диске падает ниже порога (`min_free_space` в `config.yaml`, по умолчанию 20 GB)
|
|
27
|
+
- **Корректный shutdown** -- Ctrl+C сохраняет состояние, двойной Ctrl+C -- force shutdown с cleanup
|
|
28
|
+
- **Поддержка прокси** -- SOCKS5, SOCKS4, HTTP прокси для подключения к Telegram API
|
|
29
|
+
- **Данные в SQLite** -- все сообщения и метаданные хранятся в SQLite, что позволяет пересоздать HTML без обращения к Telegram API, строить поисковые индексы, подключить веб-интерфейс или использовать данные в любых других целях
|
|
30
|
+
- **CLI для анализа** -- команда `tg info` для batch-запросов информации о чатах через API
|
|
31
|
+
- **Очистка данных чата** -- команда `purge` для удаления данных конкретного чата из БД и с диска
|
|
32
|
+
|
|
33
|
+
## Сценарии использования
|
|
34
|
+
|
|
35
|
+
**Личный архив** -- экспорт всех личных переписок и групп с медиафайлами на локальный диск для долгосрочного хранения.
|
|
36
|
+
|
|
37
|
+
**Семейный экспорт** -- экспорт аккаунтов нескольких членов семьи. Общие группы и каналы содержат одинаковые файлы -- sibling-дедупликация экономит место на диске через hardlink.
|
|
38
|
+
|
|
39
|
+
**Выборочный экспорт** -- экспорт только нужных чатов/папок с правилами: рабочие чаты экспортируются, боты и публичные каналы пропускаются, для флудилок скачиваются только фото.
|
|
40
|
+
|
|
41
|
+
**Миграция с tdesktop** -- если уже есть экспорт из Telegram Desktop, файлы из него импортируются без повторного скачивания.
|
|
42
|
+
|
|
43
|
+
## Установка
|
|
44
|
+
|
|
45
|
+
Из PyPI (экспериментально, не проверялось):
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install tg-export
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Для работы через прокси:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install tg-export[proxy]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Из исходников:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
uv pip install -e .
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Быстрый старт
|
|
64
|
+
|
|
65
|
+
### 1. Получить API credentials
|
|
66
|
+
|
|
67
|
+
Зайти на [my.telegram.org](https://my.telegram.org), создать приложение, получить `api_id` и `api_hash`.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
uv run tg-export auth credentials
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Ввести `api_id` и `api_hash`. Они сохраняются в `~/.config/tg-export/api_credentials.yaml` и используются для всех аккаунтов.
|
|
74
|
+
|
|
75
|
+
### 2. Настроить прокси (если нужен)
|
|
76
|
+
|
|
77
|
+
Создать файл `~/.config/tg-export/config.yaml`:
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
proxy:
|
|
81
|
+
type: socks5 # socks5, socks4, http
|
|
82
|
+
host: 127.0.0.1
|
|
83
|
+
port: 1080
|
|
84
|
+
# username: user # опционально
|
|
85
|
+
# password: pass # опционально
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. Залогиниться в Telegram
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
uv run tg-export auth add --name myaccount
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Ввести номер телефона и код подтверждения. Сессия сохранится в `~/.config/tg-export/sessions/myaccount.session`.
|
|
95
|
+
|
|
96
|
+
Для нескольких аккаунтов повторить с разными именами. Установить аккаунт по умолчанию:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
uv run tg-export account default myaccount
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 4. Анализ чатов и каталог
|
|
103
|
+
|
|
104
|
+
Получить каталог всех чатов аккаунта:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
uv run tg-export list --output catalog.yaml
|
|
108
|
+
uv run tg-export list --format json --output catalog.json
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Посмотреть информацию о конкретных чатах (количество сообщений, последние сообщения):
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
uv run tg-export info 123456789 987654321
|
|
115
|
+
uv run tg-export info --from-catalog catalog.json --type personal --last 3
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 5. Настройка правил экспорта
|
|
119
|
+
|
|
120
|
+
Сгенерировать шаблон конфига:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
uv run tg-export init
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Конфиг создается в `~/.config/tg-export/myaccount.yaml`. Настроить правила: какие чаты экспортировать, какие пропускать, какие типы медиа скачивать.
|
|
127
|
+
|
|
128
|
+
AI-агенты (Claude Code, Cursor и т.д.) могут помочь с настройкой: показать список чатов по категориям, задать вопросы о каждом и сформировать конфиг интерактивно.
|
|
129
|
+
|
|
130
|
+
Пример конфига:
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
output:
|
|
134
|
+
path: ./export_output/myaccount
|
|
135
|
+
|
|
136
|
+
defaults:
|
|
137
|
+
media:
|
|
138
|
+
types: [all]
|
|
139
|
+
max_file_size: 100MB
|
|
140
|
+
concurrent_downloads: 3
|
|
141
|
+
|
|
142
|
+
# Импорт файлов из существующего экспорта tdesktop
|
|
143
|
+
import_existing:
|
|
144
|
+
- path: ~/Downloads/Telegram Desktop/DataExport
|
|
145
|
+
type: tdesktop
|
|
146
|
+
|
|
147
|
+
# Правила по типам чатов
|
|
148
|
+
type_rules:
|
|
149
|
+
bots:
|
|
150
|
+
skip: true
|
|
151
|
+
public:
|
|
152
|
+
skip: true
|
|
153
|
+
personal: {} # экспортировать все личные чаты
|
|
154
|
+
self: {} # экспортировать Saved Messages
|
|
155
|
+
|
|
156
|
+
# Правила по папкам Telegram
|
|
157
|
+
folders:
|
|
158
|
+
Work: {}
|
|
159
|
+
Family:
|
|
160
|
+
media:
|
|
161
|
+
types: [photo, video]
|
|
162
|
+
|
|
163
|
+
# Правила по конкретным чатам
|
|
164
|
+
chats:
|
|
165
|
+
- id: 777000
|
|
166
|
+
name: Telegram
|
|
167
|
+
action: skip
|
|
168
|
+
- id: 123456789
|
|
169
|
+
name: "Important Chat"
|
|
170
|
+
media:
|
|
171
|
+
types: [] # без медиа
|
|
172
|
+
|
|
173
|
+
# Что делать с чатами, не попавшими ни в одно правило
|
|
174
|
+
unmatched: skip
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 6. Запустить экспорт
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
uv run tg-export run
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Для пробного запуска без скачивания:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
uv run tg-export run --dry-run
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
При повторном запуске скачиваются только новые сообщения (инкрементальный экспорт).
|
|
190
|
+
|
|
191
|
+
### 7. Sibling-дедупликация
|
|
192
|
+
|
|
193
|
+
При экспорте нескольких аккаунтов в один каталог (`./export_output/`), tg-export автоматически находит соседние базы данных и использует уже скачанные файлы через hardlink:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
export_output/
|
|
197
|
+
account1/ # первый аккаунт
|
|
198
|
+
account2/ # файлы из общих чатов линкуются из account1
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Структура конфигов
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
~/.config/tg-export/
|
|
205
|
+
api_credentials.yaml # API ID и Hash (общие для всех аккаунтов)
|
|
206
|
+
config.yaml # Глобальные настройки (proxy, min_free_space)
|
|
207
|
+
default_account # Имя аккаунта по умолчанию
|
|
208
|
+
sessions/
|
|
209
|
+
myaccount.session # Telethon-сессия
|
|
210
|
+
myaccount.yaml # Конфиг экспорта для аккаунта
|
|
211
|
+
|
|
212
|
+
export_output/
|
|
213
|
+
myaccount/
|
|
214
|
+
.tg-export-state.db # SQLite: состояние экспорта, сообщения, файлы
|
|
215
|
+
unfiled/
|
|
216
|
+
Chat_Name_123456/
|
|
217
|
+
messages.html # Redirect на первый месяц
|
|
218
|
+
messages_2024-01.html # Сообщения за январь 2024
|
|
219
|
+
messages_2024-02.html # Сообщения за февраль 2024
|
|
220
|
+
photos/ # Скачанные фото
|
|
221
|
+
videos/ # Скачанные видео
|
|
222
|
+
files/ # Скачанные документы
|
|
223
|
+
folders/
|
|
224
|
+
Work/
|
|
225
|
+
...
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Тесты
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
uv run python -m pytest tests/ -v
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Лицензия
|
|
235
|
+
|
|
236
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "tg-export"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Flexible Telegram data export tool"
|
|
9
|
+
license = "MIT"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
readme = "README.md"
|
|
12
|
+
authors = [{name = "Vitaly Ostanin", email = "vitaly.ostanin@gmail.com"}]
|
|
13
|
+
dependencies = [
|
|
14
|
+
"telethon>=1.36",
|
|
15
|
+
"pyyaml>=6.0",
|
|
16
|
+
"aiosqlite>=0.20",
|
|
17
|
+
"jinja2>=3.1",
|
|
18
|
+
"click>=8.0",
|
|
19
|
+
"rich>=13.0",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[project.urls]
|
|
23
|
+
Homepage = "https://github.com/VitalyOstanin/tg-export"
|
|
24
|
+
Repository = "https://github.com/VitalyOstanin/tg-export"
|
|
25
|
+
Issues = "https://github.com/VitalyOstanin/tg-export/issues"
|
|
26
|
+
|
|
27
|
+
[project.optional-dependencies]
|
|
28
|
+
proxy = [
|
|
29
|
+
"python-socks[asyncio]>=2.0",
|
|
30
|
+
]
|
|
31
|
+
dev = [
|
|
32
|
+
"pytest>=8.0",
|
|
33
|
+
"pytest-asyncio>=0.23",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
[tool.pytest.ini_options]
|
|
37
|
+
asyncio_mode = "auto"
|
|
38
|
+
|
|
39
|
+
[tool.setuptools.packages.find]
|
|
40
|
+
include = ["tg_export*"]
|
|
41
|
+
|
|
42
|
+
[project.scripts]
|
|
43
|
+
tg-export = "tg_export.cli:main"
|