ChatViewer — экспорт переписки, который снова читается

Экспорт переписки из мессенджера — это архив, а не документ: Telegram отдаёт result.json на десятки мегабайт, WhatsApp — текстовый файл, где каждая строка начинается с даты, а фотографии лежат рядом отдельной кучей. Прочитать это можно, но не глазами. ChatViewer разбирает обе выгрузки и показывает их так, как они выглядели в мессенджере.

Исходный код открыт: github.com/GhostCorpTech/chat-viewer — можно открыть и посмотреть своими глазами.

Как это выглядит

ChatViewer — Переписка из Telegram: сообщения сгруппированы по автору, дни разделены, стикеры и фото — прямо в ленте
Переписка из Telegram: сообщения сгруппированы по автору, дни разделены, стикеры и фото — прямо в ленте
ChatViewer — Импорт WhatsApp: пересланные сообщения помечены, фотография открывается там же, где пришла
Импорт WhatsApp: пересланные сообщения помечены, фотография открывается там же, где пришла
ChatViewer — Светлая тема: голосовое проигрывается в ленте, у пересланного виден исходный автор
Светлая тема: голосовое проигрывается в ленте, у пересланного виден исходный автор
ChatViewer — Групповой чат: отправители подписаны, «Указать мой ID» переносит ваши сообщения вправо
Групповой чат: отправители подписаны, «Указать мой ID» переносит ваши сообщения вправо
ChatViewer — Поиск по тексту внутри открытой переписки
Поиск по тексту внутри открытой переписки
ChatViewer — Встроенная инструкция: как выгрузить чат из Telegram и WhatsApp и что при этом важно
Встроенная инструкция: как выгрузить чат из Telegram и WhatsApp и что при этом важно

Что умеет продукт

  • Два формата: result.json из Telegram и .txt из WhatsApp, каждый импорт — отдельный чат в списке
  • Сообщения сгруппированы по автору, а дни разделены: «Сегодня», «Вчера» или дата
  • Фото, видео, кружки и голосовые открываются прямо в ленте, картинки — в лайтбоксе
  • Анимированные стикеры .tgs распаковываются и проигрываются как Lottie
  • Поиск по названию чата в списке и по тексту внутри открытой переписки
  • Светлая и тёмная темы, русский и английский интерфейс
  • Групповые чаты определяются сами, свои сообщения переносятся вправо по вашему from_id
  • Служебные сообщения о входах и выходах отфильтрованы, пересланные — помечены

Два формата, одна форма сообщения

Выгрузка Telegram — структурированный JSON: там известен тип каждого сообщения, кто его переслал, какой это стикер и сколько длится голосовое. Выгрузка WhatsApp — простой текст, где тип вложения приходится угадывать по расширению файла, а пересланное сообщение помечено словом «Forwarded» без указания автора.

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

Ничего не уходит наружу

Приложение не делает ни одного сетевого запроса. Нет аккаунта, нет сервера, нет телеметрии: разобранные сообщения лежат в SQLite-файле в профиле пользователя, медиа остаётся там, куда его положил мессенджер.

Это не позиция ради позиции, а требование задачи. Переписку выгружают, когда она нужна для чего-то серьёзного, и заливать её в чужое облако ради удобства просмотра — ровно то, чего делать нельзя.

Медиа читается с диска, а не копируется

Архив переписки за несколько лет — это гигабайты фотографий и видео. Приложение хранит пути к ним, а не сами файлы: импорт занимает секунды и не удваивает место на диске.

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

Группы, в которых непонятно, где вы

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

Поэтому в шапке чата есть «Указать мой ID»: вставляете свой from_id из result.json — и ваши реплики уезжают вправо, как в настоящем мессенджере. Одна кнопка вместо догадок алгоритма.

Своё приложение, а не веб-страница

Интерфейс собран на React, а разбор выгрузок, база и распаковка .tgs — на Rust; связывает их Tauri. Такой выбор даёт нативное окно и инсталлятор весом в единицы мегабайт вместо сотни, которую занял бы Electron.

Код открыт под MIT и лежит на GitHub: сборка установщика повторяется одной командой, а релизы собираются на GitHub Actions. Windows 10 и 11 — единственная платформа, для которой сделана упаковка; сам стек кроссплатформенный.

Как это устроено

  1. 1 Импорт Выбираете result.json из выгрузки Telegram или .txt из WhatsApp — остальное приложение находит само
  2. 2 Разбор Два парсера на Rust приводят разные форматы к одной форме: кто, кому, когда, что и какое вложение
  3. 3 Хранение Разобранные сообщения ложатся в локальную базу SQLite на вашем диске — не в облако
  4. 4 Медиа Фото, видео, кружки, голосовые и стикеры читаются прямо из папки выгрузки, а не копируются
  5. 5 Чтение Переписка открывается лентой: группировка по автору, разделители дней, поиск и лайтбокс

На чём собрано

TauriRustReactViteSQLiteLottie

Нужно похожее?

Расскажите, что у вас происходит сейчас. Разбор задачи и оценка — бесплатно и ни к чему не обязывают.