diff --git a/README.md b/README.md index a1f4118..b410343 100644 --- a/README.md +++ b/README.md @@ -34,13 +34,17 @@ ## 2. 已知问题 -* 视频下载不稳定(如有解决方案欢迎PR) +* 视频下载不稳定,视频可能不全(如有解决方案欢迎PR) +* 只能开小号导出自己朋友圈(如有解决方案欢迎PR) * HTML页面比较原始 -* 音乐等朋友圈格式不支持 * 自动浏览朋友圈的功能不稳定(如有解决方案欢迎PR) ## 3. 常见问题与解决方法 +问:怎么导出自己朋友圈 +- 近期的朋友圈可以浏览全部朋友,然后导出好友列表选自己 +- 需要导出长期的话,请开个小号然后使用搜一搜,详见[电脑微信浏览朋友圈](/doc/manual_guide.md) + 问:为什么导出的数据不全? - 答:软件只能导出在电脑微信**浏览过**的朋友圈记录,未浏览过的无法导出。 diff --git a/entity/moment_msg.py b/entity/moment_msg.py index 3022013..4d0960e 100644 --- a/entity/moment_msg.py +++ b/entity/moment_msg.py @@ -39,6 +39,8 @@ class Media: thumb: Optional[Thumb] = None thumbUrl: Optional[str] = None videoDuration: Optional[str] = None + title: Optional[str] = None + description: Optional[str] = None @dataclass_json @dataclass @@ -61,6 +63,7 @@ class ContentObject: contentStyle: int contentUrl: Optional[str] = "" title: Optional[str] = "" + description: Optional[str] = "" mediaList: Optional[MediaList] = None # 视频号消息 finderFeed: Optional[FinderFeed] = None diff --git a/exporter/html_exporter.py b/exporter/html_exporter.py index daed5d5..64b9c79 100644 --- a/exporter/html_exporter.py +++ b/exporter/html_exporter.py @@ -3,6 +3,7 @@ import json import shutil import threading import time +from typing import Tuple import xmltodict @@ -38,6 +39,31 @@ def get_img_css(size: int) -> str: return f'width:5rem;height:5rem;float:left;margin-bottom:0.2rem;margin-right:0.2rem;{img_style}' +def is_music_msg(msg: MomentMsg) -> bool: + """判断一个msg是否为音乐分享 + """ + if msg.timelineObject.ContentObject and msg.timelineObject.ContentObject.mediaList and msg.timelineObject.ContentObject.mediaList.media: + media = msg.timelineObject.ContentObject.mediaList.media[0] + if media.type == '5': + return True + return False + + +def get_music_info(msg: MomentMsg) -> Tuple[str, str, str]: + """获取音乐标题,演唱者,音乐源 + """ + title = "" + musician = "" + src = "" + if msg.timelineObject.ContentObject and msg.timelineObject.ContentObject.mediaList and msg.timelineObject.ContentObject.mediaList.media: + media = msg.timelineObject.ContentObject.mediaList.media[0] + title = media.title + musician = media.description + if media.url: + src = media.url.text + return title, musician, src + + class HtmlExporter(threading.Thread): def __init__(self, gui: 'Gui', dir_name: str, contacts_map: dict[str, Contact], begin_date: datetime.date, @@ -85,12 +111,12 @@ class HtmlExporter(threading.Thread): self.file.write(self.html_head) # 加一天 end_date = self.end_date + datetime.timedelta(days=1) - begin_time = time.mktime(datetime.datetime(self.begin_date.year, self.begin_date.month, self.begin_date.day).timetuple()) + begin_time = time.mktime( + datetime.datetime(self.begin_date.year, self.begin_date.month, self.begin_date.day).timetuple()) end_time = time.mktime(datetime.datetime(end_date.year, end_date.month, end_date.day).timetuple()) self.gui.video_decrypter.decrypt_videos(self, self.begin_date, end_date, self.dir_name, self.convert_video) - message_datas = sns_db.get_messages_in_time(begin_time, end_time) for index, message_data in enumerate(message_datas): if not self.stop_flag: @@ -157,6 +183,26 @@ class HtmlExporter(threading.Thread): html += f'