2024-03-28 23:04:06 +08:00
|
|
|
|
import json
|
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
from typing import Optional, List
|
|
|
|
|
from datetime import datetime, timezone, timedelta
|
|
|
|
|
|
|
|
|
|
import xmltodict
|
|
|
|
|
from dataclasses_json import dataclass_json, config
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class Location:
|
|
|
|
|
poiName: str = field(metadata=config(field_name="@poiName"), default="")
|
|
|
|
|
longitude: str = field(metadata=config(field_name="@longitude"), default="")
|
|
|
|
|
latitude: str = field(metadata=config(field_name="@latitude"), default="")
|
|
|
|
|
country: str = field(metadata=config(field_name="@country"), default="")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class Url:
|
|
|
|
|
type: str = field(metadata=config(field_name="@type"))
|
|
|
|
|
text: str = field(metadata=config(field_name="#text"), default="")
|
|
|
|
|
md5: str = field(metadata=config(field_name="@md5"), default="")
|
2024-06-08 18:09:36 +08:00
|
|
|
|
token: str = field(metadata=config(field_name="@token"), default="")
|
|
|
|
|
enc_idx: str = field(metadata=config(field_name="@enc_idx"), default="")
|
2024-03-28 23:04:06 +08:00
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class Thumb:
|
|
|
|
|
type: str = field(metadata=config(field_name="@type"))
|
|
|
|
|
text: str = field(metadata=config(field_name="#text"))
|
2024-06-08 18:09:36 +08:00
|
|
|
|
token: str = field(metadata=config(field_name="@token"), default="")
|
|
|
|
|
enc_idx: str = field(metadata=config(field_name="@enc_idx"), default="")
|
2024-03-28 23:04:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class Media:
|
|
|
|
|
type: Optional[str] = None
|
|
|
|
|
id: Optional[str] = None
|
|
|
|
|
url: Optional[Url] | str = None
|
|
|
|
|
thumb: Optional[Thumb] = None
|
|
|
|
|
thumbUrl: Optional[str] = None
|
|
|
|
|
videoDuration: Optional[str] = None
|
2024-04-16 21:48:35 +08:00
|
|
|
|
title: Optional[str] = None
|
|
|
|
|
description: Optional[str] = None
|
2024-03-28 23:04:06 +08:00
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class MediaList:
|
|
|
|
|
media: list[Media]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class FinderFeed:
|
|
|
|
|
feedType: Optional[str] = ""
|
|
|
|
|
nickname: Optional[str] = ""
|
|
|
|
|
desc: Optional[str] = ""
|
|
|
|
|
mediaList: Optional[MediaList] = None
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class ContentObject:
|
|
|
|
|
contentStyle: int
|
|
|
|
|
contentUrl: Optional[str] = ""
|
|
|
|
|
title: Optional[str] = ""
|
2024-04-16 21:48:35 +08:00
|
|
|
|
description: Optional[str] = ""
|
2024-03-28 23:04:06 +08:00
|
|
|
|
mediaList: Optional[MediaList] = None
|
|
|
|
|
# 视频号消息
|
|
|
|
|
finderFeed: Optional[FinderFeed] = None
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class TimelineObject:
|
|
|
|
|
username: str
|
|
|
|
|
location: Location
|
|
|
|
|
ContentObject: ContentObject
|
|
|
|
|
createTime: int
|
|
|
|
|
contentDesc: Optional[str] = ""
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def create_date(self):
|
|
|
|
|
dt = datetime.fromtimestamp(self.createTime, timezone.utc)
|
|
|
|
|
# 转换为北京时间(UTC+8)
|
|
|
|
|
beijing_timezone = timezone(timedelta(hours=8))
|
|
|
|
|
date = dt.astimezone(beijing_timezone).date()
|
|
|
|
|
return date
|
|
|
|
|
@property
|
|
|
|
|
def create_time(self)->str:
|
|
|
|
|
dt = datetime.fromtimestamp(self.createTime, timezone.utc)
|
|
|
|
|
# 转换为北京时间(UTC+8)
|
|
|
|
|
beijing_timezone = timezone(timedelta(hours=8))
|
|
|
|
|
time_formatted = dt.astimezone(beijing_timezone).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
return time_formatted
|
2024-06-08 18:09:36 +08:00
|
|
|
|
@property
|
|
|
|
|
def create_year_month(self)->str:
|
|
|
|
|
dt = datetime.fromtimestamp(self.createTime, timezone.utc)
|
|
|
|
|
# 转换为北京时间(UTC+8)
|
|
|
|
|
beijing_timezone = timezone(timedelta(hours=8))
|
|
|
|
|
time_formatted = dt.astimezone(beijing_timezone).strftime('%Y-%m')
|
|
|
|
|
return time_formatted
|
2024-03-28 23:04:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass_json
|
|
|
|
|
@dataclass
|
|
|
|
|
class MomentMsg:
|
|
|
|
|
timelineObject: TimelineObject = field(metadata=config(field_name="TimelineObject"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test():
|
|
|
|
|
|
|
|
|
|
xml = """
|
|
|
|
|
"""
|
|
|
|
|
msg_dict = xmltodict.parse(xml.replace(chr(10), '').replace(chr(9), ''), force_list={'media'})
|
|
|
|
|
msg_json = json.dumps(msg_dict, sort_keys=False, indent=2)
|
|
|
|
|
momentMsg = MomentMsg.from_json(msg_json)
|
|
|
|
|
print(momentMsg)
|
|
|
|
|
|
|
|
|
|
def test_time_convert():
|
|
|
|
|
time = 1706592456
|
|
|
|
|
dt = datetime.fromtimestamp(time, timezone.utc)
|
|
|
|
|
# 转换为北京时间(UTC+8)
|
|
|
|
|
beijing_timezone = timezone(timedelta(hours=8))
|
|
|
|
|
beijing_time = dt.astimezone(beijing_timezone).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
print(beijing_time)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
test()
|