Привет, земляне! Возникла у меня тут на днях потребность выкачать текст из чата DeepSeek, копипастить было не вариант, так как чат насчитывал более 5 тысяч сообщений, зачем мне столько я рассказал в своем телеграмм канале, ссылка на него, и нет только в конце статьи, а пока читайте и не отвлекайтесь. Итак, я поиск решения привел меня к тому, что клиент позволяет скачать историю переписки в формате JSON, уже хоть что-то, осталось придумать как эти самые данные извлечь. И тут я ставлю развилку в повествовании: тем кому нужно просто извлечь полный текст из чата можете переходить сразу к ⭐Этому разделу, а я продолжу историю в хронологическом порядке.

Изучение истории переписки Deepseek

Скачал я архив с историей переписки и получил на руки файл с названием conversations.json весом почти 20 Мбайт. Дальше вопрос встал конкретный: "как разобрать содержимое и не сойти с ума?", поискал я визуализаторы для файлов JSON и остановился на JSON Craсk, аддоне для VS Code. Я его установил и попытался открыть файл с историй и он мне выдает: "Мистер Балакирев, у вас там больше 56 тысяч нод получается, немного многовато, давай только не больше 1500". Ну, что поделать, завел новый аккаунт, создал там несколько чатов и прогнал нейросеть в разных сценариях, с использование размышлений, поиска в интернете, но заранее предупреждаю, что использование прикрепленных файлов не рассматривал. Короче, тесты прогнал, скачал дамп и открыл его в VS Code и вот уже JSON Crack перестал ломаться, полученную картину показывать не буду, ибо в этом нет никакого смысла, но организация данных меня приятно удивила, в ней все минималистично и интуитивно понятно, а глубина вложенности насчитывает всего 7 уровней. Немного позднее решил заглянуть в дамп Claude так там помимо того, что он предлагает сначала скачать JSON файл с набором ссылок для скачивания, так еще в структуре переписки сам черт ногу сломит, но речь сейчас не об этом.

Разбираем структуру историю переписки

Кто-то мне может возразить: "зачем разбирать самому, если можно использовать документацию"? Только официальной документации нет или я ее не нашел, и я по своей натуре люблю разбирать все на практике и пусть данная статья будет неофициальной документацией.

Лишний раз напомню, что при подготовке тестовой истории я игнорировал использование прикрепленных файлов, поэтому не удивляйтесь, что можете их там не обнаружить. Если нужно разобрать вложения и пропатчить утилиту, о которой будет рассказано далее, то дайте знать об этом в комментариях.

Уровень 1. Список чатов
На первом уровне у нас список всех выгруженных чатов, каждый чат представляет из себя JSON-объект

[<объект чата 1>, <объект чата 2>,...<объект чата N>]

Уровень 2. Объект чата
$[<индекс чата>]
Каждый чат представляет из себя JSON-объект со следующей структурой:

{ 
  "id": "52a576dd-6f3d-4589-91a7-3b9b8d156a8d",  
  "title": "тут исследовать внимательно",  
  "inserted_at": "2026-08-09T10:31:20.766000+08:00",  
  "updated_at": "2026-08-09T11:05:13.415000+08:00",  
  "mapping": <объект с сообщениями>
}

Описание полей:

  • id — id чата

  • title — фактический заголовок чата, которое присвоено автоматически или измененное пользователем

  • inserted_at — дата создания чата в формате ISO 8601

  • updated_at — дата обновления чата в формате ISO 8601

  • mapping — объект с сообщениями

Уровень 3. Объект с сообщениями
$[<индекс чата>]["mapping"]
Каждый объект с сообщениями имеет следующую структуру:

{  
  "root": <объект сообщения (root)>,  
  "1": <объект сообщения (1)>,  
  "2": <объект сообщения (2)>,  
  "3": <объект сообщения (3)>,  
  ...  
  "N": <объект сообщения (N)>,
}

Каждое поле здесь представляет из себя id сообщения
Описания полей:

  • root - стартовое сообщение, указывает на начало чата, содержит себе указатели на дочерние объекты сообщений, так как чат имеет нелинейную, а древовидную структуру каждое сообщение хранит указатели на родительский объект и на дочерние

  • N - прочие объекты сообщений имеют целочисленный индекс в виде строки, как показала практика: нумерация сообщений не последовательная и может прерываться, к примеру, после 100го сообщения может идти 125е сообщение и так далее.

