把钉钉里那些「明明进过我电脑、事后却找不回来」的内容——导出的聊天记录、群文件清单、下载下来的文档——变成一张能筛能搜能统计能导出的表。命令行版跑在你本机,网页版就在这一页。
SQLite format 3 而是随机密文;
一个 67 MB 的库里能打印出来的字符串有 48 万条,含中文的是 0 条——不是「换了个格式」,是每个字节都被加密了,
密钥在登录态/钥匙串/服务端,不在本地文件里。附带的全文索引库、同步缓存库、各类 storage 库同样加密。
所以这个工具做的是把加密之外那几条明文缝隙用干净,不是破解。
要完整记录,只有一条合规路:在钉钉 App 里用它自带的「导出聊天记录」导出,再交给下面这个解析台,或用命令行版 ingest 灌进库里。
| 你遇到的情况 | 它怎么解 |
|---|---|
| 导出来的聊天记录是一坨 txt,几千行,想找「谁在哪天说了改到第几版」,只能靠肉眼往下翻。 | 解析成 时间 / 发言人 / 内容 三列的表,按发言人勾选、按关键词搜、按日期卡范围,三个条件叠着用,命中处高亮。 |
| 想知道这个群到底是谁在说话——是三个人在推进,还是二十个人在刷屏。 | 按当前筛选条件实时统计每人发言条数、占比、首末发言时间,并画一张条形图。 |
| 要把某段讨论截图发给别人/贴进汇报,但截图里全是同事真名。 | 一个匿名化开关:张三→A、李四→B,表格、图表、导出 CSV 三处同时换掉,映射关系只留在你自己屏幕上。 |
| 筛出来这 40 条要交给别人继续处理。 | 一键导出筛选后的 CSV(带 BOM,Excel/WPS 直接打开不乱码),或复制到剪贴板。 |
—
| 发言人 | 条数 | 占比 | 首次发言 | 最后发言 |
|---|
| 时间 | 发言人 | 内容 |
|---|
解析器先猜格式再解析,猜错了也不会丢内容——最差情况退化成「一行一条」,时间与发言人留空,正文一个字不少。
| 喂进去长这样 | 怎么解 |
|---|---|
| 2026-08-03 09:12:04 张工 今天下午三点对图。 |
钉钉导出的常见样式:时间与发言人一行,正文在后续行。正文可以跨多行,一直吃到下一个时间戳为止。 |
| [2026-08-03 09:12] 张工: 今天下午三点对图。 | 时间、发言人、正文挤在一行。冒号(中英文都认)左边当发言人——但只在冒号出现在前 30 字以内时才这么判,避免把正文里的冒号当成分隔符。 |
| 张工 2026-08-03 09:12:04 | 发言人在前、时间在后的样式同样认,正文取后续行。 |
| 时间,发言人,内容 开头的 CSV |
真正的 CSV 解析(认引号、认字段内换行、认双写转义)。表头按同义词认列:时间/日期/上传时间…;发言人/发送人/上传人/成员…;内容/正文/消息/文件名…。认不出表头就按位置取前三列,并在摘要里标出来。 |
| 其它任意文本 | 一行一条,正文原样保留。宁可少解析,也不猜错——猜错的发言人比没有发言人更坏。 |
网页版解析导出文件;命令行版还能多做一件网页做不到的事——读你本机上钉钉留下的明文缝隙。一个 Python 文件,只用标准库,没有配置文件、没有守护进程、没有账号。
| 命令 | 做什么 |
|---|---|
| extract.py build | 抽系统通知中心里钉钉弹过的通知(明文:发送人、正文、送达时间)+ 扫媒体缓存,增量写进 SQLite,打印「新增 N / 累计 M」。 |
| extract.py query 管网 | 中文子串检索,按时间排序输出 [时间] 发送人: 正文。通知与导入的聊天记录一起搜。 |
| extract.py today | 只列今天入库的通知;没有就明说今天没有,不给空表让你猜。 |
| extract.py collect 管网 --dest <目录> | 下载目录里文件名含关键词的文件,按各自修改日期分到 <目录>/<日期>/;按内容哈希去重,同名不同内容的两份都保住。 |
| extract.py ingest 聊天记录.txt | 把 App 导出的聊天记录灌进同一张表、同一套检索。 |
检索用子串扫描,不用全文索引。全文索引的默认分词器按 ASCII 规则切词,一整段中文会被切成一个词——除非关键词恰好等于整段,否则一条也匹配不上。而在几百到几千条的量级上,逐条扫描的开销可以忽略。所以这里刻意不用全文索引查中文。上面解析台的关键词框走的也是同一套子串规则。
归集去重按内容哈希,不按目标路径。源文件的修改时间会被同步工具、整理脚本这类外部进程改写,同一个文件两次运行会被算到两个不同的日期目录去,用路径判重就会重复收一份。改成「同一份内容在同一归集根下只收一次」之后,这个问题从结构上消失了。这是踩过之后改的,不是设计时想到的。
这张表是实测结论,不是设想。请对着它决定要不要用:
| 数据源 | 抽出来是什么 | 局限 |
|---|---|---|
| App 自带「导出聊天记录」的 txt |
完整聊天记录 时间 / 发言人 / 正文三列结构化 | 需要你在 App 里手动点导出。这是拿到完整记录的唯一合规路径 |
| 群文件清单 CSV | 完整可读 文件名、上传人、上传时间,与聊天走同一套筛选统计 | 只有清单,没有文件本体 |
| 系统通知中心库 | 明文含文字 钉钉弹过系统通知的消息:发送人/群名、正文、送达时间 | 只有真的弹过通知才有。前台正在看的会话、你自己发的、设了免打扰的群、被清理掉的通知,都不入库 |
| 钉钉媒体缓存目录 | 只有文件,没有上下文 图片/语音/视频本体,登记路径、大小、修改时间 | 拿不到「谁在哪个会话发的」——那部分在加密库里。文件名是内容寻址串,只能用修改时间近似收发时间 |
| 拿不到 整库加密 | 已实测四轮全灭,含 UI 无障碍读取也刮不到。别再花时间找「哪张表存聊天」 |