QQBackup / QQ-History-Backup

【停更】QQ/TIM 聊天记录导出为 HTML,支持图片、语音,可 GUI 与 非 GUI 操作 (Python)
MIT License
316 stars 15 forks source link

选择“合并图片”就会导出文字信息不完整也没有图片的导出文件夹 #8

Closed lb-chc closed 1 year ago

lb-chc commented 1 year ago

如果选择 自己的QQ号:【自己的QQ号】 导出全部记录:是 QQ号/群号:【没写】 私聊/群聊:私聊 表情版本:新 导出图片:是 合并图片:否

则导出了完整的文字记录95.0 MB

如果在此基础上改为选择 合并图片:是

则导出了不完整的文字记录,也没有图片1.71 MB


谢谢你做的软件,比原版更好,可以在不足够完整的数据库基础上进行导出。

Young-Lord commented 1 year ago

奇怪 这个开关貌似根本就没生效? 稍后看看

lb-chc commented 1 year ago

以及功能请求:希望附带json导出格式(当然txt也不是不行......)的选项来便于分析和后续可视化

lb-chc commented 1 year ago

奇怪 这个开关貌似根本就没生效? 稍后看看

果然没测试嘛hhhhhhh 能搞出来的话你就是这个主题前两页里最好的项目了!(因为再后面的我就没看了)

(我是在2022.11与2023.3于官网下载的QQ非TIM版本上进行测试的)

Young-Lord commented 1 year ago

在搞了在搞了 等重构了顺便写一个

Young-Lord commented 1 year ago

不过我现在没有数据文件复现不了,看代码也没找到什么会导致这个问题的地方,方便做一下这两个事吗?

  1. 把“合并图片”分别打开、关闭各重复两次看是否复现
  2. 描述两种情况生成的HTML具体差异 感谢!
lb-chc commented 1 year ago

不过我现在没有数据文件复现不了,看代码也没找到什么会导致这个问题的地方,方便做一下这两个事吗? 1. 把“合并图片”分别打开、关闭各重复两次看是否复现 2. 描述两种情况生成的HTML具体差异 感谢!

应该是我谢你才对,要不,你给我个邮箱,我挑两个导出文件发给你吧?

Young-Lord commented 1 year ago

ly-niko@qq.com

Young-Lord commented 1 year ago
  1. log.txt也要(注意隐私)
  2. 试试新版
Young-Lord commented 1 year ago

emm……请问你运行命令的时候工作目录是哪里?问题可能是emoticon文件夹不在当前工作目录下或别的什么 再试试新版

lb-chc commented 1 year ago

emm……请问你运行命令的时候工作目录是哪里?问题可能是emoticon文件夹不在当前工作目录下或别的什么 再试试新版

啊,我懒了......下载了项目ZIP在C:\Users\Win10\Desktop\QQ-History-Backup-master

使用目前的最新版(下载项目ZIP),导出图片与合并图片全选“是”时的导出文件大小正常了,比选否时大了,文字量看起来足够多了,但还是没有图片。

这个项目是可以导出图片的,但不能导出群聊,一次只能导出一个,使用也困难,但我因此确信我的数据库里确实有图片

等我下一次做备份时鼓捣聊天记录再做实验吧........(抱歉)

(也许下次我可以专门建一个QQ号取出数据给你做实验)

Young-Lord commented 1 year ago

数据我现在是有了,之后找个时间试试

Young-Lord commented 1 year ago

文件大小和不导出图片相比如何?现在怀疑是图片格式统一识别为png的问题(实际情况jpg/gif)均有并不是这个问题

现在怀疑是crc算法实现有问题了(因为别的这两个项目的代码基本是相同的),稍后发一个log里只有相关调试信息的测试版给你试试

lb-chc commented 1 year ago

文件大小和不导出图片相比如何?~现在怀疑是图片格式统一识别为png的问题(实际情况jpg/gif)均有~并不是这个问题

现在怀疑是crc算法实现有问题了(因为别的这两个项目的代码基本是相同的),稍后发一个log里只有相关调试信息的测试版给你试试

