跳转到主要内容

易于使用的离线聊天存档

项目描述

Python程序 聊天存档 提供一个本地聊天消息存档,可在命令行中查看和搜索。支持的聊天服务包括 Google TalkGoogle HangoutsSlackTelegram。该程序在Linux上开发,目前假设UNIX命令行环境,尽管这不是程序设计的基本要求(例如,我可以想象有人使用Python API构建GUI或Web界面)。

当你添加新账户时,初始同步将从相关的聊天服务下载你的完整对话历史,这可能需要一些时间。后续同步运行将更快,因为只下载更新(新消息和对话)。

聊天消息以纯文本形式下载,并在可能的情况下也以格式化形式下载(编码为HTML)。在终端查看聊天消息时,将显示格式化文本。

由于某些后端异步性质,需要Python 3.5+。

状态

这是一个非常年轻的软件,在2018年夏季的几轮冲刺中开发出来的,所以肯定会有很多错误!它没有测试套件也是一个不利因素。然而,自从创建这个程序以来,我已经开始每天使用它,所以我可能是第一个遇到大多数(如果不是全部)错误的人 😇。

代码库中有许多我不太满意的具体实现细节,还有很多我想添加的功能,例如,目前命令行仍然非常基础(最小化)。然而,我决定仍然发布现在的版本,因为在这个状态下,这个项目对我已经非常有用了,也许对其他人也有用。

我认为第一个发布版本代表了我开始构建这个项目时心中的功能目标,但我非常希望有更多时间重构代码库一两次 😋。在发布第一个版本之前,我已经进行了三次或四次完整的重写,每次重写都提高了代码质量,但我仍然不完全满意……哦,至少它看起来似乎可以工作 😉。

安装

chat-archive 包可以在 PyPI 上找到,这意味着安装应该像这样简单

$ pip3 install chat-archive

确保您使用的是 Python 3.5+,因为这是 chat-archive 程序的依赖项所要求的。

实际上有无数种安装 Python 软件包的方法(例如,针对用户站点包目录虚拟环境 或仅全局安装)并且我没有意图在这里进行讨论,所以如果您感到害怕,请在返回这些说明之前了解您的选择 😉。

用法

以下是对命令行界面的说明。有关 Python API 的更多详细信息,请参阅在 Read the Docs 上可用的 API 文档。

命令行

用法: chat-archive [选项] [命令]

易于使用的离线聊天存档,可以收集来自 Google Talk、Google Hangouts、Slack 和 Telegram 的聊天消息历史记录。

支持的命令

  • “sync” 命令从受支持的聊天服务下载新的聊天消息,并将它们存储在本地存档(SQLite数据库)中。

  • “search” 命令在本地存档中搜索给定的关键字(词)并列出匹配的消息。

  • “list” 命令列出本地存档中的所有消息。

  • “stats” 命令显示本地存档的统计数据。

  • “unknown” 命令搜索包含未知发件人消息的对话,并允许您输入与所有未知发件人消息关联的新联系人名称。不支持涉及多个未知发件人的对话。

支持的选项

选项

描述

-C--context=COUNT

在“chat-archive search”期间打印 COUNT 条输出上下文消息。这与“grep -C”类似。默认值 COUNT 为 3。

-f--force

重试之前遇到错误的对话同步。此选项目前仅适用于 Google Hangouts 后端,因为我一直在同步几个特定对话时遇到服务器错误,我不想在每次同步运行时都看到这些错误 :-)

-c--color=CHOICE, --colour=CHOICE

根据 CHOICE 的值,指定是否使用 ANSI 转义序列来指定文本和背景颜色以及文本样式。

  • 值 'always'、'true'、'yes' 和 '1' 启用颜色。

  • 值 'never'、'false'、'no' 和 '0' 禁用颜色。

  • 当值为 'auto'(这是默认值)时,只有在检测到交互式终端时才会启用颜色。

-l--log-file=LOGFILE

将 DEBUG 级别的日志保存到由 LOGFILE 指定的文件名中。此选项被添加以方便捕获将下载数千条消息的初始同步的日志输出。

-p--profile=FILENAME

启用聊天存档应用的性能分析,以便分析性能问题。每次数据库更改提交时,Python 性能分析数据将保存到 FILENAME 中(这使得可以在程序仍在运行时检查性能分析)。

-v--verbose

增加日志详细程度(可重复)。

-q--quiet

减少日志详细程度(可重复)。

-h--help

显示此信息并退出。

‘sync’命令

命令 chat-archive sync 使用配置的后端下载新的聊天消息,并将消息存储在本地 SQLite 数据库中。可以使用位置参数来同步特定的后端或账户。例如,我有两个 Telegram 账户,一个是个人账户,一个是工作账户。以下命令将同步这两个账户:

$ chat-archive sync telegram

如果我只对特定账户感兴趣,我可以这样做:

$ chat-archive sync telegram:personal

你可以将其变得尽可能复杂。

$ chat-archive sync hangouts slack:work telegram:personal

上面的命令将同步所有配置的 Google Hangouts 账户、Slack 工作账户和 Telegram 个人账户。以下表格显示了您可以这样使用的后端名称:

后端名称

聊天服务

gtalk

Google Talk

hangouts

Google Hangouts

slack

Slack

telegram

Telegram

‘search’命令

命令 chat-archive search 在本地 SQLite 数据库中的聊天消息中执行关键字搜索,并在终端上渲染搜索结果。关键字作为 search 命令的位置参数提供,并触发对以下消息元数据的非大小写 AND 搜索:

  • 后端名称(见上表)。

  • 账户名称(默认或用户定义的名称)。

  • 对话名称(对群组对话相关)。

  • 发送消息的联系人的全名。

  • 发送消息的联系人的电子邮件地址。

  • 消息的时间戳。根据我迄今为止尝试的日期/时间搜索,任何日期格式 YYYY-MM-DD HH:MM:SS 的前缀都应该有效。例如,关键字 2018 将匹配该年的所有消息,2018-08 将匹配特定月份的所有消息等。

  • 消息文本。搜索纯文本聊天消息以及(如有)HTML 格式的聊天消息,这允许搜索具有语义意义的 HTML 数据,如超链接目标。

终端上报告的搜索结果包括匹配对话的周围聊天消息,以提供额外的上下文。您可以使用 -C--context 命令行选项来控制要渲染的周围聊天消息数量,值 0 可以用于省略上下文。

‘list’命令

命令 chat-archive list 在终端上显示数据库中所有聊天消息的列表。

由于需要收集上下文,chat-archive search 命令可能会相当慢,这就是为什么我在项目早期就添加了 chat-archive list 命令(它更快,因为它不需要收集上下文)。从那时起,我收集了 226.941 条聊天消息,完全抵消了 chat-archive list 命令的有用性 😇。

无论如何,这可以被认为是一种非常简单的导出功能的形式,所以我决定暂时保留 chat-archive list 命令,尽管一旦开始使用 chat-archive 程序,它的有用性就会受到限制。

‘stats’命令

命令 chat-archive stats 报告有关本地 SQLite 数据库内容的统计信息。以下是我在撰写本文时的样子

Statistics about ~/.local/share/chat-archive/database.sqlite3:

 - Number of contacts: 284
 - Number of conversations: 5803
 - Number of messages: 226941
 - Database file size: 90.81 MB
 - Size of 226941 plain text chat messages: 18.7 MB
 - Size of 13409 HTML formatted chat messages: 4.25 MB

‘unknown’命令

第一次同步我 Google Hangouts 账户中的数千条聊天消息时,我非常失望地发现,所有关于后来被删除账户的联系人元数据都丢失了(没有名字,没有电子邮件地址,什么都没有)。

这就是为什么我添加了 chat-archive unknown 命令。它搜索本地数据库中包含来自未知发送者消息的私密对话,并提示您输入联系人的名字。当您输入(非空)名字时,将创建一个新的联系人,并将没有发送者的对话中的消息关联到新的联系人。

奇怪的是,Google Mail 的聊天消息存档能够显示大多数 Google Hangouts API 已经不再报告任何有用信息的联系人的名字,这就是我能够(手动)重建这部分历史的方式。

如果 Google Mail 存档没有提供给我这些信息,我仍然能够仅通过以下事实重建 90% 这些对话的发送者:相当多的对话以“Hi $name”开头,并且我仍然有 2011-2015 年的“客户端聊天存档备份”(Pidgin)。

配置文件

如果您打算频繁同步聊天消息历史,您可以使用配置文件定义您感兴趣使用的聊天服务的凭据。

配置文件是 Python 的 configparser 模块支持的 ini 语法 子集中的文本文件。它们可以位于以下位置

目录

主配置文件

模块化配置文件

/etc

/etc/chat-archive.ini

