mirror of
https://github.com/LC044/WeChatMsg
synced 2024-11-14 22:01:54 +08:00
修复图片显示问题
This commit is contained in:
parent
e1361a6b23
commit
61aca7d0e3
@ -61,18 +61,18 @@ def decodeExtraBuf(extra_buf_content: bytes):
|
|||||||
off = extra_buf_content.index(key) + 4
|
off = extra_buf_content.index(key) + 4
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
char = extra_buf_content[off : off + 1]
|
char = extra_buf_content[off: off + 1]
|
||||||
off += 1
|
off += 1
|
||||||
if char == b"\x04": # 四个字节的int,小端序
|
if char == b"\x04": # 四个字节的int,小端序
|
||||||
intContent = extra_buf_content[off : off + 4]
|
intContent = extra_buf_content[off: off + 4]
|
||||||
off += 4
|
off += 4
|
||||||
intContent = int.from_bytes(intContent, "little")
|
intContent = int.from_bytes(intContent, "little")
|
||||||
res[trunk_head] = intContent
|
res[trunk_head] = intContent
|
||||||
elif char == b"\x18": # utf-16字符串
|
elif char == b"\x18": # utf-16字符串
|
||||||
lengthContent = extra_buf_content[off : off + 4]
|
lengthContent = extra_buf_content[off: off + 4]
|
||||||
off += 4
|
off += 4
|
||||||
lengthContent = int.from_bytes(lengthContent, "little")
|
lengthContent = int.from_bytes(lengthContent, "little")
|
||||||
strContent = extra_buf_content[off : off + lengthContent]
|
strContent = extra_buf_content[off: off + lengthContent]
|
||||||
off += lengthContent
|
off += lengthContent
|
||||||
res[trunk_head] = strContent.decode("utf-16").rstrip("\x00")
|
res[trunk_head] = strContent.decode("utf-16").rstrip("\x00")
|
||||||
return {
|
return {
|
||||||
@ -91,7 +91,6 @@ def decodeExtraBuf(extra_buf_content: bytes):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def singleton(cls):
|
def singleton(cls):
|
||||||
_instance = {}
|
_instance = {}
|
||||||
|
|
||||||
@ -179,27 +178,64 @@ class HardLink:
|
|||||||
finally:
|
finally:
|
||||||
video_db_lock.release()
|
video_db_lock.release()
|
||||||
|
|
||||||
def get_image(self, content, bytesExtra, thumb=False):
|
def get_image_original(self, content, bytesExtra) -> str:
|
||||||
msg_bytes = MessageBytesExtra()
|
msg_bytes = MessageBytesExtra()
|
||||||
msg_bytes.ParseFromString(bytesExtra)
|
msg_bytes.ParseFromString(bytesExtra)
|
||||||
|
result = ''
|
||||||
for tmp in msg_bytes.message2:
|
for tmp in msg_bytes.message2:
|
||||||
if tmp.field1 != (3 if thumb else 4):
|
if tmp.field1 != 4:
|
||||||
continue
|
continue
|
||||||
pathh = tmp.field2 # wxid\FileStorage\...
|
pathh = tmp.field2 # wxid\FileStorage\...
|
||||||
pathh = "\\".join(pathh.split("\\")[1:])
|
pathh = "\\".join(pathh.split("\\")[1:])
|
||||||
return pathh
|
return pathh
|
||||||
md5 = get_md5_from_xml(content)
|
md5 = get_md5_from_xml(content)
|
||||||
if not md5:
|
if not md5:
|
||||||
return None
|
pass
|
||||||
result = self.get_image_by_md5(binascii.unhexlify(md5))
|
else:
|
||||||
|
result = self.get_image_by_md5(binascii.unhexlify(md5))
|
||||||
|
if result:
|
||||||
|
dir1 = result[3]
|
||||||
|
dir2 = result[4]
|
||||||
|
data_image = result[2]
|
||||||
|
dir0 = "Image"
|
||||||
|
dat_image = os.path.join(root_path, dir1, dir0, dir2, data_image)
|
||||||
|
result = dat_image
|
||||||
|
return result
|
||||||
|
|
||||||
if result:
|
def get_image_thumb(self, content, bytesExtra) -> str:
|
||||||
dir1 = result[3]
|
msg_bytes = MessageBytesExtra()
|
||||||
dir2 = result[4]
|
msg_bytes.ParseFromString(bytesExtra)
|
||||||
data_image = result[2]
|
result = ''
|
||||||
dir0 = "Thumb" if thumb else "Image"
|
for tmp in msg_bytes.message2:
|
||||||
dat_image = os.path.join(root_path, dir1, dir0, dir2, data_image)
|
if tmp.field1 != 3:
|
||||||
return dat_image
|
continue
|
||||||
|
pathh = tmp.field2 # wxid\FileStorage\...
|
||||||
|
pathh = "\\".join(pathh.split("\\")[1:])
|
||||||
|
return pathh
|
||||||
|
md5 = get_md5_from_xml(content)
|
||||||
|
if not md5:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
result = self.get_image_by_md5(binascii.unhexlify(md5))
|
||||||
|
if result:
|
||||||
|
dir1 = result[3]
|
||||||
|
dir2 = result[4]
|
||||||
|
data_image = result[2]
|
||||||
|
dir0 = "Thumb"
|
||||||
|
dat_image = os.path.join(root_path, dir1, dir0, dir2, data_image)
|
||||||
|
result = dat_image
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_image(self, content, bytesExtra, thumb=False) -> str:
|
||||||
|
msg_bytes = MessageBytesExtra()
|
||||||
|
msg_bytes.ParseFromString(bytesExtra)
|
||||||
|
if thumb:
|
||||||
|
result = self.get_image_thumb(content, bytesExtra)
|
||||||
|
else:
|
||||||
|
result = self.get_image_original(content, bytesExtra)
|
||||||
|
if not (result and os.path.exists(result)):
|
||||||
|
result = self.get_image_thumb(content, bytesExtra)
|
||||||
|
return result
|
||||||
|
|
||||||
def get_video(self, content, bytesExtra, thumb=False):
|
def get_video(self, content, bytesExtra, thumb=False):
|
||||||
msg_bytes = MessageBytesExtra()
|
msg_bytes = MessageBytesExtra()
|
||||||
@ -212,7 +248,7 @@ class HardLink:
|
|||||||
return pathh
|
return pathh
|
||||||
md5 = get_md5_from_xml(content, type_="video")
|
md5 = get_md5_from_xml(content, type_="video")
|
||||||
if not md5:
|
if not md5:
|
||||||
return None
|
return ''
|
||||||
result = self.get_video_by_md5(binascii.unhexlify(md5))
|
result = self.get_video_by_md5(binascii.unhexlify(md5))
|
||||||
if result:
|
if result:
|
||||||
dir2 = result[3]
|
dir2 = result[3]
|
||||||
|
@ -13,7 +13,7 @@ pic_head = [0xff, 0xd8, 0x89, 0x50, 0x47, 0x49]
|
|||||||
decode_code = 0
|
decode_code = 0
|
||||||
|
|
||||||
|
|
||||||
def get_code(dat_read):
|
def get_code(dat_read) -> tuple[int, int]:
|
||||||
"""
|
"""
|
||||||
自动判断文件类型,并获取dat文件解密码
|
自动判断文件类型,并获取dat文件解密码
|
||||||
:param file_path: dat文件路径
|
:param file_path: dat文件路径
|
||||||
@ -39,7 +39,7 @@ def get_code(dat_read):
|
|||||||
return -1, -1
|
return -1, -1
|
||||||
|
|
||||||
|
|
||||||
def decode_dat(file_path, out_path):
|
def decode_dat(file_path, out_path) -> str:
|
||||||
"""
|
"""
|
||||||
解密文件,并生成图片
|
解密文件,并生成图片
|
||||||
:param file_path: dat文件路径
|
:param file_path: dat文件路径
|
||||||
@ -49,10 +49,10 @@ def decode_dat(file_path, out_path):
|
|||||||
return None
|
return None
|
||||||
with open(file_path, 'rb') as file_in:
|
with open(file_path, 'rb') as file_in:
|
||||||
data = file_in.read()
|
data = file_in.read()
|
||||||
data = get_code(data[:2])
|
|
||||||
file_type, decode_code = data
|
file_type, decode_code = get_code(data[:2])
|
||||||
if decode_code == -1:
|
if decode_code == -1:
|
||||||
return
|
return ''
|
||||||
|
|
||||||
filename = os.path.basename(file_path)
|
filename = os.path.basename(file_path)
|
||||||
if file_type == 1:
|
if file_type == 1:
|
||||||
@ -74,21 +74,19 @@ def decode_dat(file_path, out_path):
|
|||||||
return file_outpath
|
return file_outpath
|
||||||
|
|
||||||
|
|
||||||
def decode_dat_path(file_path, out_path):
|
def decode_dat_path(file_path, out_path) -> str:
|
||||||
"""
|
"""
|
||||||
解密文件,并生成图片
|
解密文件,并生成图片
|
||||||
:param file_path: dat文件路径
|
:param file_path: dat文件路径
|
||||||
:return: 无
|
:return: 无
|
||||||
"""
|
"""
|
||||||
if not os.path.exists(file_path):
|
if not os.path.exists(file_path):
|
||||||
return None
|
return ''
|
||||||
with open(file_path, 'rb') as file_in:
|
with open(file_path, 'rb') as file_in:
|
||||||
data = file_in.read(2)
|
data = file_in.read(2)
|
||||||
file_type, decode_code = get_code(data)
|
file_type, decode_code = get_code(data)
|
||||||
|
|
||||||
if decode_code == -1:
|
if decode_code == -1:
|
||||||
return
|
return ''
|
||||||
|
|
||||||
filename = os.path.basename(file_path)
|
filename = os.path.basename(file_path)
|
||||||
if file_type == 1:
|
if file_type == 1:
|
||||||
pic_name = os.path.basename(file_path)[:-4] + ".jpg"
|
pic_name = os.path.basename(file_path)[:-4] + ".jpg"
|
||||||
@ -102,18 +100,6 @@ def decode_dat_path(file_path, out_path):
|
|||||||
return file_outpath
|
return file_outpath
|
||||||
|
|
||||||
|
|
||||||
def find_datfile(dir_path, out_path):
|
|
||||||
"""
|
|
||||||
获取dat文件目录下所有的文件
|
|
||||||
:param dir_path: dat文件目录
|
|
||||||
:return: 无
|
|
||||||
"""
|
|
||||||
files_list = os.listdir(dir_path)
|
|
||||||
for file_name in files_list:
|
|
||||||
file_path = dir_path + "\\" + file_name
|
|
||||||
decode_dat(file_path, out_path)
|
|
||||||
|
|
||||||
|
|
||||||
def get_image(path, base_path) -> str:
|
def get_image(path, base_path) -> str:
|
||||||
if path:
|
if path:
|
||||||
base_path = os.getcwd() + base_path
|
base_path = os.getcwd() + base_path
|
||||||
|
Loading…
Reference in New Issue
Block a user