From 9ed39d0c0294c1af5aa4c101d7223b33f5be315a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Tue, 10 Dec 2024 22:19:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=90=8E=E7=AB=AF=E4=B9=9F?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=20umami=20=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/analytics.py | 117 ++++++++++++++++++++++++++--------------- xiaomusic/xiaomusic.py | 2 +- 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/xiaomusic/analytics.py b/xiaomusic/analytics.py index 3767890..f0ae961 100644 --- a/xiaomusic/analytics.py +++ b/xiaomusic/analytics.py @@ -1,16 +1,19 @@ import asyncio +import platform from datetime import datetime +import aiohttp from ga4mp import GtagMP from xiaomusic import __version__ class Analytics: - def __init__(self, log): + def __init__(self, log, config): self.gtag = None self.current_date = None self.log = log + self.config = config self.init() def init(self): @@ -27,6 +30,35 @@ class Analytics: self.gtag = gtag self.log.info("analytics init ok") + async def send_startup_event(self): + event = self.gtag.create_new_event(name="startup") + event.set_event_param(name="version", value=__version__) + await self._send(event) + + async def send_daily_event(self): + current_date = datetime.now().strftime("%Y-%m-%d") + if self.current_date == current_date: + return + + event = self.gtag.create_new_event(name="daily_active_user") + event.set_event_param(name="version", value=__version__) + event.set_event_param(name="date", value=current_date) + await self._send(event) + self.current_date = current_date + + async def send_play_event(self, name, sec, hardware): + event = self.gtag.create_new_event(name="play") + event.set_event_param(name="version", value=__version__) + event.set_event_param(name="music", value=name) + event.set_event_param(name="sec", value=sec) + event.set_event_param(name="hardware", value=hardware) + await self._send(event) + + async def _send(self, event): + await self.post_to_umami(event) + events = [event] + await self.run_with_cancel(self.gtag.send, events) + async def run_with_cancel(self, func, *args, **kwargs): try: asyncio.ensure_future(asyncio.to_thread(func, *args, **kwargs)) @@ -35,50 +67,49 @@ class Analytics: self.log.warning(f"analytics run_with_cancel failed {e}") return None - async def send_startup_event(self): - try: - await self.run_with_cancel(self._send_startup_event) - except Exception as e: - self.log.warning(f"analytics send_startup_event failed {e}") - self.init() + async def post_to_umami(self, event): + url = "https://umami.hanxi.cc/api/send" + user_agent = self._get_user_agent() + event.set_event_param(name="useragent", value=user_agent) + data = { + "payload": { + "hostname": self.config.hostname, + "language": "zh-CN", + "referrer": "", + "screen": "430x932", + "title": "后端统计", + "url": "/backend", + "website": "7bfb0890-4115-4260-8892-b391513e7e99", + "name": event.get_event_name(), + "data": event.get_event_params(), + }, + "type": "event", + } - def _send_startup_event(self): - event = self.gtag.create_new_event(name="startup") - event.set_event_param(name="version", value=__version__) - event_list = [event] - self.gtag.send(events=event_list) + async with aiohttp.ClientSession() as session: + headers = { + "User-Agent": user_agent, + } + # self.log.info(f"headers {headers}, {data}") + async with session.post(url, json=data, headers=headers) as response: + self.log.info(f"umami Status: {response.status}") + await response.text() - async def send_daily_event(self): - try: - await self.run_with_cancel(self._send_daily_event) - except Exception as e: - self.log.warning(f"analytics send_daily_event failed {e}") - self.init() + def _get_user_agent(self): + # 获取系统信息 + os_name = platform.system() # 操作系统名称,如 'Windows', 'Linux', 'Darwin' + os_version = platform.version() # 操作系统版本号 + architecture = platform.architecture()[0] # '32bit' or '64bit' + machine = platform.machine() # 机器类型,如 'x86_64', 'arm64' - def _send_daily_event(self): - current_date = datetime.now().strftime("%Y-%m-%d") - if self.current_date == current_date: - return + # 获取 Python 版本信息 + python_version = platform.python_version() # Python 版本 - event = self.gtag.create_new_event(name="daily_active_user") - event.set_event_param(name="version", value=__version__) - event.set_event_param(name="date", value=current_date) - event_list = [event] - self.gtag.send(events=event_list) - self.current_date = current_date + # 组合 User-Agent 字符串 + user_agent = ( + f"XiaoMusic/{__version__} " + f"({os_name} {os_version}; {architecture}; {machine}) " + f"Python/{python_version}" + ) - async def send_play_event(self, name, sec, hardware): - try: - await self.run_with_cancel(self._send_play_event, name, sec, hardware) - except Exception as e: - self.log.warning(f"analytics send_play_event failed {e}") - self.init() - - def _send_play_event(self, name, sec, hardware): - event = self.gtag.create_new_event(name="play") - event.set_event_param(name="version", value=__version__) - event.set_event_param(name="music", value=name) - event.set_event_param(name="sec", value=sec) - event.set_event_param(name="hardware", value=hardware) - event_list = [event] - self.gtag.send(events=event_list) + return user_agent diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 5713430..ecf026f 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -103,7 +103,7 @@ class XiaoMusic: self.update_devices() # 启动统计 - self.analytics = Analytics(self.log) + self.analytics = Analytics(self.log, self.config) debug_config = deepcopy_data_no_sensitive_info(self.config) self.log.info(f"Startup OK. {debug_config}")