/etc/chat-archive.d/*.ini

~

~/.chat-archive.ini

~/.chat-archive.d/*.ini

~/.config

~/.config/chat-archive.ini

~/.config/chat-archive.d/*.ini

可用的配置文件按上述顺序加载,以便用户特定的配置文件覆盖全局配置文件。

特殊配置文件部分 chat-archive 定义了通用选项。目前只支持 operator-name 选项。所有其他部分都是特定于聊天账户的,并通过在两个值之间分隔来编码后端名称和账户名称。以下是基于我的配置的示例,显示了支持的选项

[chat-archive]
operator-name = ...

[hangouts:work]
email-address = ...
password = ...
# Alternatively:
password-name = ...

[slack:work]
api-token = ...
# Alternatively:
api-token-name = ...

[gtalk:work]
email = ...
password = ...
# Alternatively:
password-name = ...

[telegram:personal]
api-hash = ...
api-id = ...
phone-number = ...

[telegram:work]
api-hash = ...
api-id = ...
phone-number = ...
# Alternatively:
api-hash-name = ...
api-id-name = ...

当账户配置完成但配置未定义所需密钥时,每次运行 chat-archive 同步 命令时,您将被提示提供该密钥。

选项 api-token-namepassword-nameapi-hash-nameapi-id-name 的值用于识别在 ~/.password-store 中使用的密钥,这提供了一种介于以下两种极端之间的替代方案

  • 始终交互式地输入您的密钥(因为您不想将它们存储在 chat-archive 配置文件中,从安全角度考虑是可以理解的)。

  • 直接将您的密钥存储在 chat-archive 配置文件中(这样您就不必交互式地输入密钥),因此将它们暴露在您计算机上运行的所有软件中。

因为 pass 可以使用 gpg-agent,所以您只需输入一次主密码即可解锁同步任何数量聊天账户所需的密钥。

本地数据库

chat-archive 程序使用 SQLite 数据库存储它收集的聊天消息。由于整个程序的目的在于保护聊天消息的长期存档,因此使用了 SQLAlchemyAlembic 来支持数据库模式迁移。这是为了确保在没有数据丢失的情况下可靠地升级未来的增强功能。

我想到了一个显著的例外:目前 chat-archive 程序的当前版本不同步图像和其他多媒体文件,仅将文本消息存储在本地数据库中。如果稍后版本添加了对图像的支持(我并没有承诺这一点,但我正在考虑它),并且收集这些内容对您很重要,那么您可能需要在该支持添加时重建数据库。

您可以通过设置环境变量 $CHAT_ARCHIVE_DIRECTORY 来更改 SQLite 数据库和其他数据文件的存储位置。备份您的聊天存档就像将数据库文件 ~/.local/share/chat-archive/database.sqlite3 保存到另一个存储介质一样简单。请记住,此数据库可能包含大量敏感数据,所以我强烈建议您使用磁盘加密。

支持的聊天服务

以下是目前可用的后端

聊天服务

描述

Google Talk

曾经这是谷歌的主要聊天服务。它基于(至少与 XMPP 协作良好)。我的个人谷歌 Talk 消息存档截止到 2013-12-12。

Google Hangouts

Google Talk 的继任者。有趣的是,我的个人 Google Hangouts 消息存档始于 2013-10-30(对我来说有趣的是与上述日期的重叠)。

Slack

无论您喜欢还是讨厌,当您的所有同事都在使用它时,您真的无法避开它。实际上,当我这样写下来时,我不禁想起了 WhatsApp(“同伴压力”来自家人而不是同事)。

Telegram

来自俄罗斯的一个流行的 WhatsApp 替代品,没有 Facebook 的负担 😇(这并不是说背后的公司不能同样邪恶)。

未来可能会添加更多后端。

  • 我一直在考虑使用类似 Selenium 的工具抓取“WhatsApp Web”。这会变得很丑陋,产生的后端在最好的情况下也是脆弱的,但拥有这些消息可能值得……

  • 我正在考虑编写一个聊天日志解析器,用于解析Pidgin十年前(大约2008年)生成的HTML聊天日志,因为我有数兆这样的聊天日志存储在备份中 🙂。

历史

数字通信的碎片化性质,消息通过多个渠道(包括多个聊天服务)传达到你这里,已经困扰了我很多年。找回东西实际上可能成为一项挑战 😇。与此相关的是,意识到这些聊天服务来来去去,带着多年的聊天历史,永远消失。我就是在说你,谷歌 😉。

鉴于我既是职业也是内心都是一名程序员,已经有好几年时间渴望同时解决这两个问题,通过创建一个计算机程序,将多个聊天服务的聊天消息历史下载并存储到单个本地数据库中,便于搜索和备份。

虽然我最初的目标并不是“全保真度”的聊天历史备份,包括图片和其他多媒体,尽管我最终可能会决定实现它。我最初的目标是构建一个本地、可搜索的文本聊天消息数据库,这些消息来自多个聊天服务,并且很容易添加对新聊天服务的支持。

联系方式

最新版本的 chat-archive 可在 PyPIGitHub 上找到。文档托管在 Read the Docs 上,包括一个 变更日志。如有bug报告,请在 GitHub 上创建问题。如果您有任何疑问、建议等,请随时通过电子邮件发送给我,地址是 peter@peterodding.com

许可证

本软件遵循 MIT 许可证

© 2020 Peter Odding。

以下是依赖项的许可证简要概述

依赖项

许可证

Alembic

MIT 许可证

emoji

BSD 许可证

hangups

MIT 许可证

Slacker

Apache 软件许可证

SQLAlchemy

MIT 许可证

Telethon

MIT 许可证

在发布此项目之前不久,我开始担心我可能包含了一个GPL依赖项,如果理解正确的话,这将要求我将我的项目也以GPL发布,尽管我从2010年以来一直以MIT许可证发布我的开源项目。

在组装上述表格后,我可以自信地说情况并非如此 😇。上述表格中没有列出的依赖项都是我的项目,所有这些项目都遵循与 chat-archive 程序相同的MIT许可证(假设我保持更新,随着新依赖项的添加)。

项目详细信息


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分布

chat-archive-4.0.3.tar.gz (71.0 kB 查看哈希值)

上传时间 源代码

构建分布

chat_archive-4.0.3-py2.py3-none-any.whl (65.8 kB 查看哈希值)

上传于 Python 2 Python 3

由以下支持