修复txt导出问题 #236

This commit is contained in:
shuaikangzhou 2023-12-26 23:49:53 +08:00
parent d4562744d0
commit 93cdcd272e
4 changed files with 37 additions and 23 deletions

View File

@ -1,13 +1,9 @@
import os.path import os.path
import random import random
import html
import sqlite3 import sqlite3
import threading import threading
import traceback import traceback
from pprint import pprint
import lz4.block
import html
import re
from app.log import logger from app.log import logger
from app.util.compress_content import parser_reply from app.util.compress_content import parser_reply

View File

@ -103,7 +103,7 @@ class Output(QThread):
packagemsg = PackageMsg() packagemsg = PackageMsg()
messages = packagemsg.get_package_message_all() messages = packagemsg.get_package_message_all()
# 写入CSV文件 # 写入CSV文件
with open(filename, mode='w', newline='', encoding='utf-8') as file: with open(filename, mode='w', newline='', encoding='utf-8-sig') as file:
writer = csv.writer(file) writer = csv.writer(file)
writer.writerow(columns) writer.writerow(columns)
# 写入数据 # 写入数据
@ -121,7 +121,7 @@ class Output(QThread):
'bigHeadImgUrl'] 'bigHeadImgUrl']
contacts = micro_msg_db.get_contact() contacts = micro_msg_db.get_contact()
# 写入CSV文件 # 写入CSV文件
with open(filename, mode='w', newline='', encoding='utf-8') as file: with open(filename, mode='w', newline='', encoding='utf-8-sig') as file:
writer = csv.writer(file) writer = csv.writer(file)
writer.writerow(columns) writer.writerow(columns)
# 写入数据 # 写入数据
@ -135,7 +135,7 @@ class Output(QThread):
self.to_csv_all() self.to_csv_all()
elif self.output_type == self.CONTACT_CSV: elif self.output_type == self.CONTACT_CSV:
self.contact_to_csv() self.contact_to_csv()
elif self.output_type == self.CSV: elif self.output_type == self.CSV or self.output_type == self.TXT:
self.Child = ChildThread(self.contact, type_=self.output_type, message_types=self.message_types) self.Child = ChildThread(self.contact, type_=self.output_type, message_types=self.message_types)
self.Child.progressSignal.connect(self.progress) self.Child.progressSignal.connect(self.progress)
self.Child.rangeSignal.connect(self.rangeSignal) self.Child.rangeSignal.connect(self.rangeSignal)
@ -244,7 +244,7 @@ class ChildThread(QThread):
f'''{{ type:{1}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:{1}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark name = displayname
doc.write( doc.write(
f'''{str_time} {name}\n{str_content}\n\n''' f'''{str_time} {name}\n{str_content}\n\n'''
) )
@ -286,7 +286,7 @@ class ChildThread(QThread):
f'''{{ type:{type_}, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:{type_}, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark name = displayname
doc.write( doc.write(
f'''{str_time} {name}\n[图片]\n\n''' f'''{str_time} {name}\n[图片]\n\n'''
) )
@ -326,7 +326,7 @@ class ChildThread(QThread):
f'''{{ type:34, text:'{audio_path}',is_send:{is_send},avatar_path:'{avatar}',voice_to_text:'{voice_to_text}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:34, text:'{audio_path}',is_send:{is_send},avatar_path:'{avatar}',voice_to_text:'{voice_to_text}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
if self.output_type == Output.TXT: if self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark name = displayname
doc.write( doc.write(
f'''{str_time} {name}\n[语音]\n\n''' f'''{str_time} {name}\n[语音]\n\n'''
) )
@ -358,7 +358,7 @@ class ChildThread(QThread):
f'''{{ type:{3}, text: '{emoji_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:{3}, text: '{emoji_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark name = displayname
doc.write( doc.write(
f'''{str_time} {name}\n[表情包]\n\n''' f'''{str_time} {name}\n[表情包]\n\n'''
) )
@ -436,7 +436,7 @@ class ChildThread(QThread):
f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark name = displayname
if refer_msg: if refer_msg:
doc.write( doc.write(
f'''{str_time} {name}\n{content.get('title')}\n引用:{refer_msg.get('displayname')}:{refer_msg.get('content')}\n\n''' f'''{str_time} {name}\n{content.get('title')}\n引用:{refer_msg.get('displayname')}:{refer_msg.get('content')}\n\n'''
@ -452,20 +452,28 @@ class ChildThread(QThread):
str_time = message[8] str_time = message[8]
timestamp = message[5] timestamp = message[5]
is_chatroom = 1 if self.contact.is_chatroom else 0 is_chatroom = 1 if self.contact.is_chatroom else 0
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
str_content = str_content.replace('<![CDATA[', "").replace( str_content = str_content.replace('<![CDATA[', "").replace(
' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "")
res = findall('(</{0,1}(img|revo|_wc_cus|a).*?>)', str_content) res = findall('(</{0,1}(img|revo|_wc_cus|a).*?>)', str_content)
for xmlstr, b in res: for xmlstr, b in res:
str_content = str_content.replace(xmlstr, "") str_content = str_content.replace(xmlstr, "")
str_content = escape_js_and_html(str_content) str_content = escape_js_and_html(str_content)
if self.output_type == Output.HTML: if self.output_type == Output.HTML:
doc.write( doc.write(
f'''{{ type:0, text: '{str_content}',is_send:{is_send},avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:''}},''' f'''{{ type:0, text: '{str_content}',is_send:{is_send},avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:''}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark
doc.write( doc.write(
f'''{str_time} {name}\n{str_content}\n\n''' f'''{str_time} {displayname}\n{str_content}\n\n'''
) )
def video(self, doc, message): def video(self, doc, message):
@ -523,9 +531,15 @@ class ChildThread(QThread):
f'''{{ type:{type_}, text: '{video_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},''' f'''{{ type:{type_}, text: '{video_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{displayname}'}},'''
) )
elif self.output_type == Output.TXT: elif self.output_type == Output.TXT:
name = '' if is_send else self.contact.remark 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
doc.write( doc.write(
f'''{str_time} {name}\n[视频]\n\n''' f'''{str_time} {displayname}\n[视频]\n\n'''
) )
def to_csv(self): def to_csv(self):
@ -538,7 +552,7 @@ class ChildThread(QThread):
'StrTime'] 'StrTime']
messages = msg_db.get_messages(self.contact.wxid) messages = msg_db.get_messages(self.contact.wxid)
# 写入CSV文件 # 写入CSV文件
with open(filename, mode='w', newline='', encoding='utf-8') as file: with open(filename, mode='w', newline='', encoding='utf-8-sig') as file:
writer = csv.writer(file) writer = csv.writer(file)
writer.writerow(columns) writer.writerow(columns)
# 写入数据 # 写入数据
@ -618,6 +632,10 @@ class ChildThread(QThread):
origin_docx_path = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}" origin_docx_path = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}"
os.makedirs(origin_docx_path, exist_ok=True) os.makedirs(origin_docx_path, exist_ok=True)
filename = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}/{self.contact.remark}.txt" filename = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}/{self.contact.remark}.txt"
if self.contact.is_chatroom:
packagemsg = PackageMsg()
messages = packagemsg.get_package_message_by_wxid(self.contact.wxid)
else:
messages = msg_db.get_messages(self.contact.wxid) messages = msg_db.get_messages(self.contact.wxid)
total_steps = len(messages) total_steps = len(messages)
with open(filename, mode='w', newline='', encoding='utf-8') as f: with open(filename, mode='w', newline='', encoding='utf-8') as f:

View File

@ -15,10 +15,12 @@ def decompress_CompressContent(data):
try: try:
dst = lz4.block.decompress(data, uncompressed_size=len(data) << 10) dst = lz4.block.decompress(data, uncompressed_size=len(data) << 10)
decoded_string = dst.decode().replace('\x00', '') # Remove any null characters decoded_string = dst.decode().replace('\x00', '') # Remove any null characters
except lz4.block.LZ4BlockError: except :
print("Decompression failed: potentially corrupt input or insufficient buffer size.") print("Decompression failed: potentially corrupt input or insufficient buffer size.")
return '' return ''
return decoded_string return decoded_string
def escape_js_and_html(input_str): def escape_js_and_html(input_str):
# 转义HTML特殊字符 # 转义HTML特殊字符
html_escaped = html.escape(input_str, quote=False) html_escaped = html.escape(input_str, quote=False)
@ -36,6 +38,7 @@ def escape_js_and_html(input_str):
return js_escaped return js_escaped
def parser_reply(data: bytes): def parser_reply(data: bytes):
xml_content = decompress_CompressContent(data) xml_content = decompress_CompressContent(data)
if not xml_content: if not xml_content:

View File

@ -62,9 +62,6 @@ class ViewController(QWidget):
if __name__ == '__main__': if __name__ == '__main__':
import cgitb
cgitb.enable(format='text')
app = QApplication(sys.argv) app = QApplication(sys.argv)
font = QFont('微软雅黑', 12) # 使用 Times New Roman 字体,字体大小为 14 font = QFont('微软雅黑', 12) # 使用 Times New Roman 字体,字体大小为 14
app.setFont(font) app.setFont(font)