如何signal-desktop
导出消息?
我想备份我的信件。
有可能吗?
答案1
对的,这是可能的。
只需将其保存在文件中<yourFilename>
:
sigBase="${HOME}/.config/Signal/";
key=$( /usr/bin/jq -r '."key"' ${sigBase}config.json );
db="${HOME}/.config/Signal/sql/db.sqlite";
clearTextMsgs="${sigBase}clearTextMsgs.csv";
/usr/bin/sqlcipher -list -noheader "$db" "PRAGMA key = \"x'"$key"'\";select json from messages;" > "$clearTextMsgs";
并通过 调用它bash <yourFilename>
。或者使其可执行chmod 700 <yourFilename>
并直接调用它:./<yourFilename>
该脚本使用sqlcipher
和jq
signal-desktop 的数据库密钥来打开、解密所有消息并将其提取JSON
到clearTextMsgs.csv
signal-desktop 文件夹中~/.config/Signal
。
jq
除了通过(from )过滤 JSON 来提取密钥之外~/.config/Signal/config.json
,关键的部分发生在这里:
sqlcipher -list -noheader <DB> <SQL>
其中<SQL>
包含PRAGMA key
定义和实际的 SQL 语句 ( SELECT json FROM messages;
)。
然后,人们可以用来jq
访问消息备份中的任何键/值。
您必须安装sqlcipher
并jq
为此:
sudo apt install sqlcipher jq
笔记:
虽然这确实提取了所有消息,但我们需要指定all
signal-desktop 中的“”具有“”的含义all messages actually loaded
。因此,为了提取每一条消息,活动联系人的滑块必须向上滑动,然后信号桌面将加载以前不可用的消息(泡沫冲洗重复直到满意为止)。尽可能早地加载您希望加载的消息。这很快就会变得乏味。请记住对所有联系人的历史记录执行此操作。
话虽如此,备份消息历史记录在技术上是可行的,但实际上这是一项手动工作。解决这个问题的方法可能是使用 cron 作业来备份所有最近的消息,也许每天一次。那么这可能包含重复项,并且在信号桌面重新启动时可能会丢失消息。
无论如何,如果要偶尔以编程方式搜索(不太远——阅读:可能是几个月)历史记录,则此方法可以正常工作。
答案2
西格托普为我工作,并且有导出格式的选项。
答案3
基本上作为Gen.Stack 已回复, 但更多针对 Debian 的制定说明。
我还删除了一些不必要的复杂性。例如:jq '."key"'
也可以写成,因为jq .key
这些字符都不是动态的,因此永远不需要用两层引号进行转义。像这样的变量"$HOME"
仍然被引用,因为它们可能包含需要引用的字符。
- 您需要从源代码编译 sqlcipher,至少从 2022 年开始,即使 sid 中的版本也不够新rubo77 的评论
- 安装依赖项:
apt install build-essential libssl-dev tcl libsqlite3-dev
不确定是否需要 libsqlite3-dev,但我安装它作为调试内容的一部分。
如果您缺少依赖项但./configure
运行正确并且您尝试这样做make
,则后续构建将失败,直到您手动删除sqlite3.h
,请参阅https://github.com/sqlcipher/sqlcipher/issues/157 - 下载代码:
git clone https://github.com/sqlcipher/sqlcipher.git
cd sqlcipher
- 配置动态链接,然后编译:
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make
- 安装依赖项:
- 安装
jq
以提取数据库加密密钥:
apt install jq
- 为了方便设置环境变量:
db="$HOME/.config/Signal/sql/db.sqlite"
key="$(jq -r .key "$HOME/.config/Signal/config.json")
” - 导出消息。请注意,我
./sqlcipher
在下面使用。如果不再在编译目录中,则应该指定路径,例如:~/Downloads/sqlcipher/sqlcipher -list ...
。- 出口只是你的
messages
桌子:
./sqlcipher -list -noheader "$db" "PRAGMA key = \"x'"$key"'\";select json from messages;" > Signal_messages.jsonl
- 出口整个数据库使用
.dump
命令:
echo -e 'PRAGMA key = "x'\'"$key"\''";\n.dump\n' | ./sqlcipher -list -noheader "$db" > Signal_database.sql
- 只是浏览数据库:
$ echo "$key" SECRETSECRET $ ./sqlcipher -list -noheader "$db" sqlite> PRAGMA key = "x'SECRETSECRET'"; ok sqlite> .tables attachment_downloads messages_fts_config sessions badgeImageFiles messages_fts_content signedPreKeys ...
.tables
,很可能是您输入了错误的密钥或输入了错误的内容或选择了错误的文件(或者,在极少数情况下,该文件可能已损坏) )。 - 出口只是你的
瞧,这不是很容易吗?当您可以执行上述操作时,为什么 Signal 还要添加备份功能!
答案4
找到加密的 db.sqlite 数据库(解密密钥位于 config.json 文件中)。根据您的操作系统以及 Signal 的安装方式,您可能会在以下位置之一找到这些文件:
Linux:
~/.config/Signal/
~/.var/app/org.signal.Signal/config/Signal
视窗:
%AppData%\Signal\config.json
苹果系统:
~/Library/Application Support/Signal
你想要做的是执行这个 SQL 查询:
SELECT M.sent_at, M.source, C.name, M.type, M.body
FROM messages AS M
JOIN conversations AS C
ON M.conversationId = C.id
ORDER BY M.sent_at;
它以合理的格式返回所有消息:
时间戳;电话号码;对话名称;传入/传出;留言内容
如果你想要 GUI,你可以使用sqlite浏览器。
打开 sqlitebrowser,单击“打开”,选择“原始密钥”,输入带有前导的密钥0x
(如屏幕截图所示),选择SQLCipher 4 defaults
,单击“确定”:
转到Execute SQL
选项卡并粘贴上述查询,然后单击蓝色三角形播放按钮来执行查询: