Конвертер экспорта переписки в текст — WhatsApp, ChatGPT, Slack

Превратите экспорт из WhatsApp, ChatGPT, Claude, Slack или Discord в читаемую расшифровку. Формат определяется сам, и ничего не покидает ваш браузер.

Экспорт переписки в текст: пять платформ, пять несовместимых представлений об одном и том же

Любой мессенджер даёт выгрузить свои данные, и каждый из них самостоятельно решил, как разговор должен выглядеть на диске. Содержимое одно и то же — кто что сказал и когда, — но формы не имеют между собой ничего общего. Одна — текстовый лог, в котором формат даты зависит от региональных настроек телефона. Другая — дерево узлов с ключами-идентификаторами, где разговор является одним путём по графу. Третья — папка файлов, разложенных по каналам и датам, а имена участников лежат совсем в другом месте.

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

Как работает определение формата

Имена файлов тут бесполезны. Половина этих платформ называет свою выгрузку conversations.json, да и файлы всё равно переименовываются по пути через почту и облако. Поэтому определение читает структуру: массив chat_messages рядом с полем sender, объект mapping в паре с create_time, поле ts с Unix-временем в виде строки. Каждое из этого — отпечаток, который оставляет только одна платформа.

Есть одна тонкость с порядком проверок, и она важна. Выгрузка WhatsApp с iPhone начинается с [12/03/2024, 14:23:01] — с квадратной скобки, с которой начинается и JSON-массив. Проверяй мы сначала на JSON, каждый лог с iPhone уходил бы в JSON-парсер и падал бы там. Поэтому шаблон строки WhatsApp проверяется до скобки, а не после.

Пять форм

  • WhatsApp пишет обычный текстовый лог, по сообщению на строку, с форматом времени, который зависит от платформы и региона. Многострочные сообщения продолжаются голыми строками без всякой пометки, так что парсер обязан считать любую строку без метки времени продолжением предыдущей.
  • ChatGPT хранит каждый разговор картой узлов. Каждый перегенерированный ответ и каждый отредактированный запрос сохраняются как ветка, поэтому восстановить то, что вы на самом деле видели, — значит идти от корня и на каждом шаге брать последнего потомка.
  • Claude использует плоский массив — самый простой из пяти. Единственная морщинка в том, что в новых выгрузках текст сообщения лежит в списке типизированных блоков содержимого, а в старых — в обычном строковом поле, поэтому читаются оба.
  • Slack — это структура каталогов: по папке на канал, по JSON-файлу на день плюс отдельный users.json с картой личностей. Сообщения ссылаются на людей как на U0123ABCD, так что без этого файла каждое сообщение подписано кодом.
  • Discord в том виде, в котором его отдают распространённые сторонние инструменты, — один объект с метаданными канала и плоским массивом сообщений. Прямолинейно и ближе всего к тому, что вы спроектировали бы сами с чистого листа.

Что вычищается

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

Системные уведомления. Сообщение про шифрование в начале каждой выгрузки WhatsApp, входы и выходы из группы, смены темы, «это сообщение было удалено», подтип channel_join у Slack. В группе с текучкой их бывает больше, чем настоящих сообщений.

Заглушки вложений. <Media omitted> стоит там, где была картинка или голосовое, и в переписке с обилием фотографий это большая часть файла. Строка сообщает, что что-то было, и ничего — о том, что именно.

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

Архивы тоже читаются

Slack и ChatGPT отдают .zip, а не отдельный JSON, поэтому архив можно бросить сюда целиком. Читалка сначала ищет conversations.json: если он есть, он и есть вся выгрузка. Если нет — архив считается рабочим пространством Slack: сначала загружается users.json, чтобы имена разрешались, потом обходятся дневные файлы и собираются обратно в одну расшифровку на канал в хронологическом порядке. Нераспознанные файлы пропускаются, а не роняют весь архив.

Почему это работает в вашем браузере

Здесь это важно как нигде на сайте. Экспорт переписки — не документ, который вы писали для читателя: это годы частных разговоров со всем, что в них было сказано. Адреса. Здоровье. Деньги. Вещи про других людей, которые ни на что подобное не соглашались.

Загрузить такое в сервис конвертации — значит довериться чужой политике хранения, чужим правам доступа, чужим бэкапам и чужому будущему. Разбор здесь — это JavaScript в этой вкладке. Ваш файл читает браузер, конвертирует в памяти и показывает вам. Шага загрузки нет, поэтому нечего хранить и нечего удалять. Побочный эффект такого устройства: работать это ничего не стоит и продолжает работать без сети, когда страница уже загружена.

Страницы под конкретные платформы

Если вы знаете, что у вас на руках, на отдельных страницах есть инструкции по выгрузке для конкретной платформы: WhatsApp, ChatGPT, Claude и Slack. Парсер там тот же самый, так что на результат это не влияет.