feat: NEXT Store 2.0 重大更新 - 完整重构前后端
🎉 主要更新:
后端:
- 全新华为应用市场爬虫系统
- 三表分离数据库设计 (app_info, app_metrics, app_rating)
- 完整的API接口 (搜索、分类、热门、上新等)
- 元服务自动识别和分类
- 智能Token管理和数据处理
- 修复热门应用重复显示问题
前端:
- 全新首页设计 (今日上架、热门应用)
- 应用页面 (彩色分类磁贴、智能图标匹配)
- 今日上新页面 (日期切换)
- 热门应用页面 (卡片布局)
- 应用详情页面 (完整信息展示)
- Apple风格搜索栏
- Footer组件
- 底部导航栏优化 (4个导航项)
- 骨架屏加载效果
- FontAwesome图标集成
UI/UX:
- 统一浅色背景 (#F5F5F7)
- 流畅的过渡动画
- 响应式设计
- 毛玻璃效果
文档:
- CHANGELOG.md - 完整更新日志
- QUICKSTART.md - 快速开始
- 多个技术文档和使用指南
版本: v2.0.0
This commit is contained in:
50
backend/app/crawler/token_manager.py
Normal file
50
backend/app/crawler/token_manager.py
Normal file
@@ -0,0 +1,50 @@
|
||||
import asyncio
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict
|
||||
from playwright.async_api import async_playwright
|
||||
|
||||
class TokenManager:
|
||||
def __init__(self):
|
||||
self.tokens: Dict[str, str] = {}
|
||||
self.token_expires_at: datetime = datetime.now()
|
||||
self.lock = asyncio.Lock()
|
||||
|
||||
async def get_token(self) -> Dict[str, str]:
|
||||
"""获取有效的token"""
|
||||
async with self.lock:
|
||||
if datetime.now() >= self.token_expires_at or not self.tokens:
|
||||
await self._refresh_token()
|
||||
return self.tokens
|
||||
|
||||
async def _refresh_token(self):
|
||||
"""刷新token"""
|
||||
print("正在刷新token...")
|
||||
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
page = await browser.new_page()
|
||||
|
||||
# 拦截请求获取token
|
||||
tokens = {}
|
||||
|
||||
async def handle_request(request):
|
||||
headers = request.headers
|
||||
if 'interface-code' in headers:
|
||||
tokens['interface_code'] = headers['interface-code']
|
||||
tokens['identity_id'] = headers['identity-id']
|
||||
|
||||
page.on('request', handle_request)
|
||||
|
||||
# 访问华为应用市场
|
||||
await page.goto('https://appgallery.huawei.com/', wait_until='networkidle')
|
||||
await page.wait_for_timeout(3000)
|
||||
|
||||
await browser.close()
|
||||
|
||||
if tokens:
|
||||
self.tokens = tokens
|
||||
# token有效期设为10分钟
|
||||
self.token_expires_at = datetime.now() + timedelta(minutes=10)
|
||||
print(f"Token刷新成功,有效期至: {self.token_expires_at}")
|
||||
else:
|
||||
raise Exception("无法获取token")
|
||||
Reference in New Issue
Block a user