33从 Microsoft Rewards Dashboard 抓取积分信息
44"""
55
6+ import asyncio
67import logging
78import re
89
910from playwright .async_api import Page
1011
12+ from api .dashboard_client import DashboardClient , DashboardError
1113from constants import REWARDS_URLS
1214
1315logger = logging .getLogger (__name__ )
@@ -90,6 +92,22 @@ async def get_current_points(self, page: Page, skip_navigation: bool = False) ->
9092 logger .debug ("跳过导航,使用当前页面" )
9193 await page .wait_for_timeout (1000 )
9294
95+ # 优先使用 Dashboard API
96+ try :
97+ logger .debug ("尝试使用 Dashboard API 获取积分..." )
98+ async with DashboardClient (page ) as client :
99+ api_points : int | None = await asyncio .wait_for (
100+ client .get_current_points (), timeout = 35.0
101+ )
102+ if api_points is not None and api_points >= 0 :
103+ logger .info ("✓ 从 API 获取积分成功" )
104+ return int (api_points )
105+ except asyncio .TimeoutError :
106+ logger .warning ("Dashboard API 超时,使用 HTML 解析作为备用" )
107+ except DashboardError as e :
108+ logger .warning (f"Dashboard API 失败: { e } ,使用 HTML 解析作为备用" )
109+
110+ # 备用:HTML 解析
93111 logger .debug ("尝试从页面源码提取积分..." )
94112 points = await self ._extract_points_from_source (page )
95113
@@ -107,13 +125,14 @@ async def get_current_points(self, page: Page, skip_navigation: bool = False) ->
107125 points_text = await element .text_content ()
108126 logger .debug (f"找到积分文本: { points_text } " )
109127
110- points = self ._parse_points (points_text )
128+ if points_text .strip ():
129+ points = self ._parse_points (points_text .strip ())
111130
112- if points is not None and points >= 100 :
113- logger .info (f "✓ 当前积分: { points :, } " )
114- return points
115- elif points is not None :
116- logger .debug (f"积分值太小,可能是误识别: { points } " )
131+ if points is not None and points >= 100 :
132+ logger .info ("✓ 当前积分获取成功 " )
133+ return points
134+ elif points is not None :
135+ logger .debug (f"积分值太小,可能是误识别: { points } " )
117136
118137 except Exception as e :
119138 logger .debug (f"选择器 { selector } 失败: { e } " )
@@ -310,7 +329,12 @@ async def _check_task_status(self, page: Page, selectors: list, task_name: str)
310329 Returns:
311330 任务状态字典
312331 """
313- status = {"found" : False , "completed" : False , "progress" : None , "max_progress" : None }
332+ status : dict [str , bool | int | None ] = {
333+ "found" : False ,
334+ "completed" : False ,
335+ "progress" : None ,
336+ "max_progress" : None ,
337+ }
314338
315339 try :
316340 for selector in selectors :
@@ -338,10 +362,12 @@ async def _check_task_status(self, page: Page, selectors: list, task_name: str)
338362 # 查找类似 "15/30" 的进度
339363 progress_match = re .search (r"(\d+)\s*/\s*(\d+)" , text )
340364 if progress_match :
341- status ["progress" ] = int (progress_match .group (1 ))
342- status ["max_progress" ] = int (progress_match .group (2 ))
365+ progress_val = int (progress_match .group (1 ))
366+ max_progress_val = int (progress_match .group (2 ))
367+ status ["progress" ] = progress_val
368+ status ["max_progress" ] = max_progress_val
343369
344- if status [ "progress" ] >= status [ "max_progress" ] :
370+ if progress_val >= max_progress_val :
345371 status ["completed" ] = True
346372
347373 logger .debug (f"{ task_name } 状态: { status } " )
0 commit comments