V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lqzhgood
V2EX  ›  分享创造

[卖瓜 🍉] Shmily-聊天记录归档 支持 QQ、Wechat、SMS 等

  •  
  •   lqzhgood · 2023-06-01 11:28:21 +08:00 · 6227 次点击
    这是一个创建于 549 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ❓ 这是啥

    Github - lqzhgood/Shmily

    这好像是一个可能没用又可能很有用的工具。

    能归档 QQ 、MobileQQ 、Wechat 、SMS 、CallLog 、Camera 、Email 等记录。more

    并支持筛选、搜索、评论、图标统计分析等功能。

    少啰嗦,先看 Demo http://demo.shmily.lqzh.me/(托管在 Github ,访问可能略慢)

    🔆 亮点

    我看过 现有 的聊天记录归档项目大都有以下问题

    • 使用上
      • 大都为 HTML 模板直出,无分页,几百兆的 HTML 不可用
      • 导出的归档数据无法查询,筛选、评论等,失去了归档数据的意义
      • 没有图表统计,数据未体现额外价值
      • 显示数据单一,无法多项目如 QQ Wechat 按时间线合并查看
      • 多次导出的数据 (如 2020 年导出的数据和 2021 年导出的数据) 不能累计查看并分析
    • 程序上
      • 获取数据不完整,获取的数据取决于作者用到的,无法拿到数据库中完整的额外字段
      • 全流程耦合,如果对产物不满意,只能从头开始造轮子,难以从中间(如解密后的数据库)开始
    基于以上问题,Shimly 的亮点在于
    
    • 使用上

      • Show 基于组件化开发,纯前端实现,人脑智能榨汁级优化 /:dog ( 240M 数据文件浏览搜索无压力
      • 支持筛选、搜索(支持正则)、评论(支持双向引用链接)
      • 支持我能想到所有维度的数据图表统计 (连表情的使用频率都有)
      • 支持多种类、多批次数据合并显示与统计
    • 程序上

      • 完整的数据导出、不管是否 Show 有使用,能导尽导,万一别人需要呢

      • 架构(详见 文档

        我将架构分为 Get(ExportDB 、ToMsg) 和 Show(Modify 、Web) 4 个部分,中间使用 <JSON>${Shimly-Msg} 标准格式进行融合

        • 你可以只使用 ExportDBToMsg 部分,做自己的数据导出与分析
        • 也可以写自己需要的 Get,而不再担心前端的编写
        • Show 的基础上也可以更简单的自定义显示

    总结: 没看过这么完整且好用的数据归档工具

    👀 过程中的发现

    都看到这了不拿出点干货都骗不到 star 了。

    • S60v3 的 SMS 时间戳编码方式未知,但 解码 符合 y = kx + b
    • QQ 里很多表情都已经雪藏了,例如 委屈 委屈
    • QQ 里表情都是 GIF 无限循环的,如 左太极左太极。但 右太极 右太极,至少从 S60V3 开始,只播放一次。
      • 今年好像被修复了,但可以通过之前的 QQ 经典表情包 验证,如这个

    💖 爱发电

    都到这了

    • Github 点个 Star 呗
    • 🪙 也可以 这里 看看 世界上最可爱的动物 ,顺便投个币 X )
    • 👨‍💻 聊聊酷工作,简历
    49 条回复    2024-04-06 21:34:16 +08:00
    kerb15
        1
    kerb15  
       2023-06-01 11:36:38 +08:00
    10 年前的 qq ,设了聊天记录密码,密码是本地验证的,这个能提取吗
    graetdk
        2
    graetdk  
       2023-06-01 11:47:28 +08:00
    很强
    jivei
        3
    jivei  
       2023-06-01 12:07:00 +08:00 via iPhone   ❤️ 4
    S60V3 ,泪目
    yyf1234
        4
    yyf1234  
       2023-06-01 12:09:32 +08:00 via iPhone   ❤️ 1
    死去的记忆开始攻击我
    nanjingwuyanzu
        5
    nanjingwuyanzu  
       2023-06-01 13:44:39 +08:00
    demo 里面为啥分手不讲讲?
    vsitebon
        6
    vsitebon  
       2023-06-01 14:19:01 +08:00
    这个项目配合现在的 chatpdf 类项目估计能变成自己和过去的自己对话的契机(
    Exdui
        7
    Exdui  
       2023-06-01 14:39:05 +08:00
    公安取证神器
    lqzhgood
        8
    lqzhgood  
    OP
       2023-06-01 15:20:28 +08:00
    @kerb15 搜 “撬开 PC QQ 的本地 SQLite 数据库” ,刚才我发源站还被封 IP 了。
    nerkeler
        9
    nerkeler  
       2023-06-01 16:09:14 +08:00
    赞!!!
    xiaoyuesanshui
        10
    xiaoyuesanshui  
       2023-06-01 16:59:31 +08:00
    赞!!好东西
    coolfan
        11
    coolfan  
       2023-06-01 17:30:17 +08:00   ❤️ 1
    🤣被你 at 过来的,晚上试试👍🏻先给你点个赞!
    lqzhgood
        12
    lqzhgood  
    OP
       2023-06-01 18:08:49 +08:00
    @coolfan 嘎嘎,谢谢点赞~
    也是在别的帖子看到你可能有需要,希望能帮到您。
    kerb15
        13
    kerb15  
       2023-06-01 19:47:22 +08:00
    @lqzhgood #8 谢谢,笑死我上次发个网站也被封了,吓得我以为永封了,但有时候又看到别人可以发
    xiaoyuesanshui
        14
    xiaoyuesanshui  
       2023-06-01 22:34:23 +08:00
    晚上回家研究了一下自己的微信
    直接就卡在 decode db 那一步上了
    huawei 的手机好像没找到 /data/data/com.tencent.mm/MicroMsg/ 下的 systemInfo.cfg CompatibleInfo.cfg

    貌似跟 root 有关系?

    我手行只有微信备份出来的聊天记录

    楼主 我是不是搞错方向了
    aoguai
        15
    aoguai  
       2023-06-01 23:01:25 +08:00
    我自己也在写[aoguai/QQtoExcel: 一个让 PC QQ 导出 TXT 聊天记录转 Excel 表格的工具]( https://github.com/aoguai/QQtoExcel),最近也在重构 QQ 手机聊天记录导出的软件(之前在某爱发过一个还上了当年优秀帖子...),其实微信安卓导出聊天记录我也研究的七七八八了...但是实在没啥空闲时间做
    dianso
        16
    dianso  
       2023-06-01 23:30:30 +08:00
    需要这个~~
    dianso
        17
    dianso  
       2023-06-01 23:32:53 +08:00
    能 docker 部署么?
    locoz
        18
    locoz  
       2023-06-01 23:57:13 +08:00   ❤️ 2
    点开 demo ,往最下一跳,“到这里已经分手了呀”,泪目
    abcdxe2v
        19
    abcdxe2v  
       2023-06-02 00:02:20 +08:00
    @lqzhgood 我看“撬开 PC QQ 的本地 SQLite 数据库”这篇文章很长时间了,但是一直没时间搞,逆向 QQ 太难了。。。
    lqzhgood
        20
    lqzhgood  
    OP
       2023-06-02 00:08:02 +08:00
    @xiaoyuesanshui #14

    这两个文件印象中也是为了获取 IMEI ,你可以使用文档中的手动解密方式,一样的。
    如果是双卡手机,两个 IMEI 都试试~ // 如果迁移过,之前的手机 IMEI 也有可能
    如果还是不行,试试文档中提供的暴力破解~

    还有问题,在项目提 Issues 把,方便追踪问题。
    abcdxe2v
        21
    abcdxe2v  
       2023-06-02 00:08:17 +08:00
    @xiaoyuesanshui 是的,/data/data 这个目录,data 分区,必须得 root 了才能访问。华为新款应该没法 root
    abcdxe2v
        22
    abcdxe2v  
       2023-06-02 00:12:14 +08:00
    安卓没 root 获取不到微信和 qq 的聊天记录数据库的
    bkmi
        23
    bkmi  
       2023-06-02 00:12:54 +08:00 via Android
    不错不错,要是 UI 能适配移动设备就更好了
    bkmi
        24
    bkmi  
       2023-06-02 00:14:30 +08:00 via Android   ❤️ 1
    没法 root 的把数据迁移到 root 的设备就好了,实在不行迁移到模拟器也是可以的
    lqzhgood
        25
    lqzhgood  
    OP
       2023-06-02 00:16:39 +08:00
    @aoguai
    我是从 .mht 和 富文本 两个角度导出的,数据还包含了 表情 alias 信息,还有消息的类型
    .mht 因为包含了 html 结构,解析会比 .txt 更精准

    干脆合并一下吧, 又少一点轮子。你从 Get 项目拿到的 JSON ,转 Excel 好像更方便

    // QQ 记录到处从来就没更新过,新的很多消息类型也都不支持
    // 这里更新的 QQ NT 应该会重写吧
    lqzhgood
        26
    lqzhgood  
    OP
       2023-06-02 00:17:27 +08:00
    @abcdxe2v MIUI 通过系统的备份功能能拿到。
    lqzhgood
        27
    lqzhgood  
    OP
       2023-06-02 00:19:32 +08:00
    @bkmi 有想过,但觉得没啥必要把。
    没人会在手机上看这个吧……
    归档成冷数据备查应该是主要场景
    lqzhgood
        28
    lqzhgood  
    OP
       2023-06-02 00:24:37 +08:00
    @abcdxe2v 是的,PC QQ 太不开放了,自带的聊天记录导出功能应该十多年没更新了吧。
    abcdxe2v
        29
    abcdxe2v  
       2023-06-02 00:27:39 +08:00   ❤️ 1
    @lqzhgood 嗯对,还有一些间接的解决办法。。。比如 pdd 漏洞提权。。。
    lqzhgood
        30
    lqzhgood  
    OP
       2023-06-02 00:30:37 +08:00
    @dianso docker 暂时没有哦,因为都是脚本性质,而且基本没有难搞的依赖和 runtime ,用的人很多再搞吧。
    codyfeng
        31
    codyfeng  
       2023-06-02 08:24:35 +08:00 via Android   ❤️ 1
    不错不错,感谢 OP 的创造分享👍👍
    xiaoyuesanshui
        32
    xiaoyuesanshui  
       2023-06-02 09:24:03 +08:00   ❤️ 1
    @abcdxe2v 的确是 root 相关的问题。
    如果通过系统备份,能把这个目录给备出来

    备份出来后会有一个
    com.tencent.mm.tar
    com.tencent.mm.apk

    .tar 文件根本解不出来,file 看文件类型就是 :data

    看了些资料发现有人提出会有 tar 打包,但是没说解压的方法

    我去搞个 issue
    bkmi
        33
    bkmi  
       2023-06-02 09:41:16 +08:00 via Android
    @lqzhgood 我手机上记录一直留着占那么多空间,主要就是偶尔搜点东西,不然就只保留 PC 上的了
    lqzhgood
        34
    lqzhgood  
    OP
       2023-06-02 10:27:25 +08:00
    @bkmi 嗯,项目的初衷也是这样,每年导出一次数据冷备,偶尔就去 PC 上搜下,解放手机
    gabkfivyfbst
        35
    gabkfivyfbst  
       2023-06-02 11:28:53 +08:00
    咋运行
    etnperlong
        36
    etnperlong  
       2023-06-02 17:37:40 +08:00   ❤️ 1
    非常感谢,这个界面风格真的好漂亮,觉得回到了十年前那个青葱的岁月
    现在跟对象主要用 Telegram 聊天,打算自己适配一下 TG
    lqzhgood
        37
    lqzhgood  
    OP
       2023-06-02 18:16:07 +08:00
    @etnperlong
    感谢支持~ 好做了提个 Issue ,我加到文档的 Get 列表去~
    jwdstefani
        38
    jwdstefani  
       2023-06-03 20:58:24 +08:00
    感谢 已经 star ,马上部署起来
    robking
        39
    robking  
       2023-06-04 10:25:52 +08:00
    有没有详细的部署教程呀
    lqzhgood
        40
    lqzhgood  
    OP
       2023-06-04 15:17:42 +08:00
    @robking #39 第一行的 Github 里面就是文档地址
    ppBruce
        41
    ppBruce  
       2023-06-06 17:19:43 +08:00
    进行到 dbToJson 卡住了。
    1.input 文件夹不存在,看起来是手动在'2 dbToJson'下自己建一个?
    2.修改 config.js 填入需要导入的对方微信 id ,这步是为什么呢?是不是可以理解为每次只能把一个对话转为 json ,多个的话需要手动执行多次?
    3.在 2 dbToJson 下执行 node run build 一直报错。
    node:internal/modules/cjs/loader:1078
    throw err;
    ^
    Error: Cannot find module 'C:\wechat\tools\Shmily-Get-Wechat-main\export\db-android\2 dbToJson\run'
    [90m at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15) [39m
    [90m at Module._load (node:internal/modules/cjs/loader:920:27) [39m
    [90m at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) [39m
    [90m at node:internal/main/run_main_module:23:47 [39m {
    code: [32m'MODULE_NOT_FOUND' [39m,
    requireStack: []
    }
    Node.js v18.16.0

    4.在 2 dbToJson 下执行 node index.js ,执行一段时间后,报错。
    正在解密 Message
    java.lang.OutOfMemoryError: Java heap space
    at java.io.BufferedWriter.<init>(Unknown Source)
    at java.io.BufferedWriter.<init>(Unknown Source)
    at sqlite.test.ReadTxt.writeDocument(ReadTxt.java:116)
    at sqlite.test.ReadTxt.main(ReadTxt.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:84)
    at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)
    node:child_process:960
    throw err;
    ^
    Error: Command failed: decodeMessageTable.exe
    java.lang.OutOfMemoryError: Java heap space
    at java.io.BufferedWriter.<init>(Unknown Source)
    at java.io.BufferedWriter.<init>(Unknown Source)
    at sqlite.test.ReadTxt.writeDocument(ReadTxt.java:116)
    at sqlite.test.ReadTxt.main(ReadTxt.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:84)
    at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)
    at checkExecSyncError (node:child_process:885:11)
    at execSync (node:child_process:957:15)
    at Object.<anonymous> (C:\wechat\tools\Shmily-Get-Wechat-main\export\db-android\2 dbToJson\index.js:13:1)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)
    at Module._load (node:internal/modules/cjs/loader:958:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47 {
    status: 1,
    signal: null,
    output: [
    null,
    '',
    'java.lang.OutOfMemoryError: Java heap space\r\n' +
    '\tat java.io.BufferedWriter.<init>(Unknown Source)\r\n' +
    '\tat java.io.BufferedWriter.<init>(Unknown Source)\r\n' +
    '\tat sqlite.test.ReadTxt.writeDocument(ReadTxt.java:116)\r\n' +
    '\tat sqlite.test.ReadTxt.main(ReadTxt.java:86)\r\n' +
    '\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n' +
    '\tat sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\r\n' +
    '\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\r\n' +
    '\tat java.lang.reflect.Method.invoke(Unknown Source)\r\n' +
    '\tat com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:84)\r\n' +
    '\tat com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)\r\n'
    ],
    pid: 10184,
    stdout: '',
    stderr: 'java.lang.OutOfMemoryError: Java heap space\r\n' +
    '\tat java.io.BufferedWriter.<init>(Unknown Source)\r\n' +
    '\tat java.io.BufferedWriter.<init>(Unknown Source)\r\n' +
    '\tat sqlite.test.ReadTxt.writeDocument(ReadTxt.java:116)\r\n' +
    '\tat sqlite.test.ReadTxt.main(ReadTxt.java:86)\r\n' +
    '\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n' +
    '\tat sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\r\n' +
    '\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\r\n' +
    '\tat java.lang.reflect.Method.invoke(Unknown Source)\r\n' +
    '\tat com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:84)\r\n' +
    '\tat com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94)\r\n'
    }
    Node.js v18.16.0
    lqzhgood
        42
    lqzhgood  
    OP
       2023-06-07 00:22:50 +08:00
    @ppBruce

    1. git 不允许空文件夹
    2. 1 次 1 个, 有多个的需求可以 pr
    3. `npm run build` 文档错误
    4. jvm 内存设置过小 // github issues 里有解

    - 本帖不讨论问题,有问题 Github 上提`issues`,别人也能看到并借鉴
    - 有问题先关键词搜索 `issues`,若无则提 `issues`
    - 代码格式化 过长折叠
    genghisun
        43
    genghisun  
       2023-06-12 16:41:47 +08:00
    太牛了!!
    ccxuy
        44
    ccxuy  
       2023-11-19 13:28:28 +08:00
    idea 非常棒啊, 可是有点看不懂怎么部署使用
    lqzhgood
        45
    lqzhgood  
    OP
       2023-11-21 00:03:50 +08:00   ❤️ 1
    @ccxuy 下个月闲了我再用 docker 封装一下简化过程吧, 然后复杂的地方补充一些视频或图文

    这个 ( 面对非程序员 ) 的文档确实太难写透了
    ccxuy
        46
    ccxuy  
       247 天前
    @lqzhgood hello, 面对程序猿 docker 部署的文档有了吗 XD
    lqzhgood
        47
    lqzhgood  
    OP
       246 天前 via iPhone
    @ccxuy 补了视频教程
    流程上基本就是

    导出文件
    修改配置
    命令 1
    命令 2

    Doxker 感觉也没啥必要~
    FlutterKira
        48
    FlutterKira  
       240 天前
    demo 完全打不开
    lqzhgood
        49
    lqzhgood  
    OP
       238 天前
    @FlutterKira 看网络质量了, demo 是放在 Github Page 上的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2684 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.