导出图片与合并图片全选“是”时 194mb 导出图片与合并图片全选“否”时 148mb

听起来不错,直接把版本发到最新版里面吧!GUI-fuc*BUG.py

Young-Lord commented 1 year ago

不太行,因为这个log删干净了,也只能给debug用了

qhb-debug.zip

跑一下,log.txt直接发上来或发我邮箱

lb-chc commented 1 year ago

不太行,因为这个log删干净了,也只能给debug用了

qhb-debug.zip

跑一下,log.txt直接发上来或发我邮箱

你的诚意溢出来了!已发送 由于那个java项目我没法再次让它正常运行,所以我不能确定附带的样本在数据库里是否真的有图片

Young-Lord commented 1 year ago

根据测试,crc64算法实现是相同的——也就是说,理论不会出现那个 Java 项目能找到图片而这个找不到的情况 所以这个我就当是无法复现了?

相关代码:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

class CRC64 {

  private static final long[] CRCTable = new long[256];
  private static final long POLY64REV = 0x95AC9329AC4BC9B5L;
  private static final long INITIALCRC = 0xFFFFFFFFFFFFFFFFL;
  private static boolean init = false;

  public static final long c(String in) {
    if (in == null || in.length() == 0) {
      return 0;
    }
    long crc = INITIALCRC, part;
    if (!init) {
      for (int i = 0; i < 256; i++) {
        part = i;
        for (int j = 0; j < 8; j++) {
          int value = ((int) part & 1);
          if (value != 0) {
            part = (part >> 1) ^ POLY64REV;
          } else {
            part >>= 1;
          }
        }
        CRCTable[i] = part;
      }
      init = true;
    }
    int length = in.length();
    for (int k = 0; k < length; ++k) {
      char c = in.charAt(k);
      crc = CRCTable[(((int) crc) ^ c) & 0xff] ^ (crc >> 8);
    }
    return crc;
  }
}

public class HelloWorld { //类,HelloWorld就是这个类的类名

  public static void main(String[] args) { //方法
    String a = "chatimg:E4E83D641AAE552710022146D22002A4";
    String CRC64Value;
    CRC64Value = String.valueOf(CRC64.c((a)));
    CRC64Value =
      "Cache_" +
      (CRC64Value.startsWith("-") ? "-" : "") +
      Long.toHexString(Long.valueOf(CRC64Value.replace("-", "")));
    String line1, line2, py_crc;
    try {
      BufferedReader br = new BufferedReader(
        new InputStreamReader(new FileInputStream("log.txt"))
      );
      line1 = br.readLine();
      while (line1 != null) {
        // if begins with: [PRINT]: chatimg:
        if (line1.startsWith("[PRINT]: chatimg:")) {
          line2 = br.readLine();
          // if begins with: [PRINT]: chatimg:
          if (line2.startsWith("[PRINT]: ")) {
            py_crc = line2.substring(9);
            //print
            //System.out.println(py_crc);
            CRC64Value = String.valueOf(CRC64.c((line1.substring(9))));
            CRC64Value =
              (CRC64Value.startsWith("-") ? "-" : "") +"0x"+
              Long.toHexString(Long.valueOf(CRC64Value.replace("-", "")));
            if (!py_crc.equals(CRC64Value)) {
              System.out.println(CRC64Value);
              System.out.println("!!Found: " + line1.substring(9)+"\n"+line2);
              break;
            }
          }
        }
        line1 = br.readLine();
      }
    } catch (Exception e) {
      System.out.println(e);
    }
    //    Scanner input = new Scanner(System.in);
    //    while (true) {
    //      a = input.next();
    //    }
  }
}
lb-chc commented 1 year ago

那么,根据你的聊天记录测试数据,你的项目能复原群聊和私聊中的图片吗?无法复现的话也没办法,以后我换别的账号的数据自己再测一次吧.......

Young-Lord commented 1 year ago

可以的

lb-chc commented 1 year ago

可以的

谢谢你的维护