diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py index 94b5f19..23bca94 100644 --- a/app/DataBase/output_pc.py +++ b/app/DataBase/output_pc.py @@ -18,6 +18,7 @@ import shutil from ..util.compress_content import parser_reply from ..util.emoji import get_emoji, get_emoji_path from ..util.image import get_image_path, get_image +from ..util.file import get_file os.makedirs('./data/聊天记录', exist_ok=True) @@ -359,6 +360,37 @@ class ChildThread(QThread): def wx_file(self, doc, isSend, content, status): return + def file(self, doc, message): + origin_docx_path = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}" + bytesExtra = message[10] + str_time = message[8] + is_send = message[4] + timestamp = message[5] + is_chatroom = 1 if self.contact.is_chatroom else 0 + if is_chatroom: + avatar = f"./avatar/{message[12].wxid}.png" + else: + avatar = f"./avatar/{MePC().wxid if is_send else self.contact.wxid}.png" + if is_chatroom: + if is_send: + displayname = MePC().name + else: + displayname = message[12].remark + else: + displayname = MePC().name if is_send else self.contact.remark + displayname = escape_js_and_html(displayname) + if self.output_type == Output.HTML: + link = get_file(bytesExtra, thumb=True, output_path=origin_docx_path + '/file') + file_name = '' + shutil.copy(f"{os.path.abspath('.')}/app/resources/icons/file.png", origin_docx_path + '/file/file.png') + file_path = './file/file.png' + if link != "": + file_name = os.path.basename(link) + link = './file/' + file_name + doc.write( + f'''{{ type:49, text: '{file_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}',link: '{link}',sub_type:6,file_name: '{file_name}'}},''' + ) + def retract_message(self, doc, isSend, content, status): return @@ -569,6 +601,8 @@ class ChildThread(QThread): self.system_msg(f, message) elif type_ == 49 and sub_type == 57 and self.message_types.get(1): self.refermsg(f, message) + elif type_ == 49 and sub_type == 6 and self.message_types.get(4906): + self.file(f, message) f.write(html_end) f.close() self.okSignal.emit(1) diff --git a/app/resources/icons/file.png b/app/resources/icons/file.png new file mode 100644 index 0000000..565cf36 Binary files /dev/null and b/app/resources/icons/file.png differ diff --git a/app/ui/contact/export_dialog.py b/app/ui/contact/export_dialog.py index 07f51a2..b68ecf0 100644 --- a/app/ui/contact/export_dialog.py +++ b/app/ui/contact/export_dialog.py @@ -12,6 +12,7 @@ types = { '语音': 34, '视频': 43, '表情包': 47, + '文件': 49_06, '拍一拍等系统消息': 10000 } Stylesheet = """ @@ -32,6 +33,7 @@ class ExportDialog(QDialog): if file_type == 'html': self.export_type = Output.HTML self.export_choices = {"文本": True, "图片": True, "语音": False, "视频": False, "表情包": False, + '文件': True, '拍一拍等系统消息': True} # 定义导出的数据类型,默认全部选择 elif file_type == 'csv': self.export_type = Output.CSV diff --git a/app/util/file.py b/app/util/file.py new file mode 100644 index 0000000..101c2b4 --- /dev/null +++ b/app/util/file.py @@ -0,0 +1,63 @@ +import os +import traceback +import shutil + +import requests + +from app.log import log, logger +from app.util.protocbuf.msg_pb2 import MessageBytesExtra +from ..person import MePC + +root_path = './data/files/' +if not os.path.exists('./data'): + os.mkdir('./data') +if not os.path.exists(root_path): + os.mkdir(root_path) + + +class File: + def __init__(self): + self.open_flag = False + + +def get_file(bytes_extra, thumb=False, output_path=root_path) -> str: + try: + msg_bytes = MessageBytesExtra() + msg_bytes.ParseFromString(bytes_extra) + file_original_path = '' + file_path = '' + file_name = '' + real_path = '' + if len(msg_bytes.message2) > 0: + file_field = msg_bytes.message2[-1].field2 + if file_field.find('sec_msg_node') == -1: + file_original_path = file_field + file_name = os.path.basename(file_original_path) + if file_name != '' and file_name != MePC().wxid: + file_path = os.path.join(output_path, file_name) + if os.path.exists(file_path): + print('文件' + file_path + '已存在') + return file_path + if os.path.isabs(file_original_path): + if os.path.exists(file_original_path): + real_path = file_original_path + else: # 如果没找到再判断一次是否是迁移了目录 + if file_original_path.find(r"FileStorage") != -1: + real_path = MePC().wx_dir + file_original_path[ + file_original_path.find("FileStorage") - 1:] + else: + if file_original_path.find(MePC().wxid) != -1: + real_path = MePC().wx_dir + file_original_path.replace(MePC().wxid, '') + else: + real_path = MePC().wx_dir + file_original_path + if real_path != "": + if os.path.exists(real_path): + print('开始获取文件' + real_path) + shutil.copy2(real_path, file_path) + else: + print('文件' + file_original_path + '已丢失') + file_path = '' + return file_path + except: + logger.error(traceback.format_exc()) + return ""