Привет, земляне! Возникла у меня тут на днях потребность выкачать текст из чата 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 и в левом нижнем углу веб‑клиента рядом с именем пользователя нажмите на три точки, далее Settings → Data → Export, затем нужно будет подождать некоторое время, пока не подготовятся данные, затем нажать 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.

Ссылки