Gen.Stack Asked: 2019-03-08 13:18:08 +0800 CST2019-03-08 13:18:08 +0800 CST 2019-03-08 13:18:08 +0800 CST Signal-Desktop:如何导出消息? 772 如何signal-desktop导出消息? 我想备份我的信件。 有可能吗? backup signal-messenger 4 个回答 Voted Best Answer Gen.Stack 2019-03-08T13:18:42+08:002019-03-08T13:18:42+08:00 对的,这是可能的。 只需将其保存在文件中<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和jqsignal-desktop 的数据库密钥来打开、解密和提取所有JSON格式的消息到clearTextMsgs.csv您的 signal-desktop 文件夹~/.config/Signal中。 除了通过使用jq(from ~/.config/Signal/config.json) 过滤 JSON 来提取密钥之外,关键的一点发生在这里: sqlcipher -list -noheader <DB> <SQL> 其中<SQL>包含PRAGMA key定义和实际的 SQL 语句 ( SELECT json FROM messages;)。 然后可以使用jq从消息备份中访问任何键/值。 您必须安装sqlcipher并jq为此: sudo apt install sqlcipher jq 笔记: 虽然这确实提取了所有消息,但我们需要指定allsignal-desktop 中的 " " 具有 " " 的含义all messages actually loaded。因此,为了提取每条消息,活动联系人的滑块必须向上滑动,然后 signal-desktop 将加载以前不可用的消息(泡沫冲洗重复直到满意)。到目前为止,您希望加载您的消息。这很快就会变得乏味。请记住为所有联系人的历史记录这样做。 话虽如此,备份您的消息历史记录在技术上是可行的,实际上这是一项手动工作。解决这个问题的一种方法可能是备份所有最近的消息,可能每天一次。那么这很可能包含重复的信息,并且在重新启动信号桌面的情况下可能会丢失消息。 在任何情况下,如果(不太远 - 阅读:可能几个月)历史将不时以编程方式搜索一次,则此方法可以正常工作。 Luc 2022-07-29T08:20:22+08:002022-07-29T08:20:22+08:00 基本上正如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 ... 请注意,密钥周围的引号都是必需的,“ok”并不意味着它已经检查了您的密钥。如果您在运行类似的程序时收到“文件不是数据库” .tables,很可能是您输入了错误的密钥或错字或选择了错误的文件(或者,在极少数情况下,文件可能已损坏损坏)。 等等,这不是那么容易吗?当您可以执行上述操作时,为什么 Signal 会添加备份功能! Aidan Feldman 2022-08-30T05:37:39+08:002022-08-30T05:37:39+08:00 sigtop为我工作,并且有导出格式的选项。 Forivin 2022-09-27T02:05:36+08:002022-09-27T02:05:36+08:00 找到加密的 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,你可以使用sqlitebrowser。 打开sqlitebrowser,点击Open,选择Raw Key,输入你的key,前导0x如截图所示,选择SQLCipher 4 defaults,点击ok: 进入Execute SQL标签粘贴上述查询,然后点击蓝色三角播放按钮执行查询:
对的,这是可能的。
只需将其保存在文件中
<yourFilename>
:并通过调用它
bash <yourFilename>
。或使其可执行chmod 700 <yourFilename>
并直接调用它:./<yourFilename>
该脚本使用
sqlcipher
和jq
signal-desktop 的数据库密钥来打开、解密和提取所有JSON
格式的消息到clearTextMsgs.csv
您的 signal-desktop 文件夹~/.config/Signal
中。除了通过使用
jq
(from~/.config/Signal/config.json
) 过滤 JSON 来提取密钥之外,关键的一点发生在这里:其中
<SQL>
包含PRAGMA key
定义和实际的 SQL 语句 (SELECT json FROM messages;
)。然后可以使用
jq
从消息备份中访问任何键/值。您必须安装
sqlcipher
并jq
为此:笔记:
虽然这确实提取了所有消息,但我们需要指定
all
signal-desktop 中的 " " 具有 " " 的含义all messages actually loaded
。因此,为了提取每条消息,活动联系人的滑块必须向上滑动,然后 signal-desktop 将加载以前不可用的消息(泡沫冲洗重复直到满意)。到目前为止,您希望加载您的消息。这很快就会变得乏味。请记住为所有联系人的历史记录这样做。话虽如此,备份您的消息历史记录在技术上是可行的,实际上这是一项手动工作。解决这个问题的一种方法可能是备份所有最近的消息,可能每天一次。那么这很可能包含重复的信息,并且在重新启动信号桌面的情况下可能会丢失消息。
在任何情况下,如果(不太远 - 阅读:可能几个月)历史将不时以编程方式搜索一次,则此方法可以正常工作。
基本上正如Gen.Stack 回答的那样,但更多的是针对 Debian 的制定说明。
我还删除了一些不必要的复杂性。例如:
jq '."key"'
也可以写成jq .key
因为这些字符都不是动态的,因此永远不需要用两层引号转义。像这样的变量"$HOME"
仍然被引用,因为它们可能包含需要引用的字符。apt install build-essential libssl-dev tcl libsqlite3-dev
不确定是否需要 libsqlite3-dev,但我将其安装为调试内容的一部分。
如果您缺少依赖项但
./configure
运行正确并且您尝试这样做make
,则后续构建将失败,直到您手动删除sqlite3.h
,请参阅https://github.com/sqlcipher/sqlcipher/issues/157git 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
.tables
,很可能是您输入了错误的密钥或错字或选择了错误的文件(或者,在极少数情况下,文件可能已损坏损坏)。等等,这不是那么容易吗?当您可以执行上述操作时,为什么 Signal 会添加备份功能!
sigtop为我工作,并且有导出格式的选项。
找到加密的 db.sqlite 数据库(解密密钥在 config.json 文件中)。根据您的操作系统和安装 Signal 的方式,您可能会在以下位置之一找到这些文件:
Linux:
~/.config/Signal/
~/.var/app/org.signal.Signal/config/Signal
视窗:
%AppData%\Signal\config.json
苹果系统:
~/Library/Application Support/Signal
您要做的是执行以下 SQL 查询:
它以合理的格式返回所有消息:
时间戳;电话号码; 对话名称;传入/传出;留言内容
如果你想要一个 GUI,你可以使用sqlitebrowser。
进入
打开sqlitebrowser,点击Open,选择Raw Key,输入你的key,前导
0x
如截图所示,选择SQLCipher 4 defaults
,点击ok:Execute SQL
标签粘贴上述查询,然后点击蓝色三角播放按钮执行查询: