Eksport czatu na tekst: pięć platform, pięć niekompatybilnych pomysłów na to samo
Każda platforma komunikacyjna pozwala wyeksportować twoje dane i każda z nich niezależnie zdecydowała, jak rozmowa ma wyglądać na dysku. Treść pod spodem jest identyczna — kto co powiedział i kiedy — ale kształty nie mają ze sobą nic wspólnego. Jeden to tekstowy log, w którym format znacznika czasu zależy od ustawień regionalnych twojego telefonu. Drugi to drzewo węzłów kluczowanych identyfikatorem, gdzie rozmowa jest jedną ścieżką przez graf. Trzeci to katalog plików uporządkowany po kanałach i datach, a nazwy leżą zupełnie gdzie indziej.
Ta strona czyta je wszystkie i produkuje czytelną transkrypcję. Platforma ustalana jest po strukturze samego pliku, a nie po nazwie, więc możesz upuścić eksport, nie mówiąc, co masz. Wszystko działa w tej karcie przeglądarki.
Jak działa rozpoznawanie
Nazwy plików są tu bezużyteczne. Połowa tych platform nazywa swój eksport conversations.json, a pliki i tak są przemianowywane po drodze przez pocztę i chmurę. Rozpoznanie idzie więc po strukturze: tablica chat_messages obok pola sender, obiekt mapping w parze z create_time, pole ts trzymające uniksowy znacznik czasu jako łańcuch znaków. Każde z nich to odcisk palca, który produkuje tylko jedna platforma.
Jest jedna subtelność kolejności, która ma znaczenie. Eksport WhatsAppa z iPhone'a zaczyna się od [12/03/2024, 14:23:01] — od nawiasu kwadratowego, czyli tak samo, jak zaczyna się tablica JSON. Testowanie najpierw na JSON oddałoby każdy log z iPhone'a parserowi JSON-a i tam by się wywaliło. Wzorzec wiersza WhatsAppa sprawdzany jest więc przed testem nawiasu, a nie po nim.
Pięć kształtów
- WhatsApp zapisuje log w czystym tekście, jedna wiadomość na wiersz, z formatem znacznika czasu zmiennym zależnie od systemu i ustawień regionalnych. Wiadomości wielowierszowe ciągną się w gołych wierszach bez żadnego oznaczenia, więc parser musi traktować każdy wiersz bez znacznika czasu jako kontynuację poprzedniego.
- ChatGPT trzyma każdą rozmowę jako mapę węzłów. Każda przegenerowana odpowiedź i każdy zredagowany prompt zostają zachowane jako gałąź, więc odtworzenie tego, co naprawdę widziałeś, oznacza przejście od korzenia i podążanie na każdym kroku za ostatnim dzieckiem.
- Claude używa płaskiej tablicy, co jest najprostsze z całej piątki. Jedyna zmarszczka polega na tym, że nowsze eksporty umieszczają tekst wiadomości na liście typowanych bloków treści, a starsze używają zwykłego pola tekstowego — czytane są więc obie postacie.
- Slack to struktura katalogów: jeden katalog na kanał, jeden plik JSON na dzień plus osobny
users.jsonz mapą tożsamości. Wiadomości wskazują ludzi jakoU0123ABCD, więc bez tego pliku każda wiadomość przypisana jest kodowi. - Discord — eksporty, takie jakie produkuje popularne narzędzie społecznościowe, to jeden obiekt z metadanymi kanału i płaską tablicą wiadomości. Prosto i najbliżej tego, co zaprojektowałbyś, zaczynając od zera.
Co jest usuwane
Surowy eksport zawiera mnóstwo rzeczy, których nikt nie chce czytać. Ustawienia domyślne je wyrzucają, a przełączniki przywracają:
Komunikaty systemowe. Informacja o szyfrowaniu na początku każdego eksportu z WhatsAppa, wejścia i wyjścia z grupy, zmiany tematu, „ta wiadomość została usunięta”, slackowy podtyp channel_join. W grupie z rotacją potrafią przeważać nad prawdziwymi wiadomościami.
Zastępniki załączników. <Media omitted> pojawia się wszędzie tam, gdzie było zdjęcie albo wiadomość głosowa, a w czacie pełnym zdjęć to większość pliku. Mówi ci, że coś się wydarzyło, i nic o tym, co.
Ukryta hydraulika. Eksporty ChatGPT zawierają prompt systemowy i cały ruch narzędziowy, oznaczony jako ukryty w rozmowie. Nigdy ci ich nie pokazano i wylatują.
Archiwa też przechodzą
Slack i ChatGPT dostarczają pliki .zip, a nie luźny JSON, więc archiwum można upuścić wprost. Czytnik szuka najpierw conversations.json, bo gdy taki jest, to on jest całym eksportem. Jeśli go nie ma, traktuje archiwum jak workspace Slacka: wczytuje users.json przed wszystkim innym, żeby tożsamości się rozwiązały, potem przechodzi po plikach dziennych i zbiera je z powrotem w jedną transkrypcję na kanał, w kolejności dat. Pliki, których nie rozpoznaje, są pomijane, zamiast wywalać całe archiwum.
Dlaczego to działa w twojej przeglądarce
To jest ten rodzaj wejścia na tej stronie, przy którym liczy się to najbardziej. Eksport czatu nie jest dokumentem, który napisałeś dla publiczności — to lata prywatnych rozmów i zawiera to, co w nich padło. Adresy. Zdrowie. Pieniądze. Rzeczy o innych ludziach, którzy nigdy się na to nie zgodzili.
Wysłanie tego do usługi konwertującej oznacza zaufanie polityce retencji obcej firmy, jej kontroli dostępu, jej kopiom zapasowym i jej przyszłości. Parsowanie tutaj to JavaScript działający w tej karcie. Twój plik czyta przeglądarka, konwertuje go w pamięci i pokazuje tobie. Nie ma kroku wysyłki, więc nie ma czego przechowywać ani czego kasować. Zbudowane w ten sposób nic też nie kosztuje w utrzymaniu i działa offline, gdy strona raz się załaduje.
Strony dla poszczególnych platform
Jeśli wiesz, co masz, instrukcje eksportu dla danej platformy znajdziesz na dedykowanych stronach: WhatsApp, ChatGPT, Claude i Slack. Działa na nich ten sam parser, więc dla wyniku nie robi to żadnej różnicy.