تحويل نسخ المحادثات إلى نص: خمس منصّات وخمس أفكار متنافرة عن الشيء نفسه
كل منصّة مراسلة تتيح لك تصدير بياناتك، وكل واحدة منها قرّرت وحدها كيف ينبغي أن تُمثَّل المحادثة على القرص. المحتوى الأساسي واحد — من قال ماذا ومتى — لكن الأشكال لا تجمعها جامعة. واحد سجلّ نصّي تعتمد صيغة طوابعه الزمنية على إعدادات منطقة هاتفك. وواحد شجرة عُقد مفهرسة بمعرّفات تكون المحادثة فيها مسارًا واحدًا عبر الرسم البياني. وواحد مجلد ملفات منظّم بالقناة والتاريخ، والأسماء مخزّنة في مكان آخر تمامًا.
تقرأ هذه الصفحة هذه كلها وتنتج نصًّا مقروءًا. وتُستنتج المنصّة من بنية الملف نفسه لا من اسمه، فيمكنك إفلات نسخة التصدير دون أن تخبرها بما لديك. وكل شيء يجري في تبويب المتصفح هذا.
كيف يعمل اكتشاف الصيغة
أسماء الملفات لا تنفع هنا. فنصف هذه المنصّات تسمّي تصديرها 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. وكلها تشغّل المحلّل نفسه، فلا فرق في النتيجة.