添加html导出部分文件的支持

This commit is contained in:
wuyanyun 2023-12-23 21:50:57 +08:00
parent 6164ef9821
commit 65de51fb45
4 changed files with 99 additions and 0 deletions

View File

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

View File

@ -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

63
app/util/file.py Normal file
View File

@ -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 ""