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

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

  •  
  •   lqzhgood · 323 天前 · 5549 次点击
    这是一个创建于 323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ❓ 这是啥

    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  
       323 天前
    10 年前的 qq ,设了聊天记录密码,密码是本地验证的,这个能提取吗
    graetdk
        2
    graetdk  
       323 天前
    很强
    jivei
        3
    jivei  
       323 天前 via iPhone   ❤️ 4
    S60V3 ,泪目
    yyf1234
        4
    yyf1234  
       323 天前 via iPhone   ❤️ 1
    死去的记忆开始攻击我
    nanjingwuyanzu
        5
    nanjingwuyanzu  
       323 天前
    demo 里面为啥分手不讲讲?
    vsitebon
        6
    vsitebon  
       323 天前
    这个项目配合现在的 chatpdf 类项目估计能变成自己和过去的自己对话的契机(
    Exdui
        7
    Exdui  
       323 天前
    公安取证神器
    lqzhgood
        8
    lqzhgood  
    OP
       323 天前
    @kerb15 搜 “撬开 PC QQ 的本地 SQLite 数据库” ,刚才我发源站还被封 IP 了。
    nerkeler
        9
    nerkeler  
       323 天前
    赞!!!
    xiaoyuesanshui
        10
    xiaoyuesanshui  
       323 天前
    赞!!好东西
    coolfan
        11
    coolfan  
       323 天前   ❤️ 1
    🤣被你 at 过来的,晚上试试👍🏻先给你点个赞!
    lqzhgood
        12
    lqzhgood  
    OP
       323 天前
    @coolfan 嘎嘎,谢谢点赞~
    也是在别的帖子看到你可能有需要,希望能帮到您。
    kerb15
        13
    kerb15  
       323 天前
    @lqzhgood #8 谢谢,笑死我上次发个网站也被封了,吓得我以为永封了,但有时候又看到别人可以发
    xiaoyuesanshui
        14
    xiaoyuesanshui  
       323 天前
    晚上回家研究了一下自己的微信
    直接就卡在 decode db 那一步上了
    huawei 的手机好像没找到 /data/data/com.tencent.mm/MicroMsg/ 下的 systemInfo.cfg CompatibleInfo.cfg

    貌似跟 root 有关系?

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

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

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

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

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

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

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

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

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

    我去搞个 issue
    bkmi
        33
    bkmi  
       322 天前 via Android
    @lqzhgood 我手机上记录一直留着占那么多空间,主要就是偶尔搜点东西,不然就只保留 PC 上的了
    lqzhgood
        34
    lqzhgood  
    OP
       322 天前
    @bkmi 嗯,项目的初衷也是这样,每年导出一次数据冷备,偶尔就去 PC 上搜下,解放手机
    gabkfivyfbst
        35
    gabkfivyfbst  
       322 天前
    咋运行
    etnperlong
        36
    etnperlong  
       322 天前   ❤️ 1
    非常感谢,这个界面风格真的好漂亮,觉得回到了十年前那个青葱的岁月
    现在跟对象主要用 Telegram 聊天,打算自己适配一下 TG
    lqzhgood
        37
    lqzhgood  
    OP
       322 天前
    @etnperlong
    感谢支持~ 好做了提个 Issue ,我加到文档的 Get 列表去~
    jwdstefani
        38
    jwdstefani  
       321 天前
    感谢 已经 star ,马上部署起来
    robking
        39
    robking  
       320 天前
    有没有详细的部署教程呀
    lqzhgood
        40
    lqzhgood  
    OP
       320 天前
    @robking #39 第一行的 Github 里面就是文档地址
    ppBruce
        41
    ppBruce  
       318 天前
    进行到 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
       318 天前
    @ppBruce

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

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

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

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

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