跳到正文

导出聊天 ​

Telegram Desktop:打开聊天,点击右上角的 ⋯,选择导出聊天记录…,然后点击导出

Telegram ​

在 Telegram Desktop(macOS、Windows、Linux)中:打开聊天 → ⋯ → 导出聊天记录… → 导出。

  • 保持照片、视频、语音消息、贴纸和 GIF 的开启:角色会用到它们。
  • 两种格式都可以用:HTML(messages.html)和机器可读的 JSON(result.json)。
  • 把导出文件夹,或它的 .zip,拖到页面上。

WhatsApp ​

在手机上:打开聊天 → ⋮ → 更多 → 导出聊天(iPhone:点击联系人名称 → 导出聊天)→ 包含媒体。把 .zip 发送到你的电脑,然后拖到页面上。

不含媒体导出的聊天是一个 .txt 文件,这种也可以。

大型导出 ​

超过 10 万条消息、数 GB 的导出,操作方式相同:拖入文件夹即可。页面会显示当前进展:

  1. 正在读取文件夹… 统计文件数(浏览器列出数万个文件可能需要一点时间)。
  2. 聊天先行。 消息页面(或 result.json,或 WhatsApp 的 .txt)会先于媒体上传并读取。如果这个导出已经导入过,导入会在这里结束并打开它,不会上传任何媒体。如果媒体放不进磁盘,会在发送大文件之前告诉你还需要多少空间。
  3. 正在上传 1.2 GB / 3.4 GB(35%)· 30,905 个文件中的 9,000 个:媒体会分成小批次,逐个上传。浏览器从不会创建一个巨大的请求,中断的批次会单独重试。在你自己的电脑上运行时没有大小限制。
  4. 正在读取消息:第 37 页 / 共 121 页 · 36,000 条消息:所有页面并行读取一次。
  5. 正在检查媒体和正在移动媒体:文件会计算哈希以查找重复项,然后移动(而不是复制两次)到数据文件夹中。
  6. 正在保存,然后打开新建聊天对话框。

同一时间只运行一个导入;错误会保留在拖放区域中可见,你可以重新选择文件夹。

在桌面应用中,不会发生这种上传:应用直接从文件所在的位置读取文件夹、.zip 或 .txt(第 4 至 6 步)。这样更快,也不受下面浏览器问题的影响。

无法上传文件时(浏览器)

浏览器无法再读取的文件(已移动、已更改,或未下载的 iCloud/OneDrive 占位符)会被发现并跳过,那些一直导致其所在批次失败的单个文件也是如此:批次会被拆分,直到该文件被隔离。被跳过的媒体在聊天中显示为缺失;导入之后的消息会指出其中一个,浏览器控制台会列出全部。当聊天文件本身无法发送时,导入会停止并指出该文件。错误信息会显示服务器收到了多少内容,例如 服务器收到 4,096 字节中的 1,200 字节,这样就能轻松区分是连接问题还是浏览器问题。

导入期间,没有任何内容会离开你的电脑,也不会调用任何模型。只有当你在媒体库中点击描述时,媒体才会被描述。

使用 rooftop --import <文件夹> 时,文件夹会就地读取,其中的文件会被复制而不是移动;进度会记录在日志中。对于同一台电脑上的超大导出,这是最快的方式:没有上传,也没有临时文件夹中的第二份副本。

能识别的内容 ​

来源文件
Telegram HTMLmessages.html、messages2.html、…
Telegram JSONresult.json(当文件夹中没有 messages.html 时使用)
WhatsAppWhatsApp Chat with <名称>.txt(Android)或 _chat.txt(iOS),位于文件夹中、.zip 中或单独存在
  • Telegram:带换行的文本、链接、引用和代码;回复和部分引用;转发;编辑;服务消息;表情回应;链接预览;照片、视频、圆形视频、语音消息、音频、文件、贴纸(.webp、.webm、.tgs)、GIF、位置、联系人、投票和通话。
  • WhatsApp:Android 和 iOS 格式、12 小时制和 24 小时制时钟,以及两种日/月顺序,按文件检测。多行消息、编辑和附件会被保留。已删除的消息和加密提示会被跳过,<Media omitted> 会被标记为不可用。

媒体文件会计算哈希,因此同一个贴纸发送五次,在媒体库中只算一项(stk_…、gif_…、pho_…)。

HTML 导出中的表情回应

HTML 导出不会说明是谁做出的回应。在一对一聊天中,回应会归于另一位参与者;当数量为 2 时,会同时归于双方。

基于 MIT 许可证发布。