Уровень 4. Объект сообщения
$[<индекс чата>]["mapping"][<id сообщения>]
Структура:

{  
  "id": "1",  
  "parent": "root",  
  "children: [2, 3],  
  "message": <объект с деталями сообщения>
}

Описания полей:

  • id — id сообщения (представлен в виде строки)

  • parent — id родительского сообщения (представлен в виде строки)

  • children — список id дочерних сообщений (представлены в виде целых чисел)

  • message — объект с деталями сообщения

Уровень 5. Объект с деталями сообщения
$[<индекс чата>]["mapping"][<id сообщения>]["message"]
Структура:

{  
  "model": "deepseek-chat",  
  "inserted_at": "2026-08-09T11:03:48.278000+08:00",  
  "fragments": <список фрагментов сообщения>
}

Описания полей:

  • model — имя задействованной модели нейросети, может иметь значения:

    • "deepseek-reasoner"

    • "deepseek-chat"

  • inserted_at — дата добавления сообщения в формате ISO 8601

  • fragments — список фрагментов с контентом сообщения

Уровень 6. Фрагменты сообщения
$[<индекс чата>]["mapping"][<id сообщения>]["message"][<индекс фрагмента>]
Структура:

{  
  "type": "REQUEST",  
  "content": "Привет"
}

Либо, если фрагмент содержит результаты поиска, то он имеет следующую структуру:

{  
  "type": "SEARCH",  
  "results": <спискок объектов с результатами поиска в интернете>
}

Описания полей:

  • type — тип фрагмента, может иметь варианты

    • "REQUEST" - запрос пользователя

    • "SEARCH" или "TOOL_SEARCH" - результаты поиска в интернете

    • "RESPONSE" - ответ нейросети на запрос

    • "THINK" - "размышление" нейросети

    • "TOOL_OPEN" - не несет полезной информации

  • content — текстовое содержимое фрагмента

  • results — <список объектов с результатами поиска в интернете>

Уровень 7. Результаты поиска в интернете
$[<индекс чата>]["mapping"][<id сообщения>]["message"][<индекс фрагмента>][results][<индекс результата поиска>]
Структура:

{  
  "url": "https://old.scientificrussia.ru/articles/polnogenomnoe-issledovanie-opredelilo-sushchestvovanie-shesti-vidov-zhivyh-tigrov",  
  "title": "Полногеномное исследование определило существование шести видов живых тигров"
}

Описания полей:

  • url — url-адрес веб-страницы

  • title — заголовок веб-страницы

Вот вы и познакомились со структурой переписки, дальше я представлю инструмент для комфортного извлечения текста чата.

DeepseekExtractor нам поможет

Те, кто читает мой Telegram-канал уже знают о DeepseekExtractor, так что подписаться на него полезно. А для новеньких поясню: это плагин для моего программного комплекса Pyrog. Функционал утилиты имеет только самое необходимое:

  • она позволяет извлечь из истории переписки ветку сообщений, выбрать для нее представление в форматах: Обычный текст без форматирования, Markdown или HTML, затем сохранить результат в файл или копировать в буфер обмена;

  • программа подсчитает количество токенов, слов и символов в общем и для запросов и ответов в частности;

  • можно "осушить" историю, выбрав только нужные чаты, а затем сохранить их в нативном формате;

  • есть возможность нарезать ветку на фрагменты с фиксированным количеством сообщений;

  • продвинутые представители человечества могут разработать собственные представления для отображения сообщений, для таких я приготовил Расширенное руководство.

Для использования надо пройти несложную процедуру по установке:

  1. Скачайте и установите Python версией не ниже 3.13;

  2. Скачайте файлы Pyrog и скопируйте их на свой компьютер (страница загрузки, руководство по использованию);

  3. Скачайте файлы плагина DeepseekExtractor (страница загрузки, руководство по использованию));

  4. Распакуйте файлы плагина в папку …/Pyrog/manager/plugins/DeepseekExtractor

  5. Запустите скрипт …Pyrog\manager\Pyrog.pyw и дайте согласие на установку PySide6 Да, я знаю, процесс установки не удобный, но я планирую в скором времени сделать инсталлятор или лаунчер, чтобы он делал всю скучную работу, но и без того надеюсь, что трудностей не возникло. Нет? Тогда погнали пользоваться!

