Skip to content

Commit

Permalink
支持显示表情包
Browse files Browse the repository at this point in the history
  • Loading branch information
LC044 committed Nov 24, 2023
1 parent b732481 commit cb571e9
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 49 deletions.
73 changes: 38 additions & 35 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion app/DataBase/hard_link.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def get_md5_from_xml(content):
def get_image(content, thumb=False):
md5 = get_md5_from_xml(content)
# md5 = 'bc37a58c32cb203ee9ac587b068e5853'
md5 = '41895664fc5a77878e2155fc96209a19'
# md5 = '41895664fc5a77878e2155fc96209a19'
result = get_image_by_md5(binascii.unhexlify(md5))
if result:
# print(result)
Expand Down
6 changes: 4 additions & 2 deletions app/components/bubble_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def run(self) -> None:


class ImageMessage(QLabel):
def __init__(self, image, image_link='', max_width=480, max_height=240, parent=None):
def __init__(self, image, is_send, image_link='', max_width=480, max_height=240, parent=None):
"""
param:image 图像路径或者QPixmap对象
param:image_link='' 点击图像打开的文件路径
Expand All @@ -124,6 +124,8 @@ def __init__(self, image, image_link='', max_width=480, max_height=240, parent=N
self.image_path = image_link
self.setMaximumWidth(self.max_width)
self.setMaximumHeight(self.max_height)
if is_send:
self.setAlignment(Qt.AlignCenter | Qt.AlignRight)
# self.setScaledContents(True)

def set_image(self, pixmap):
Expand Down Expand Up @@ -161,7 +163,7 @@ def __init__(self, str_content, avatar, Type, is_send=False, parent=None):
self.message = TextMessage(str_content, is_send)
# self.message.setMaximumWidth(int(self.width() * 0.6))
elif Type == MessageType.Image:
self.message = ImageMessage(str_content)
self.message = ImageMessage(str_content, is_send)
else:
raise ValueError("未知的消息类型")

Expand Down
11 changes: 3 additions & 8 deletions app/decrypt/decrypt.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,6 @@ def batch_decrypt(key: str, db_path: Union[str, List[str]], out_path: str):
if __name__ == '__main__':
# 调用 decrypt 函数,并传入参数
key = "2aafab10af7940328bb92ac9d2a8ab5fc07a685646b14f2e9ae6948a7060c0fc"
db_path = "D:\Project\Python\PyWxDump\pywxdump\decrypted"
out_path = "test"
result = batch_decrypt(key, db_path, out_path)
for i in result:
if isinstance(i, str):
print(i)
else:
print(f'[+] "{i[1]}" -> "{i[2]}"')
db_path = "E:\86390\Documents\WeChat Files\wxid_27hqbq7vx5hf22\FileStorage\CustomEmotion\\71\\71CE49ED3CE9E57E43E07F802983BF45"
out_path = "./test/1.png"
print(decrypt(key, db_path, out_path))
15 changes: 15 additions & 0 deletions app/ui_pc/chat/chat_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from app.components.bubble_message import BubbleMessage, ChatWidget, Notice
from app.person import MePC
from app.util import get_abs_path
from app.util.emoji import get_emoji


class ChatInfo(QWidget):
Expand Down Expand Up @@ -113,6 +114,20 @@ def add_message(self, message):
is_send
)
self.chat_window.add_message_item(bubble_message, 0)
elif type_ == 47:
# return
if self.is_5_min(timestamp):
time_message = Notice(self.last_str_time)
self.last_str_time = str_time
self.chat_window.add_message_item(time_message, 0)
image_path = get_emoji(str_content, thumb=True)
bubble_message = BubbleMessage(
image_path,
avatar,
3,
is_send
)
self.chat_window.add_message_item(bubble_message, 0)
except:
print(message)
traceback.print_exc()
Expand Down
File renamed without changes.
91 changes: 91 additions & 0 deletions app/util/emoji.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import os
import xml.etree.ElementTree as ET

import requests

root_path = './data/emoji/'
if not os.path.exists('./data'):
os.mkdir('./data')
if not os.path.exists(root_path):
os.mkdir(root_path)


def get_image_format(header):
# 定义图片格式的 magic numbers
image_formats = {
b'\xFF\xD8\xFF': 'jpeg',
b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A': 'png',
b'\x47\x49\x46': 'gif',
b'\x42\x4D': 'bmp',
# 添加其他图片格式的 magic numbers
}
# 判断文件的图片格式
for magic_number, image_format in image_formats.items():
if header.startswith(magic_number):
return image_format
# 如果无法识别格式,返回 None
return None


def parser_xml(xml_string):
# Parse the XML string
root = ET.fromstring(xml_string)
emoji = root.find('./emoji')
# Accessing attributes of the 'emoji' element
fromusername = emoji.get('fromusername')
tousername = emoji.get('tousername')
md5 = emoji.get('md5')
cdnurl = emoji.get('cdnurl')
encrypturl = emoji.get('encrypturl')
thumburl = emoji.get('thumburl')
externurl = emoji.get('externurl')
width = emoji.get('width')
height = emoji.get('height')
return {
'width': width,
'height': height,
'cdnurl': cdnurl,
'thumburl': thumburl if thumburl else cdnurl,
'md5': md5
}


def download(url, output_dir, name, thumb=False):
resp = requests.get(url)
byte = resp.content
image_format = get_image_format(byte[:8])
if image_format:
if thumb:
output_path = os.path.join(output_dir, 'th_' + name + '.' + image_format)
else:
output_path = os.path.join(output_dir, name + '.' + image_format)
else:
output_path = os.path.join(output_dir, name)
with open(output_path, 'wb') as f:
f.write(resp.content)
return output_path


def get_emoji(xml_string, thumb=True) -> str:
emoji_info = parser_xml(xml_string)
md5 = emoji_info['md5']
image_format = ['.png', '.gif', '.jpeg']
for f in image_format:
prefix = 'th_' if thumb else ''
file_path = os.path.join(root_path, prefix + md5 + f)
if os.path.exists(file_path):
return file_path
url = emoji_info['thumburl'] if thumb else emoji_info['cdnurl']
print("下载表情包ing:", url)
return download(url, root_path, md5, thumb)


if __name__ == '__main__':
xml_string = '<msg><emoji fromusername = "wxid_0o18ef858vnu22" tousername = "wxid_27hqbq7vx5hf22" type="2" idbuffer="media:0_0" md5="71ce49ed3ce9e57e43e07f802983bf45" len = "352588" productid="com.tencent.xin.emoticon.person.stiker_1678703862259eb01f2ef4a313" androidmd5="71ce49ed3ce9e57e43e07f802983bf45" androidlen="352588" s60v3md5 = "71ce49ed3ce9e57e43e07f802983bf45" s60v3len="352588" s60v5md5 = "71ce49ed3ce9e57e43e07f802983bf45" s60v5len="352588" cdnurl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=71ce49ed3ce9e57e43e07f802983bf45&amp;filekey=30350201010421301f020201060402535a041071ce49ed3ce9e57e43e07f802983bf45020305614c040d00000004627466730000000132&amp;hy=SZ&amp;storeid=263ffa00b000720d03274c5820000010600004f50535a1ca0c950b64287022&amp;bizid=1023" designerid = "" thumburl = "http://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLDSKTMRgM8agiadpFhKz9IJ3cD5Ra2sTROibOaShdt3D4z6PfE92WkjQY/0" encrypturl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=cbaae1d847aac6389652b65562bacaa2&amp;filekey=30350201010421301f020201060402535a0410cbaae1d847aac6389652b65562bacaa20203056150040d00000004627466730000000132&amp;hy=SZ&amp;storeid=263ffa00b0008d8223274c5820000010600004f50535a17b82910b64764739&amp;bizid=1023" aeskey= "7051ab2a34442dec63434832463f45ce" externurl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=960f68693454dfa64b9966ca5d70dbd3&amp;filekey=30340201010420301e020201060402535a0410960f68693454dfa64b9966ca5d70dbd3020221a0040d00000004627466730000000132&amp;hy=SZ&amp;storeid=26423dbe3000793a8720e40de0000010600004f50535a1d40c950b71be0a50&amp;bizid=1023" externmd5 = "41895664fc5a77878e2155fc96209a19" width= "240" height= "240" tpurl= "" tpauthkey= "" attachedtext= "" attachedtextcolor= "" lensid= "" emojiattr= "" linkid= "" desc= "ChEKB2RlZmF1bHQSBuWNlee6rw==" ></emoji> </msg>'
res1 = parser_xml(xml_string)
print(res1, res1['md5'])
# download(res1['cdnurl'], "./data/emoji/", res1['md5'])
# download(res1['thumburl'], "./data/emoji/", res1['md5'], True)
print(get_emoji(xml_string, True))
print(get_emoji(xml_string, False))
# http://vweixinf.tc.qq.com/110/20403/stodownload?m=3a4d439aba02dce4834b2c54e9f15597&filekey=3043020101042f302d02016e0402534804203361346434333961626130326463653438333462326335346539663135353937020213f0040d00000004627466730000000131&hy=SH&storeid=323032313037323030373236313130303039653236646365316535316534383236386234306230303030303036653033303034666233&ef=3&bizid=1022
Loading

0 comments on commit cb571e9

Please sign in to comment.