Для того чтобы извлечь нужные данные для начала необходимо экспортировать историю переписки. Для этого войдите в ваш аккаунт на сайте chat.deepseek.com и в левом нижнем углу веб-клиента рядом с именем пользователя нажмите на три точки, далее SettingsDataExport, затем нужно будет подождать некоторое время, пока не подготовятся данные, затем нажать Download, начнется скачивание zip архива.

Качаем бэкап
Качаем бэкап

После скачивания распакуйте файлы из архива. Теперь, все готово к работе - переходим к утилите DeepseekExtractor.

Интерфейс утилиты
Интерфейс утилиты

Нажмите на Загрузить данные (1), появится диалоговое окно выбора файла, затем выберите файл с данными, обычно это conversations.json. Затем в выпадающем списке (2) выберите нужный чат. Нажмите на кнопку Выбрать последнее сообщение (3), появится диалоговое окно, где представлены все сообщения в чате, выберите последнее сообщение в нужной ветке, которую нужно извлечь.

Выбор последнего сообщений в ветке
Выбор последнего сообщений в ветке

Чат Deepseek может имеет разветвленную структуру сообщений, когда вы изменяете запрос или перезапускаете генерацию ответа - создается отдельная ветка, поэтому чтобы извлечь нужную ветку необходимо выбрать последнее сообщение, начиная с которого вверх по цепочке будет произведено извлечение сообщений до самого первого.

Затем, из выпадающего списка (4) выберите представление для выбранной ветки сообщений. Всего есть три вида представлений, он указывается в круглых скобках после имени представления. Тип представления влияет на отображение текста в поле вывода ветки сообщений, на выбор 4 типа:

  • обычный текст - текстовые данные выводятся в их оригинальном виде;

  • markdown - при отображении учитывается специальный синтаксис markdown;

  • HTML - язык разметка гипертекста версии 4;

  • HTML5 - язык разметка гипертекста версии 5; Тип выбранного представления определяет формат, в котором сохраняется ветка сообщений на диске. Список представлений можно расширить, для этого необходимо иметь навыки программирования на Python, подробности описаны в Расширенном руководстве.

Сохранение данных

Чтобы произвести сохранение нажмите на кнопку с изображением гаечного ключа (7), появится список доступных операций:

  • Сохранить ветку сообщений в буфер обмена - копирует исходный текст ветку сообщений в буфер обмена, синтаксис markdown и HTML будет преобразован в текст.

  • Выбрать и экспортировать чаты - позволяет выбрать и сохранить чаты в нативном формате DeepSeek (JSON).

  • Сохранить ветку сообщений как - сохраняет текст ветки сообщений в формате, соответствующем выбранному типу представления.

Нарезка ветки сообщений

Эта специфичная функция добавлена в рамках моих экспериментов с клиентом. Задача была в том, чтобы загрузить объемный текст в контекст нейросети, как оказалось есть ограничения на размер запроса, а вот если это делать частями, то никаких проблем в этом нет, все ограничивается лишь общим контекстным окном.
Чтобы воспользоваться данной функцией перейдите на вкладку Нарезка.

Экран нарезки сообщений
Экран нарезки сообщений

«Нарезка» производится по количеству сообщений, в поле Сообщений на фрагмент укажите количество сообщений, которое попадет в один фрагмент и нажмите на кнопку Обновить. Заметьте, что операция работает только с представлениями типа Обычный текст. Затем нажмите на кнопку Копировать, чтобы скопировать текст фрагмента в буфер обмена, после чего поле с текстом фрагмента будет выделено зеленым цветом, повторное нажатие снимает выделение.

На этом руководство подошло к концу, для дополнительной информации обратитесь к Расширенному руководству. Спасибо, что используете Pyrog и DeepseekExtractor.

Ссылки

🏠Страничка проекта (скачать бесплатно)
🔌Другие плагины для Pyrog
🛟Пользовательское руководство по DeepseekExtractor
🛟Расширенное руководство по DeepseekExtractor
📂Git репозиторий проекта
💾Скачать Pyrog
Больше в Telegram-канале
📧Почтовый ящик для отзывов и предложений
👑Поддержать автора